settler 15.10.2010 11:23
Переводы — Вы должны были узнать это от мамы: шесть вещей про SSH.
Если вы когда-нибудь серьезно пользовались Linux, то скорее всего уже хоть немного знакомы с основами SSH. Но вы хотите узнать больше. В этой статье мы дадим вам шесть советов по SSH для пополнения знаний . (А еще это отличная тема для коктейльной вечеринки)(1) Командуйте!
Все знают, что SSH используется для доступа к удаленному шелу, но знаете ли вы, что его можно использовать для запуска команд на них? Вы можете просто добавить команду после имени хоста! Например:
1 |
wdaher@rocksteady:~$ ssh bebop uname -a
|
В сочетании с беспарольным входом по SSH, вы сможете расширить возможности своих скриптов. Хотите узнать, какая версия Python установлена на каждой из ваших систем? Просто сложите ssh hostname python -V в цикле и все готово!
Но это работает не со всеми командами:
1 |
|
Почему? Некоторые программы требуют псевдо-терминал и не знают что делать, когда его нет (все, что хочет рисовать в любой части экран, а скорее всего попадает в эту категорию). Но ssh может обработать это с помощью опции -t. Ssh выделит вам псевдо-терминал, и тогда программа заработает.
1 |
|
1 |
# Если вы используете GNU Screen, восстановите сессию одной командой
|
(2) Пожалуйста, вот вам порты
Подождите, вот еще! Возможности ssh для проброса порта огромны. Допустим, у вас на работе есть веб-панель на 80 порту сервера для аналитики и доступна только внутри корпоративной сети, а сейчас 2 часа ночи, и вам срочно нужен к ней доступ из дома, а ваш пейджер выключился.
К счастью, у вас есть ssh-доступ к вашей рабочей машине, которая находится в той же сети, что и сервер аналитики. Если вы можете подключится к рабочей машине, а она может подключится к серверу аналитики, значит мы можем сделать это, не так ли?
Правильно. Мы пойдем кружным путем:
1 |
|
Итак, с ssh desktop все ясно. Опция -L port:hostname:hostport говорит "Установить проброс с port (в этом случае 8080) к hostname:hostport (тут desktop:80)."
Теперь, если вы откроете http://localhost:8080/ в веб-браузере у себя дома, то будете подключены к 80-му порту рабочего компьютера. Близко, но не совсем! Помните, мы хотели подключится к веб-панеле, запущенной на 80-м порту сервера аналитики, а не рабочей машине.
Все, что нам осталось, это выполнить команду:
1 |
|
Теперь, удаленный конец проброшенного порта это analytics:80, который находится именно там, где запущена веб-панель. Но подождите, разве сервер аналитики не за фаерволом? Как мы можем добраться до него? Помните: это соединение установлено на удаленной системе (рабочем компьютере), и только из-за этого оно работает.
Если вам необходимо создавать много таких пробросов, то, возможно, больше подойдет что-то подобное:
1 |
|
Эта команда установит SOCKS-прокси на localhost:8080. Если вы настроите свой браузер использовать ее, то весь трафик браузера пойдет по SSH через вашу удаленную систему. Это значит что вы сможете прямо с браузера перейти на http://analytics/.
(3) Не забывайте про тильду
Загадка: подключитесь через ssh к системе, нажмите пару раз Enter, а потом наберите тильду. Ничего не появилось. Почему?
Потому что тильда в ssh является экранирующим символом. Прямо сначала строки вы можете нажать ~ и еще какую-то клавишу, чтоб выполнить интересные вещи с вашим ssh-соединением (таких как добавить 30 бонусных жизней после каждого проигрыша). ~? - покажет полный список управляющих последовательностей, но две самые удобные это ~. и ~^Z.
~. (тильда с точкой) оборвет ваше ssh-соединение, что удобно, когда оборвалось сетевое соединение, а вы не хотите ждать пока ssh-сессия оборвется.
~^Z (тильда с Ctrl+Z) отправит соединение в фоновый режим, если вы в это же время хотите еще что-то сделать. Вот пример в действии:
(4) Отпечатки пальцев
Я уверен, что вы видели это миллион раз и просто нажимали "yes", не думая:
Что тут происходит? Если это ваше первое подключение к bebop, то вы не можете точно сказать что это действительно bebop, или же какой-то самозванец, который выдает себя за bebop. Все что вы знаете, это "отпечаток пальцев" (ключ) системы, к которой вы обращаетесь. В принципе, вы должны проверить это вручную (тоесть позвонить туда, где находится удаленный хост, и попросить их прочитать ключ).
Допустим вы и ваш помешанный на безопасности друг действительно хотите это сделать. Как вы можете узнать этот ключ? На удаленном хосте ваш друг должен выполнить:
1 |
sbaker@bebop:~$ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub
|
Парам! Они совпадают, и это означает что можно спокойно продолжать. С этого момента ключ сохранен в вашем списке известных хостов (в ~/.ssh/known_hosts), так что вам не придется подтверждать каждый раз. И если когда-то на другом конце изменится ключ, вы увидите предупреждение, что кто-то пытается читать ваш трафик! (Или ваш друг переустановил систему и не сохранил ключ.)
(5) Потеряли ваши ключи
К сожалению, спустя некоторое время, вы и ваш друг должны расстаться (что-то о Kirk vs. Picard) (имеются ввиду знаменитые герои Star Trek Джеймс Тибий Кирк и Жан-Люк Пикард - прим.переводчика), и вы хотите удалить его ключ из своего списка известных хостов. "Без проблем," думаете вы, "Я просто удалю его из своего списка известных хостов.". Вы открываете файл и будете неприятно удивлены: перемешанный файл, с кучей непонятных символов. На самом деле это хеши имен хостов (или IP-адресов), к которым вы подключались раньше, и соответствующие им ключи.
Перед тем как продолжить, вы, конечно, спросите себя: "К чему все усложнять? Почему нельзя просто перечислить имена хостов простым текстом, чтоб люди могли легко редактировать файл?". На самом деле все так и было до недавнего времени. Но оказывается оставлять их в таком виде - это потенциальная дыра в безопасности, так как предоставляет злоумышленнику удобный список других мест, к которым вы подключались (мест где, к примеру, пользователь может невольно использовать те же пароли).
К счастью, ssh-keygen -R делает трюк:
1 |
wdaher@rocksteady:~$ ssh-keygen -R bebop
|
Как я сказал, все еще нет простого способа удалить ставшие горькими воспоминания о вашей бывшей дружбе.
(6) Подключение под другим именем...
Если вы дочитали до этого места, то вы уже профессионал в ssh. Как и другие профессионалы, вы логинитесь в кучу систем, в каждой свое имя пользователя, порты и длинные хостнеймы. Такие как ваши акаунты в AWS, Rackspace Cloud, ваш выделенный сервер или домашние системы ваших друзей.
И вы уже знаете как это делается: username@host или -l username чтобы указать ваше имя пользователя и -p portnumber чтобы указать порт:
1 |
wdaher@rocksteady:~$ ssh -p 2222 bob.example.com
|
Но это забывается очень быстро, особенно когда вам необходимо пройти через кучу других параметров для каждого из этих подключений. Откройте .ssh/config, файл в котором вы можете указать удобные псевдонимы для каждого набора этих параметров:
Теперь это просто:
1 |
|
И да, конфигурационный файл позволяет вам также задать команды пробрасывания портов или запуска чего-то. Если захотите - читайте страницу справки ssh_config для деталей.
ssh! Это (не) секрет
Оригинал
Переведено при помощи сервиса translated.by инициативной группой переводчиков welinux при участии пользователей settler, Zereal.
В коментариях к оригиналу статьи нашлось еще много интересного про SSH. Решил их оформить сюда же с дополнениями:
RandomArt
В .ssh/config можно включить вывод RandomArt-а, такого какой вы видите при генерации ключа:
1 |
The key's randomart image is:
|
Для этого в конфиг нужно добавить:
1 |
|
Это позволит визуально определять на какой хост вы заходите. Некоторым намного легче сразу заметить разницу, если картинка поменялась
X11-форвардинг
Можно прокидывать вывод гуев приложений, запущенных на удаленной машине. Для этого:
(1) Запустите Х-сервер на локальной машине
(2) Запустите удаленный клиент (например xload для мониторинга загрузки на удаленной машине):
1 |
|
Примечание: может понадобится xhost или xauth чтоб разрешить подключение
Для разрешения форвардинга Х-ов в конфиге sshd на сервере надо включить
1 |
|
Несколько алиасов для хоста
1 |
|
это хорошо, но в таком случае когда иногда забудешь про него и случайно наберешь просто alice.example.com, то оно работать не будет. Поэтому лучше сделать так:
1 |
|
тогда настройки для хоста будут работать под любым из этих алиасов
ssh-agent
ssh-agent это программа хранящая приватные ключи, используемые для публичной аутентификации (RSA, DSA). Идея ssh-agent состоит в том, что он запускается в начале Х-сессии или при входе в систему, и все другие окна или программы запускаются как клиенты программы ssh-agent. Посредством переменных окружения агент может быть найден и автоматически использован для аутентификации при подключении к другим машинам с использованием ssh. (русский man ssh-agent на OpenNet)
Вот нашлась хорошая статья по ssh-agent. Если кому будет интересно, то можно будет потом тоже перевести :)
Отключение проверки ключа
Для тех кому необходимо часто переустанавливать некоторые сервера (например для теста чего-то), есть путь отключить проверку ключей:
1 |
|
UserKnownHostsFile - отправит ключ не в файл known_hosts, а в какой-то другой (в данном случае в черную дыру :) )
StrictHostKeyChecking -заставит ssh не спрашивать yes/no при подключений к хосту, которого нет в известных, а сразу дописывать его в файл
Конвертация known_hosts в новый формат
Для того чтоб конвертировать существующий файл known_hosts в новый формат (с хешами вместо имен хостов и адресов) можно воспользоваться командой:
1 |
|
Не забудьте после этого удалить файл known_hosts.old, когда удостоверитесь что все нормально работает.
SSH over SSH
Опция ssh -t поможет также, когда вы хотите, например одной командой снаружи подключится к шлюзу во внутренней сети, а с него уже к какой-то машине в сети:
1 |
|
З.Ы. у ssh есть еще куча прекрасных возможностей :) Не забывайте про ssh-copy-id, reversed forwarding и т.п.
Updated:
По просьбам пользователей, добавлю сюда про передачу файлов с помощью scp
Утилита scp входит в состав пакета openssh и предназначена для удаленного копирования файлов через ssh-соединение.
Примеры использования scp:
Для передачи множества мелких файлов, лучше их предварительно за-tar-ить:
1 |
|
эта команда передаст в ssh уже заархивированную папку.
scp использует опции .ssh/config поэтому если у вас там прописаны настройки хоста, к примеру work, то команда копирования выглядит очень просто:
1 |
|
она скопирует локальный файл /local/file в домашнюю папку пользователя, который прописан для хоста work в .ssh/config
Updated2:
sshfs
Alex2ndr в коментариях дополнил про использование sshfs для монтирования папок с удаленного хоста по ssh:
Про sshfs можно уложиться так:
1 |
sudo aptitude install sshfs #ну или как-там в иных дистрах
|
Вместо того чтобы писать такое, лучше покажи как нужно сделать.
Я вроде публично просил не закапывать начинания. Что то не понятно?
+ ты же сам вроде входишь в группу переводчиков. Почему не поправил?
НЕ КОРМИТЕ МЕНЯ... расправа будет жестокой =)
+ ты же сам вроде входишь в группу переводчиков. Почему не поправил?
НЕ КОРМИТЕ МЕНЯ... расправа будет жестокой =)
ололо, в каком месте я чего закапываю? я просто указал на ошибку.
успокойся ;)
успокойся ;)
поправил :)
ну никто и не запрещает читать оригинал, если умеешь ;) Переводы же больше предназначены тем, кто совсем не понимает англ
ну никто и не запрещает читать оригинал, если умеешь ;) Переводы же больше предназначены тем, кто совсем не понимает англ
c коммментами вышло очень здорово! постараюсь их добавлять к новым переводам :)
Не совсем понятно что это за фокусы с тильдой. Обычно это сокращение имени домашнего каталога и написав ~? мы фактически говорим интерпретатору /home/user/? . Исключение наверно составят случаи когда ssh клиент перехватывает эту тильду ДО того как она достанется интерпретатору, но у меня это почему-то не работает. Хотя в man ssh это есть:
У кого-нибудь получился этот фокус?
-e escape_char
Sets the escape character for sessions with a pty (default: ‘~’). The escape character is only recognized at the beginning of a line. The escape character followed by a dot (‘.’) closes the connection; followed by control-Z suspends the connection; and followed by itself sends the escape character once. Setting the character to “none” disables any escapes and makes the session fully transparent.
Sets the escape character for sessions with a pty (default: ‘~’). The escape character is only recognized at the beginning of a line. The escape character followed by a dot (‘.’) closes the connection; followed by control-Z suspends the connection; and followed by itself sends the escape character once. Setting the character to “none” disables any escapes and makes the session fully transparent.
У кого-нибудь получился этот фокус?
угу, я сам про него узнал только когда переводил статью. Нажми в ссш тильду, а потом знак вопроса. Тильда не должна отобразится (если появилась - значит ткни один раз энтер) а после знака вопроса появился список команд
да - с энтером сработало :) Но с Putty работать не желает, только с нативным линуховым ssh клиентом.
Спасибо!
alex@deb-gate2:~$ ~?
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
Supported escape sequences:
~. - terminate connection (and any multiplexed sessions)
~B - send a BREAK to the remote system
~C - open a command line
~R - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~# - list forwarded connections
~& - background ssh (when waiting for connections to terminate)
~? - this message
~~ - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)
Спасибо!
~B - send a BREAK to the remote system
а что эта команда делает?
У меня не получилось только из вендовой putty, а между двумя линуксами так уже давно пользуюсь ~. :)
кстати а с повисшим ssh-соединением оно норм работает? (когда инет упал например) Какраз для этого хотел ее потестить :)
В тексте четко написано - сначала пару раз нажать Энтер, после этого играться с тильдой.
Вот, что написано в самом конце хелпа по использованию тильды (который показывается, если нажать Энтер, потом ~?):
...
(Note that escapes are only recognized immediately after newline.)
Вот, что написано в самом конце хелпа по использованию тильды (который показывается, если нажать Энтер, потом ~?):
...
(Note that escapes are only recognized immediately after newline.)
Добавил бы еще кто-нибудь про передачу файлов туда-сюда по ssh, было бы вообще офигенно.
А давайте еще про sshfs допишем :)
Я ей горазо чаще чем scp или sftp пользуюсь. Намного удобнее.
Я ей горазо чаще чем scp или sftp пользуюсь. Намного удобнее.
можно вообще отдельную статью про разные способы копирования файлов через ssh написать :)
Мне кажется разводить отдельную статью из-за 3-х строк не стоит, но вам, как автору, виднее...
Про sshfs можно уложиться так:
Про sshfs можно уложиться так:
sudo aptitude install sshfs #ну или как-там в иных дистрах
sudo adduser свое_имя_пользователя fuse #чтобы применилось нужно перелогиниться
sshfs user@remote_host:/remote/directory /local/directory
напишешь?
было бы интересно почитать про различие в протоколах, а так же их преимуществах и реализациаиях в разных системах (console/Gnome/KDE)
было бы интересно почитать про различие в протоколах, а так же их преимуществах и реализациаиях в разных системах (console/Gnome/KDE)
Истина, что знать такое надо от мамы. :) Ну т.е. это основы. Именно такие простые, надёжные и удобные вещи делают Linux той системой, которую выбирают профессионалы.
отличный перевод, лучше оригинал почитать ;)