Хитрости SSH (перевод статьи "SSH Tricks")

Содержание

Ниже представлен мой перевод замечательной статьи SSH Tricks, оригинал которой расположен по адресу: http://polishlinux.org/apps/ssh-tricks/. Публикуется с согласия автора оригинальной статьи.

SSH (secure shell) – это программа, позволяющая получить защищённый доступ к удалённым файловым системам Wikipedia дано более точное определение, прим.пер.]. Не все знают, что SSH обладает рядом дополнительных мощных возможностей, таких как вход без запроса пароля, автоматическое выполнение команд в удалённой системе и даже монтирование удалённых папок. В этой статье мы рассмотрим эти, а также некоторые другие возможности SSH.

SSH работает по принципу клиент-сервер. Это значит, что на сервере, к которому мы хотим подключиться, должен быть запущен демон SSH. В современных дистрибутивах Linux сервер SSH, как правило, установлен по умолчанию. Сервер запускается командой типа /etc/init.d/ssh start. По умолчанию он ожидает соединений на порту 22, так что если вы используете фаервол, убедитесь, что этот порт открыт. После установки и запуска SSH сервера мы можем удалённо подключиться к нему. Чтобы войти пользователем user1 на сервер remote_server (который указывается через доменное имя или IP адрес) нужно воспользоваться следующей простой командой:

ssh user1@remote_server

После ввода пароля для доступа к удалённой машине, появится изменённое приглашение для ввода команд, которое выглядит следующим образом:

user1@remote_server:~$

Это означает что мы успешно произвели вход и сейчас работаем в окружении удалённого сервера. Теперь каждая команда будет выполняться на удалённом сервере, с привилегиями того пользователя, под которым мы вошли (в данном случае user1).

SCP – защищённое копирование файлов

SCP является составной частью пакета OpenSSH. Эта команда позволяет копировать файлы или папки с удалённого сервера (или на него), используя для этого протокол SSH. Благодаря использованию SSH, SCP является отличной заменой для небезопасного протокола FTP, которой широко используется в Интернете. Не все знают, что в FTP пароли передаются по сети в виде открытого текста, а это значит, что злоумышленники могут с лёгкостью перехватить их. Так что SCP это намного более надёжная альтернатива. Простейший пример использования SCP выглядит так:

scp file.txt user1@remote_server:~/

При этом локальный файл file.txt будет скопирован на удалённый сервер и помещён в домашний каталог пользователя user1. Вместо ~/ можно использовать другой путь, например /tmp, /home/public или любую другую папку, в которой пользователь user1 имеет права на запись.

Чтобы скопировать файл с удалённого сервера на локальный компьютер, используется другой синтаксис SCP:

scp user1@remote_server:~/file.txt .

При этом файл file.txt, расположенный в домашнем каталоге пользователя user1 в удалённой системе, будет скопирован в локальную папку (в которой мы сейчас находимся).

Стоит обратить внимание на следующие параметры SCP:

-r – рекурсивное копирование папок (включая подкаталоги)

-P port – использовать нестандартный порт (по умолчанию 22) – этот параметр следует использовать если сервер ожидает соединений на нестандартном порту. Этот параметр может быть полезен при соединении из сети, защищённой фаерволом. Запуск SSH сервера на порту 443 (используемом для защищённых HTTP соединений) это лучший способ обойти ограничения, установленные сетевым администратором.

Графические интерфейсы для SCP

Если вам не нравится работать с консолью, то вы можете использовать графический (или псевдографический) клиент SCP. Midnight Commander — одна из программ, обладающей функциями SCP клиента (Меню → Правая панель/Левая панель → Shell-соединение). Nautilus и Konqueror также поддерживают SCP. Для подключения к удалённой системе в адресной строке надо ввести ssh://user1@remote_server:~/. При этом файлы могут копироваться как если бы они были расположены локально. В среде MS Windows есть отличное приложение WinSCP. Его интерфейс очень похож на Total Commander. Кстати, существует плагин для Total Commander, позволяющий выполнять SCP подключения.

SSH без паролей – генерация ключей

Необходимость ввода пароля при каждом SSH соединении может сильно раздражать. С другой стороны, незащищённое удалённое соединение это огромный риск с точки зрения безопасности. Решением этой проблемы является авторизация с помощью пары из открытого (public) и секретного (private) ключей.

