headermask image
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Хитрости SSH

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 rsaGenerating 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 не будут требовать ввода пароля. Это позволит существенно упростить нашу работу с удалённым сервером.

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

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

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

Один из интересных способов применения безпарольного входа это «удалённое оповещение». Допустим, что на удалённом сервере работает очень важный процесс, например веб-сервер 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_foldersshfs 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 помогает сделать ежедневную работу более эффективной и приятной.

Автор перевода: Андрей Федосеев, оригинал перевода тут

4 комментов оставлено (Add 1 more)

  1. Более 8 часов потратил на поиски инфы в инете, что бы понять почему команда выполняется на моем пк, а не на удаленном. После прочтения данной статьи поставил кавычки и все заработало. )))) СПАСИБО

    1. Sulima on July 23rd, 2013 at 6:36 pm
  2. Спасибо, это наиболее полная статья которую я нашел в инете по SSH

    2. STEVER on August 4th, 2012 at 12:26 pm
  3. Забыл написать, под Linux тоже есть PuTTY сборочка.

    3. Flabius on September 15th, 2010 at 10:07 am
  4. Спасибо за статью, однако немного критики. Мне кажется гораздо удобней под Windows использовать PuTTY терминал (http://putty.me), нежели стандартную консоль.
    для новичков гораздо удобней, когда терминальная панель подсвечивается. Также можно создать поток сессий.
    А так статья на пятёрочку, спасибо.

    4. Flabius on September 15th, 2010 at 10:04 am