Вы находитесь на странице: 1из 21

20 трюков с SSH:

подборка советов и
интересных команд на
все случаи жизни

Евгений Зобнин, 1 час назад


Xakep #215

SSH — едва ли не самый распространенный


инструмент системного администратора. Каждый
день тысячи людей используют SSH для
подключения к серверам, домашним машинам,
роутерам и даже смартфонам. SSH-клиенты есть
для всех сколько-нибудь популярных платформ, а
сервер SSH встраивают даже в умные лампочки.
Но готов ли ты сказать, что на самом деле знаешь
обо всех возможностях SSH?

Свободная реализация протокола SSH, названная


OpenSSH, была выпущена разработчиками
OpenBSD еще в 1999 году. И сегодня это де-факто
стандарт безопасного и удобного подключения к
удаленной консоли. Спустя семнадцать лет
разработки в OpenSSH появилось огромное
количество возможностей, настроек и режимов
работы, о которых знают далеко не все
пользователи.

Эта статья — своего рода сборник быстрых


рецептов, который ты можешь заучить или
использовать как шпаргалку. Команды приведены
для Linux, но большинство из них будут работать и
в любой другой ОС, для которой есть сборка
OpenSSH. Удаленный юзер и хост в тексте всегда
обозначаются как user@host, а по отдельности как
<user> и <host>. Приятного чтения.

1. Запускай команды быстро


Чтобы выполнить всего одну удаленную команду,
совсем не обязательно подключаться к SSH,
вводить команду, а затем отключаться. Можно
сделать это сразу. Например, так можно
посмотреть заполненность ФС удаленной машины:

$ ssh user@host df -h

А так — перезагрузить ее:

$ ssh user@host sudo reboot

2. Составляй списки команд и


запускай их разом
Если у тебя есть целый список команд, которые
следует выполнить, их можно записать в файл и
скормить этот файл SSH:

$ ssh user@host "`cat file.txt`"

3. Редактируй удаленные
файлы локальным редактором
Чтобы отредактировать файл на удаленной
машине, не требуется заходить на нее и
использовать консольный редактор. На самом деле
файл можно открыть в твоем любимом текстовом
редакторе на локальной машине (gvim заменяем на
свой редактор):

$ gvim scp://user@host//путь/к/файлу

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

$ ssh user@host cat /путь/к/файлу | xclip

А так можно скопировать вывод команды:


$ ssh user@host uname -a | xclip

5. Сравнивай удаленный и
локальный файл без
копирования
Похожий прием можно использовать для
сравнения двух файлов:

$ ssh user@host cat /путь/к/удаленному


/файлу | diff /путь/к/локальному/файлу -

6. Работай с удаленными
файлами с помощью
локального файлового
менеджера
Не всегда удобно работать с большим количеством
файлов с помощью консольных команд или mc,
запущенного на удаленной машине. Но всегда
можно подключить любой каталог удаленной
машины как сетевой диск. Для этого достаточно
установить sshfs:
$ sudo apt-get install sshfs

Создать каталог для подключения «сетевого


диска»:

$ mkdir remote_files

И подключить его:

$ sshfs user@host:/home/user
~/remote_files/

Теперь все файлы удаленного каталога /home/user


будут видны в каталоге ~/remote_files/ и с ними
можно работать, как с обычными.

7. Используй tmux
Сложные действия на удаленной машине редко
ограничиваются одной консолью. Обычно мы
открываем сразу несколько SSH-соединений, в
которых запускаем различные команды, копируем
текст из одной в другую, одновременно следим за
выполнением нескольких операций. Однако
держать открытыми несколько сессий совсем не
обязательно, хватит и одной, в которой запущен
tmux.

Утилита tmux — еще одно детище команды


OpenBSD. Она позволяет запустить внутри одной
SSH-сессии неограниченное количество консолей,
с которыми можно работать одновременно, в том
числе сразу с несколькими на одном экране. Но
самое главное — tmux поддерживает функцию
detach/attach, позволяющую отключиться от
текущей сессии tmux, закрыть SSH-соединение,
подключиться к машине уже с другого компа и
возобновить сессию tmux со всеми открытыми
консолями и их содержимым.

Tmux в режиме разделения экрана


Tmux доступна в репозиториях почти всех
популярных дистрибутивов. Устанавливать и
запускать ее следует на удаленной машине, но
перед тем как начать использовать, придется
прочитать документацию (или шпаргалку).

