множественные подключения
1 2 3 4 5 6 7 8 |
OpenSSH способен обслуживать множество одновременных соединений с одной и той же машиной. Обычно пользователи просто запускают команду и ждут ее завершения, чтобы запустить следующую. К счастью, эту проблему легко обойти путем разделения одного соединения на множество сессий. Просто добавь в конфиг ssh (~/.ssh/config) следующие строки: ControlMaster auto ControlPath ~/.ssh/mux_%h_%p_%r Ты сможешь создать столько соединений с одним и тем же сервером, сколько посчитаешь нужным, причем время на повторную аутентификацию тратить будет не нужно. |
проксирование соединений
1 2 3 4 5 6 7 8 9 |
Допустим, ты не можешь создать соединение с SSH-сервером напрямую, но можешь использовать для этого другой хост, к которому ты тоже имеешь SSH-доступ. Добавь в свой конфиг следующие строки: ForwardAgent yes Host host HostName host.com ProxyCommand ssh proxy-host.com \ netcat -q 600 %h %p Команда ssh host создаст соединение с сервером host.com через сервер proxy-host.com. |
выход за пределы HTTP-изоляции
1 2 3 4 5 6 |
Трюк номер три — . Многие организации не просто режут неугодный им трафик, но и принуж дают пользователей выходить в Сеть только с использованием HTTP-протокола. Такую несправедливость легко обойти с помощью сorkscrew (http://www.agroman.net/corkscrew/), который умеет туннелировать SSH-трафик через HTTP. Просто установи его на свою машину и добавь в конфиг следующие строки (где proxy.com и 80 — это адрес внешнего HTTP-прокси и его порт): Host * ProxyCommand corkscrew proxy.com 80 %h %p Теперь все соединения пойдут через указанный HTTP-прокси. |
тест пропускной способности сети
1 2 3 |
Чтобы протестировать скорость соединения, необязательно устанавливать специализированное ПО, достаточно утилиты pv и старого доброго SSH: $ sudo apt-get install pv $ yes | pv | ssh host.com "cat > /dev/null" |
удаленный анализ сетевого трафика
1 2 3 4 5 |
Почтив любой UNIX-системе есть сетевой сниффер tcpdump, однако читать его логи довольно утомительно. Возможности OpenSSH помогут упростить анализ трафика: $ ssh root@host.com tcpdump -w – 'port !22' | wireshark -k -i - Теперь весь трафик, проходящий через host.com, будет виден в графическом окне wireshark на твоей машине. |
передача файлов на низкой скорости
1 2 3 4 |
Иногда бывает необходимо передать большое количество файлов на удаленную машину, но сделать это так, чтобы процесс не мешал работе с сетью. В этом случае можно воспользоваться инструментом cstream: $ sudo apt-get install cstream $ tar -cj /backup | cstream -t 512k | ssh host 'tar -xj -C /backup' |
всегда открытая SSH-сессия
1 2 3 4 5 |
Пользователям ноутбуков, чье соединение с сетью может быть не постоянным, приходится каждый раз заново запускать SSH-клиент в момент, когда сеть появляется, и убивать его при потере соединения. Избежать этого можно с помощью инструмента autossh, который будет поддерживать иллюзию постоянного соединения с сервером, восстанавливая связь, когда сеть окажется доступной: $ sudo apt-get install autossh $ autossh -M50000 -t server.example.com \ 'screen -raAd mysession' |
запуск команды на нескольких серверах одновременно
1 2 3 |
Комментарии излишни: $ echo "uptime" | pee "ssh host1" "ssh host2" \ "ssh host3" |
удаленное сравнение файлов
1 2 3 4 5 6 |
Часто требуется сравнить локальную и удаленную версию какого-либо конфига, однако копировать файлы туда-сюда неудобно и долго. В этом случае можно воспользоваться следующей командой: $ ssh user@host cat /путь/к/удаленному/файлу | diff /путь/к/локальному/файлу - То же самое можно проделать для двух файлов, находящихся на разных серверах: $ diff <(ssh host1 cat /etc/apt/sources.list) < (ssh host2 cat /etc/apt/sources.list) |
одновременный просмотр логов с несколькихмашин
1 2 3 4 5 |
С помощью multitail и SSH можно запросто просматривать логи с двух серверов одновременно: $ sudo apt-get install multitail $ multitail -l 'ssh host1 "tail -f \ /var/log/apache2/error.log"' -l 'ssh host2 \ "tail -f /var/log/apache2/error.log"' |
копирование файлов с одной удаленной машины на другую через локальную
1 2 3 4 |
В случае если две удаленные машины не могут установить связь друг с другом, файлы между ними можно передавать, используя свой комп в качестве промежуточного звена: $ ssh root@host1 "cd /каталог && tar -cf – ." |\ ssh root@host2 "cd /каталог && tar -xf -" |
копирование вывода удаленной команды в буфер обмена
1 2 3 |
Часто требуется скопировать вывод удаленной команды в буфер обмена, чтобы вставить его в письмо, сообщение форума и т. д. Проще всего это сделать с помощью утилиты xclip: $ ssh user@host cat /файл.txt | xclip |
синхронизация времени средствами SSH
1 2 |
В случае, если машина не имеет доступа к NTP-серверу или на ней не установлен NTP-клиент, синхронизировать время между машинами можно так: # date --set="$(ssh user@server date)" |
установка пакетов удаленной машины на локальную
1 2 3 |
Нередко требуется синхронизировать две машины так, чтобы они имели одинаковый набор установленных пакетов. Стандартными методами сделать это сложно, но с помощью SSH проще простого: # ssh remotehost 'dpkg --get-selections' | dpkg --set-selections && dselect install |
снимок удаленного экрана
1 2 3 4 5 |
Можно очень легко получить изображение X-сервера с удаленной машины, воспользовавшись стандартным графическим пакетом ImageMagick: # ssh user@host "DISPLAY=:0.0 import -window \ root -format png -" | display -format png - Чтобы сохранить его в файле, последнюю команду следует заменить на «> file.png». |
ускорение передачи данных
1 2 3 4 5 6 |
Если машины,с которыми установлено соединение, находятся внутри заведомо безопасной сети (например, офис или дом), передачу данных средствами SSH можно несколько ускорить, если использовать менее стойкий алгоритм шифрования. Для этого добавь в конфигурационный файл следующие строки: Host host.com Ciphers arcfour256 MACs umac-64@openssh.com |
вывод звука с удаленной машины на локальную
1 2 3 4 |
Вместе с картинкой рабочего стола удаленной машины иногда хочется получить и звук. Это делается с помощью банального dd: $ dd if=/dev/dsp | ssh -c arcfour -C \ user@host dd of=/dev/dsp |
запуск локального скрипта на удаленной машине
1 2 |
Нередко требуется запустить скрипт на удаленной машине, однако копировать его туда совсем необязательно, достаточно выполнить следующую простую команду: $ ssh -T user@host < script.sh |
OPENSSL
1 2 3 4 5 6 7 8 9 10 11 |
OpenSSL представляет собой систему защиты и сертификации данных, которая была разработана в ответ на создание протокола безопасных сокетов SSL компанией Netscape. Вопреки расхожему мнению, OpenSSL вовсе не является инструментом для реализации SSL-протокола и может выполнять множество самых разнообразных функций, в том числе управлять ключами и сертификатами, рассчитывать хеши и т.д. Вот лишь неполный список возможностей этого криптографического комбайна: • создание ключей RSA и DSA и управление ими (команды rsa, dsa, dsaparam); • создание сертификатов формата x509, формирование запросов на сертификацию, восстановление (команды x509, req, verify, ca, crl, pks12, pks7); • симметричное и асимметричное шифрование данных (команды enc, rsautl); • расчет хешей (команда dgst); • работа с S/MIME (команда s/mime). Также OpenSSL может быть использован для проверки SSL-серверов и клиентов с помощью специальных команд s_client/s_server и для тестирования скорости работы различных алгоритмов (команда speed). Мы не раз писали о работе с пакетом OpenSSL, поэтому не будем рассматривать стандартные примеры его использования вроде создания хешей и сертификатов, а сразу перейдем к более серьезным трюкам. |
openssl бенчмарк
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Одна из интересных особенностей OpenSSL заключается в том, что он может провести бенчмарк используемых алгоритмов и скоростиустановления SSL-соединения. Для этого предназначена стандартная команда s_time. Чтобы оценить скорость установки SSL-соединения, нужно применить ее к команде openssl: $ openssl s_time -connect gmail.com:443 -www /test.html -new 103 connections in 0.75s; 137.33 connections/user sec,bytes read 42436 103 connections in 31 real seconds, 412 bytes read perconnection То же самое можно проделать с помощью наиболее стойкихалгоритмов: $ openssl s_time -ssl3 -cipher HIGH -connect gmail.com:443 -www / -new 99 connections in 0.73s; 135.62 connections/user sec,bytes read 40788 99 connections in 31 real seconds, 412 bytes read perconnection Эти две команды позволяют определить максимальную пропускную способность SSL-сервера. Но еще более интересный способ заключается в тестировании всех поддерживаемых алгоритмов. Для этого нам придется прибегнуть к скриптингу: IFS=":" for c in $(openssl ciphers -ssl3 RSA); do echo $c openssl s_time -connect host:443 -www / -new -time 10 -cipher $c 2>&1 | grep bytes echo done Такая команда позволяет измерить скорость установки SSL-соединения с помощью различных алгоритмов шифрования, что можно использовать, например, для тюнинга SSL-сервера. Если же SSL-сервера как такового еще нет, его легко эмулировать с помощью самого OpenSSL. На серверной машине запускаем OpenSSL-сервер: $ openssl s_server -cert mycert.pem -www На клиентской выполняем следующую команду: $ openssl s_time -connect myhost:4433 -www / -new -ssl3 |
openssl подключение к удаленным серверам
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Еще одна интересная команда OpenSSL — это s_client, которая позволяет коннектиться к удаленным SSL-серверам для их тестирования. Чаще всего я использую эту команду, чтобы проверить дату выдачи сертификата. Для этого следует просто подключиться к удаленному SSL-серверу, дождаться, покана экране появится информация о сертификате, а затем прогнать его через всё тот же openssl, чтобы вычленить даты. При использовании одной команды всё это выглядит так: $ echo | openssl s_client -connect \ http://www.google.com:443 2>/dev/null | \ openssl x509 -dates -noout notBefore=Oct 26 00:00:00 2011 GMT notAfter=Sep 30 23:59:59 2013 GMT Команду s_client можно также применять для тестирования сервера на уязвимость, заключающуюся в использовании нестойких алгоритмов шифрования: $ openssl s_client -connect http://www.google.com:443 -cipher LOW CONNECTED(00000003) 140513251690152:error:14077410:SSL routines:SSL23_ GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:658: Сервер, не поддерживающий нестойкие алгоритмы шифрования, просто откажется устанавливать соединение, как это и произошло в случае с сервером Google. Команда s_client также довольно удобна для отладки различных протоколов (в этом случае она выступает в виде SSL’ного Telnet). Например: $ openssl s_client -starttls smtp -crlf \ -connect smtp.gmail.com:25 |
openssl шифрование
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
О шифровании с помощью OpenSSL не писал только ленивый, поэтому мы остановимся не на самих принципах шифрования, а на том, как его можно использовать для вспомогательных задач. Утилита командной строки openssl удобна тем, что она, как и все остальные команды UNIX, может принимать данные на вход и имеет для них стандартный выход. В результате с помощью одной простой команды можно обеспечить, например, защищенную передачу файла по сети: отправляющий$ cat /etc/passwd | openssl \ aes-256-cbc -a -e -pass pass:пароль | \ netcat -l -p 8080 принимающий$ netcat хост:8080 | openssl \ aes-256-cbc -a -d -pass pass:пароль > passwd Можно также применять и различные скрипты, чтобы автоматизировать шифрование множества файлов (пароль в /tmp/passwd): $ for f in * ; do [ -f $f ] && \ openssl enc -aes-256-cbc -salt -in $f \ -out $f.enc -pass fi le:/tmp/passwd ; done Для расшифровки отдельно взятых файлов используем следующую команду: $ openssl enc -d -aes-256-cbc -salt \ -in файл.enc -out fi lename \ -pass fi le:/path/to/passwd Для шифрования целого каталога проще, конечно, воспользоваться такой конструкцией: $ tar c каталог | openssl enc -aes-256-cbc -e \ > secret.tar.enc OpenSSL удобно использовать для генерирования паролей: $ openssl rand 8 -base64 O0Hqtv9l0sY= А сгенерировать хеш для записи в /etc/passwd можно так: # openssl passwd -1 my-secret-pass $1$WA7AVhQL$y9VaGwseiKRLSGoJg21TP0 Кстати, кодирование в base64 может пригодиться для отправки файлов, если двоичная передача данных не поддерживается: $ tar -c каталог | gzip -9 | openssl enc \ -base64 > text-message.txt Возможность генерирования случайных данных можно использовать для создания фиктивных MAC-адресов: $ openssl rand -hex 6 | \ sed 's/\(..\)/\1:/g; s/.$//' f2:9e:56:fd:5a:93 |
Примеры в файле .ssh/config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Использование ProxyJump Использование ProxyJump Host remotehost HostName remote.example.com User remoteuser ProxyJump jumphost Переадресация порта Host jumpbox HostName jump.example.com User jumpuser LocalForward 8080 localhost:80 Автоматическое выполнение команды при подключении Host autoscript HostName remote.example.com User username IdentityFile ~/.ssh/id_rsa RemoteCommand /path/to/program RequestTTY yes |