Пара ключей обычно генерируется с помощью команды ssh-keygen. Ниже показан результат выполнения такой команды. Возможно использование ключей RSA или DSA.

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key
(/home/user1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in
/home/user1/.ssh/id_rsa.
Your public key has been saved in
/home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

Когда программа просит указать пароль для ключа, нужно просто нажать ENTER. При этом будет создан ключ без пароля. Имейте в виду, что это представляет угрозу безопасности, так как это понижает безопасность удалённой системы до уровня безопасности вашей локальной системы [злоумышленник, получивший доступ к секретному ключу, хранящемуся в вашей локальной системе, может воспользоваться им для доступа к удалённой системе - прим. пер.]. Поэтому делайте это на свой страх и риск. Когда ssh-keygen закончит свою работу, вы увидите, что были сгенерированы два ключа. Секретный ключ находится в /home/user1/.ssh/id_rsa. Его нельзя делать общедоступным ни при каких обстоятельствах. Второй ключ (открытый) находится в /home/user1/.ssh/id_rsa.pub, к нему можно предоставить публичный доступ.

Теперь, если мы хотим получить доступ к удалённой системе с нашего локального компьютера без запроса пароля (используя только эти два ключа), мы должны добавить информацию о нашем открытом ключе в файл authorized_keys, расположенный в папке ~/.ssh в удалённой системе. Для этого можно воспользоваться следующими командами:

$ scp /home/user1/.ssh/id_rsa.pub \
user1@remote_server:~/
$ ssh user1@remote_server
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

Обратите внимание, что третья команда выполняется на удалённом сервере. После этой процедуры все действия, выполняемые на удалённом сервере через SSH не будут требовать ввода пароля. Это позволит существенно упростить нашу работу с удалённым сервером.

Если вам нужен беспарольный доступ с удалённого сервера на локальный, аналогичная процедура должна быть проведена с удалённого сервера. Авторизация с использованием ключей это односторонний процесс. Секретный ключ может авторизовать публичный, но не наоборот.

Обновлено: если вы столкнулись с проблемами при использовании доступа по ключу, то вам может помочь статья Debugging SSH public key authentication problems

Выполнение команд в удалённой системе

Теперь, когда мы можем войти в удалённую системы без пароля, почему бы не выполнить несколько удалённых команд? В некоторых случаях это может быть полезно, например, когда нам нужно выполнять некоторую команду ежедневно. Раньше мы не могли автоматизировать этот процесс, так как требовался ручной ввод пароля (или указание его в виде простого текста, что является небезопасным).

Один из интересных способов применения беспарольного входа это «удалённое оповещение». Допустим, что на удалённом сервере работает очень важный процесс, например веб-сервер Apache. Мы хотим получить уведомление, когда система начинает испытывать нехватку ресурсов (жёсткий диск переполнен или нагрузка на систему слишком высока). В этом случае мы можем отправить уведомление по электронной почте. Но помимо этого, мы можем выполнить удалённую команду, которая воспроизведёт звуковой сигнал в нашей локальной системе. Для этого можно воспользоваться, например, такой командой:

ssh user1@local_server 'play \
/usr/share/sounds/gaim/arrive.wav'

Эта команда, выполненная скриптом на удалённом сервере, произведёт беспарольный вход пользователем user1 на local_server (на котором мы обычно работаем) и воспроизведёт файл с помощью команды play (которая обычна доступна в Linux).

Перенаправление сеанса X11 (X forwarding) – удалённый запуск графических приложений

Одной из наименее известных функций SSH является перенаправление протокола X. Это позволяет запускать практически любое X приложение удалённо! Для этого всего лишь нужно добавить параметр -X при соединении с удалённым сервером:

ssh -X user1@remote_server

После этого изображения всех запущенных X приложений будут перенаправлены на ваш локальный X сервер. В файле /etc/ssh/ssh_config можно включить постоянное использование перенаправления X11 (указав ForwardX11 yes). Разумеется, чтобы этот параметр сработал, удалённый SSH сервер должен также поддерживать перенаправление X11. Настроить это можно отредактировав файл /etc/ssh/sshd_config. Однако в большинстве дистрибутивов Linux необходимые настройки уже выполнены по умолчанию.

Следующий пример показывает запуск одиночной команды с X перенаправлением:

ssh -X user1@remote_server 'psi'

При этом на удалённом сервере будет запущена программа PSI, а её изображение будет направлено на локальный экран.

Разумеется, скорость приложений, выполняемых удалённо, будет зависеть в первую очередь от скорости сетевого соединения. В локальной сети они будут работать практически без задержек (даже такие вещи как Totem, воспроизводящий фильм DivX). В случае интернет соединения, DSL линии будет достаточно, чтобы приложения типа Skype или Thunderbird работали без особых проблем.

SSHFS – монтирование удалённой папки

Работать с файлами, расположенными на удалённом сервере, через SSH может быть неудобно, особенно если приходится часто копировать различные файлы в обоих направлениях. Использование протокола fish:// в Midnight Commander или Konqueror является частичным решением, но fish работает медленнее SSH и часто тормозит при копировании файлов. Идеальным решением было бы смонтировать удалённый ресурс, и работать с ним через SSH. И такая возможность есть, благодаря sshfs и проекту fuse.

Fuse это модуль ядра (недавно он был принят в официальную ветку 2.6), позволяющий непривилегированным пользователям монтировать различные файловые системы. SSHFS это программа, созданная самим автором fuse, которая позволяет монтировать удалённые папки или файловые системы, используя SSH. Суть проста – удалённая папка монтируются в папку локальной файловой системы. После этого все операции над этой папкой производятся как если бы это была обычная локальная папка, с той только разницей, что файлы перемещаются через SSH в фоновом режиме.

Установить fuse и sshfs в Ubuntu [и Debian - прим. пер.] очень просто:

apt-get install sshfs

После этого остаётся только добавить пользователя, которому мы хотим предоставить право на монтирование файловых систем через SSH, в группу fuse (используя команду usermod -G -a fuse user1 [или adduser user1 fuse, что проще - прим. пер.] или вручную отредактировав файл /etc/group). Также необходимо, чтобы был загружен модуль fuse:

modprobe fuse

После этого, мы можем смонтировать удалённую папку с помощью sshfs:

mkdir ~/remote_folder
sshfs user1@remote_server:/tmp ~/remote_folder

Указанная выше команда смонтирует папку /tmp, расположенную на удалённом сервере, в папку ~/remote_folder на локальной машине. Копирование любых файлов в эту папку будет производится по сети с использованием SCP. Редактирование, создание и удаление файлов будет производится таким же образом.

По окончании работы с удалённой системы мы можем отмонтировать её:

fusermount -u ~/remote_folder

Если мы постоянно работаем с этой папкой, то можно добавить её в таблицу /etc/fstab. При этом она будет автоматически монтироваться при загрузки системы, либо можно будет монтировать её вручную (при использовании параметра noauto) без необходимости каждый раз указывать адрес удалённой папки. Пример записи в /etc/fstab:

sshfs#user1@remote_server:/tmp \
/home/user1/remote_folder/ fuse    defaults,auto    0 0

Если мы планируем использовать fuse и sshfs регулярно, то нужно добавить fuse в файл /etc/modules. Иначе придётся каждый раз загружать модуль fuse вручную.

Заключение

Как видите, SSH это мощный инструмент для удалённого доступа. Если вам приходится часто работать с удалёнными UNIX системами, то вам стоит освоить его функции и использовать их на практике. Умение работать с SSH помогает сделать ежедневную работу более эффективной и приятной.

Автор данной статьи попросил меня сделать следующую пометку:

This text is a translation of article SSH Tricks by Borys Musielak published on GNU/Linux vortal PolishLinux.org.

Комментарии

Импортированы из оригинального блога.

  • evgen #

    спасибо.
    <br/>меня мучает еще один вопрос, как например запустить гуёвое приложение на удаленной машине без перенаправления графики на локальную. (хм... я понятно выразился?)

  • ADF #

    Для запуска графического приложения необходим сеанс X. Предположим, что в вашем случае сеанс X запущен на удалённом сервере, а вы хотите удалённо зайти на этот сервер через SSH и запустить графическое приложение, которое этот самый сеанс будет использовать.
    Я думаю надо сделать так: когда вошли через SSH надо установить переменную окружения DISPLAY, чтобы она указывала на имеющийся сеанс X. После этого запускайте нужное приложение.

  • GQ #

    Это не будет работать, если на удаленной машине отсутствуют куки локального дисплея (а это скорее всего так и есть).
    Правильный способ: ключик -X у ssh. (если sshd позволяет X11 forwarding)

  • Attid #

    работает но не закрывает сессию ссх
    напрмер я хотю скриптом запусть калькулятор на всех машинах

    ssh mashine1 "DISPLAY=:0.0 xcalc"
    ssh mashine2 "DISPLAY=:0.0 xcalc"
    ssh mashine3 "DISPLAY=:0.0 xcalc"

    запустится только на первой машине, и скрипт будет висет пока не закроется приложение на первой или не нажмешь Ctrl+C в консоле с скриптом, тогда перейдет на вторую =(
    что с этим можно поделать ?

  • Аноним #

    ssh mashine1 "DISPLAY=:0.0 xcalc" &
    ssh mashine2 "DISPLAY=:0.0 xcalc" &
    ssh mashine3 "DISPLAY=:0.0 xcalc" &

  • evgen #

    никуда, оставаться на удаленной машине.
    например: нужно мне на удаленной машине запустить какую-то тулзу графическую, пусть это будет evolution, мне не нужно его видеть и управлять им тоже не нужно, а закрыть его всегда можно - kill -9 ;).
    конечно можно перенаправить и графику, и ждать с полчаса, если не больше, пока оно мне сюда перешлется на скорости 32килобита.

  • ADF #

    Тот комментарий, на который вы ответили, я удалил, пока вы писали ответ :) А по существу - смотрите выше.

  • Аноним #

    Очень хорошая статья.Спасибо большое!

  • Andrey Nikitin #

    В качестве клиента SSH под Win32 можно использовать PuTTY с GUI-интерфейсом:

    http://ru.wikipedia.org/wiki/PuTTY

  • Mad Cat #

    Кроме PuTTY есть еще необычный японский SSH-клиент для под названием Poderosa. Сделан под .Net.

  • va1e #

    Отличный перевод, спасибо ;)

  • Vadim #

    Копировать файлы можно и без установки sshfs, при помощи pipe. Например копирование публичного ключа вместо приведенного примера:
    $ scp /home/user1/.ssh/id_rsa.pub

    user1@remote_server:~/
    $ ssh user1@remote_server
    $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

    можно сделать одной строкой:
    $ cat /home/user1/.ssh/id_rsa.pub | ssh user1@remote_server 'cat >> /home/user1/.ssh/authorized_keys'

  • jetxee #

    Спасибо за работу по переводу хорошей и полезной статьи! Добавил в избранное, del.icio.us и на RUmarkz.

  • Basil Shubin #

    Отличная статья!

  • Дмитрий Федосеев #

    Замечание по статье (не по переводу): изложенное вряд ли стоит называть "хитростями", это достаточно типовое использование ssh.

    К "хитростям" я бы отнес создание PPP туннеля через SSH

  • Michael Shigorin #

    Спасибо за перевод; можно добавить его сюда?

    Добавления к статье и комментариям касательно графических приложений:

    в новых openssh (4.6+ или около того) ssh -X обрезали -- некоторые "небезопасные" части X11 фильтруются; если всё сломалось, то есть ssh -Y со старым поведением.

    Для того, чтобы на вообще-то безиксовом сервере запускать ssh -X (например, "проходить" через него, если это гейтвей) -- должна быть установлена команда xauth (в модульном X.org 7.x это отдельный маленький пакет).

  • murrrk #

    А можно, наверное, глупый вопрос? Впервые столкнулась с необходимостью использования ssh. Логин мне присвоен по умолчанию, но он не устраивает. Подскажите, плиз, можно ли поменять его какой-нибудь командой, как, например, пароль passwd?
    Спасибо!

  • ADF #

    Логин - это имя пользователя в данной системе. Поменять его может только администратор этой системы.

  • murrrk #

    А для чего тогда команда set login? Простите уж за тупость...

  • ADF #

    Данная команда мне неизвестна.

  • zradeg #

    В статье упоминается scp-плагин для Total Commander'а. Подскажите пожалуйста, как он называется? А если поделитесь ссылкой, то благодарности моей вовсе не будет предела.
    Ищу этот плагин уже довольно длительное время и нашел пока только этот перевод =)

  • Denius #

    Вроде есть плагин plugin_sftp.wfx под Тотал. поищи его на официальном сайте Тотала.

  • andrey #

    Тут раньше много комментариев было. Уже привык к ним.

  • ADF #

    Технической возможности восстановить комментарии нет (точнее она есть, но не хочется тратить время). Но я могу добавить комментарии, которые были здесь раньше, непосредственно к тексту статьи, если в этом есть необходимость.

  • andrey #

    Копирование локального файла на сервер cat ~/id_rsa.pub | ssh user@server 'cat >> ~/.ssh/authorized_key'

  • andrey #

    cat ~/.ssh/id_rsa.pub | ssh user@server 'cat >> ~/.ssh/authorized_keys'

  • http://voooova.blogspot.com/ #

    Как создать пару ключей, если на удаленном сервере используется другое имя пользователя Локально vova@comp удаленно vladimir@server ?