8. Копируй ключи быстро


Хоть и копирование публичного ключа на
удаленный сервер — задача простая, но она
требует выполнения нескольких действий вручную.
Если тебя это напрягает, скопировать ключ можно
в автоматическом режиме:

$ ssh-copy-id user@host

При этом не обязательно копировать основной


ключ, с помощью флага -i можно указать любой
другой:

$ ssh-copy-id -i ~/my_key.pub user@host


Копируем ключ

9. Создай постоянное
соединение с машиной
Если в течение дня ты часто подключаешься к
одной машине, в том числе на несколько минут или
секунд (чтобы просто запустить одну команду,
например), есть смысл создать с ней постоянное
соединение. Твой комп будет держать соединение
открытым и использовать его для каждого
подключения к машине. Это намного быстрее и
экономичнее с точки зрения трафика и нагрузки на
процессор.

Добавь следующие строки в ~/.ssh/config:

Host host
ControlPath ~/.ssh/master-%r@%h:%p
ControlMaster no

А затем создай соединение:

$ ssh -MNf user@host


10. Используй специальную
версию SSH для неустойчивых
соединений
SSH не рассчитан на работу в условиях
неустойчивого интернет-соединения, поэтому не
умеет адекватно реагировать на потерю пакетов.
Фактически, если соединение оборвется, SSH
просто повиснет и будет находиться в таком
состоянии, пока не закончится тайм-аут. До тех
пор пока ты используешь надежное
оптоволоконное соединение, это не проблема, но
как только попадаешь в условия жесткой
российской глубинки, где даже 3G может быть
экзотикой, SSH превратится в невыносимо тупой
инструмент.

Решить проблему можно с помощью autossh. Это


обертка над SSH, которая умеет проверять
жизнеспособность канала. Autossh создает
дополнительное SSH-соединение с сервером и
непрерывно шлет по нему heartbeat-пакеты. Если
пакет не доходит до адресата, autossh считает
канал мертвым и перезапускает SSH-соединение.

Пользоваться очень просто:


$ sudo apt-get install autossh
$ autossh -M5000 user@host

По умолчанию тайм-аут между посылкой heartbeat-


пакетов составляет десять минут, что слишком
много. Для уменьшения тайм-аута пропиши его в
переменную AUTOSSH_POLL перед запуском
autossh (значение в секундах):

$ export AUTOSSH_POLL=10

Есть вариант еще лучше: mosh. Это специально


оптимизированная для неустойчивых и
низкоскоростных соединений версия SSH,
работающая по протоколу UDP. Mosh позволяет
получить быстрое и отзывчивое соединение даже
на очень медленном канале и из коробки умеет
поднимать упавшее соединение и даже
переключать клиента с одного IP на другой (при
переключении с Wi-Fi-соединения на мобильное,
например) без перезапуска сессии.

У mosh всего один недостаток: он требует


установки не только на локальную машину, но и на
удаленную. Зато после этого ничего настраивать
не нужно, достаточно использовать команду mosh
вместо ssh. Более того, mosh уже встроен в
SSH-клиенты JuiceSSH для Android и Blink для iOS.

11. Открывай порт SSH, только


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

Если ты подключаешься к серверу нечасто, второй


вариант практически идеален. Идея в том, что на
сервер устанавливается специальный демон,
который слушает указанные порты и в случае
соединения с этими портами в определенном
порядке откроет 22-й порт. Другой порядок
соединения будет закрывать порт.

Техника называется port knoking и реализуется с


помощью демона knockd. Установи демон на
сервер:
$ sudo apt-get install knockd

И настрой его, добавив в файл /etc/knockd.conf


следующие строки:

[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i
eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i
eth0 -s %IP% -p tcp --dport 22 -j ACCEPT
tcpflags = syn

Перезапусти демон:

$ sudo /etc/init.d/knockd restart

Теперь используй следующую команду для


подключения к серверу:

$ knock <host> 3000 4000 5000 && ssh


user@host && knock <host> 5000 4000 3000

Она будет открывать порт перед SSH-соединением


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

Стучимся в порты

12. Защитись от брутфорса


Установка fail2ban — второй метод защиты от
ботов, подбирающих пароли. Это демон, который
непрерывно мониторит логи различных сетевых
служб (Apache, vsftpd, SSH...) на предмет слишком
частых попыток аутентификации и блокирует
IP-адреса тех, кто делает это наиболее активно
(три неудачные попытки подряд — в бан на десять
минут).

Красота fail2ban в том, что он не требует настройки


и начинает работать сразу после установки. Все,
что надо сделать, — это инсталлировать пакет:

$ sudo apt-get install fail2ban

13. Измерь скорость соединения


С помощью SSH легко измерить скорость
соединения с машиной. Для этого можно
использовать утилиту pv (pipe viewer). Она
предназначена для измерения скорости передачи
данных через пайпы (|). Объединив ее с SSH,
можно получить достаточно точный бенчмарк
скорости соединения:

$ yes | pv | ssh user@host "cat >


/dev/null"

Измеряем скорость соединения


14. Используй SSH как SOCKS-
прокси
SSH очень легко превратить в SOCKS-прокси,
который будет пересылать твои данные между
локальной машиной и SSH-сервером через
зашифрованный канал. Все, что для этого нужно
сделать, — запустить SSH-клиент с флагом -D,
после которого указать номер SOCKS-порта (флаг
-C включает принудительное сжатие трафика):

$ ssh -D 9999 -C user@host

15. Обходи файрволы


В дополнение к SOCKS-прокси в SSH есть
функция прозрачного «проброса портов».
Работает она так: на локальной машине
открывается порт. Трафик, переданный на этот
порт, прозрачно проксируется через удаленную
машину и направляется на указанный хост:порт.
Для примера: допустим, твой начальник
заблокировал доступ к xakep.ru на уровне
корпоративного файрвола. Но ты можешь обойти
это ограничение, используя удаленный
SSH-сервер:
$ ssh -L8080:xakep.ru:80 user@host

Теперь все подключения к localhost:8080 будут


перенаправляться на xakep.ru:80.

16. Сохрани настройки


подключения к хостам
Если ты работаешь с большим количеством хостов
под именем разных юзеров с использованием
разных ключей, то ты существенно упростишь свою
жизнь, если создашь для этих хостов шорткаты.
Например, следующие строки ~/.ssh/config
описывают два хоста:

example.com, SSH-сервер на котором «висит»


на порту 2222, а в качестве ключа
используется ~/my_key.pem;
192.168.33.10, с SSH-сервером на
стандартном порту, юзером root и
принудительным отключением
аутентификации с помощью ключа.

Host server1
HostName example.com
Port 2222
User user
IdentityFile ~/my_key.pem

Host server2
HostName 192.168.33.10
User root
PubkeyAuthentication no

Теперь, чтобы подключиться к example.com, нет


нужды набирать длинную команду

$ ssh -i ~/my_key.pem user@example.com -p


2222

Можно использовать шорткат:

$ ssh server1

17. Подключайся к удаленной


машине через другую машину
Допустим, у тебя есть доступ к host1, но нет
доступа к host2 (он за файрволом, например), но
доступ к host2 есть у host1. Тогда подключиться к
host2 с твоей машины можно так:

$ ssh -t user@host1 ssh user@host2

18. Копируй файлы с удаленной


машины на другую машину
через свою
Примерно такая же история. Предположим, файл
необходимо скопировать с host1 на host2, но они не
могут друг с другом общаться. В этом случае файл
можно скопировать через локальную машину:

$ ssh root@host1 "cd /копируемый/каталог/


&& tar -cf - ." | ssh root@host2 "cd
/куда/копировать/ && tar -xf -"

19. Запускай графический софт


Linux/BSD используют клиент-серверную оконную
систему X Window System, изначально
разработанную для запуска графических
приложений на мейнфрейме с выводом картинки
на экран тонкого клиента. Поэтому она из коробки
позволяет запускать приложения на удаленной
машине так, чтобы их вывод был перенаправлен на
локальную. А SSH умеет форвардить протокол X,
так что его можно использовать для запуска не
только консольных, но графических приложений:

$ ssh -X user@host firefox

20. Слушай музыку с удаленной


машины
Немного надуманный, но в целом довольно
интересный трюк:

$ ssh user@host "cat /home/user/music


/*.mp3" | mpg123 -

Своего рода интернет-радио для одного.

Выводы
SSH — штука сложная и очень развитая. На самом
деле эти двадцать советов — лишь часть того, на
что способен этот инструмент.
Вверх ↑

Вам также может понравиться