URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 65853
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Автодополнение ssh-хостов в командн..."

Отправлено auto_tips , 14-Апр-10 11:44 
Простейшим способом упрощения набора параметров для частоиспользуемых хостов является задание псевдонимов в ~/.ssh/config:

   Host        myhost      # Имя хоста
   HostName    server.com  # Это удаленнй хост
   User        username    # Пользователь на удаленном хосте
   Port        22222       # Номер порта

При этом вместо "ssh -p 22222 -l username server.com" теперь достаточно написать "ssh myhost".

В случае когда этого недостаточно и хочется получить в bash поддержку автодополнения типовых имен хостов можно добавить в ~/.bashrc или ~/.profile следующие конструкции.

При поиске имен среди параметров Host и HostName в ~/.ssh/config:

   complete -W "$(echo `cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'`)" ssh


Обычно в дистрибутивах Linux уже присутствует настройка (/etc/bash_completion) для автодополнения по содержимому файла known_hosts, но в последних версиях OpenSSH имена хостов в данном файле перестали задаваться в открытом виде, поэтому автодополнение не работает. Тем не менее хэширование имен можно отключить указав в ssh_config "HashKnownHosts no".

Для поиска по known_hosts может быть использована конструкция:

   complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh


Более развернутый пример запроса для организации автодополнения по содержимому первого столбца произвольного файла my_hosts.txt:

   _compssh ()
   {
   cur=${COMP_WORDS[COMP_CWORD]};
   COMPREPLY=($(compgen -W '$(cut -d " " -f1 ~/my_hosts.txt) --all --schema' -- $cur))
   }
   complete -F _compssh ssh


URL: http://bthemad.wordpress.com/2010/03/31/ssh-host-autocompletion/
Обсуждается: http://www.opennet.me/tips/info/2340.shtml


Содержание

Сообщения в этом обсуждении
"Автодополнение ssh-хостов в командной строке"
Отправлено log1301 , 14-Апр-10 11:44 
полезно, спасибо

"Автодополнение ssh-хостов в командной строке"
Отправлено McLeod095 , 14-Апр-10 14:17 
Т.к. я люблю использовать в качестве разделителей символы табуляции то строка
cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'
мне ровным счетом ничего не выводила. Пришлось переделать вот так
cat ~/.ssh/config | awk '/^(Host|Hostname)/{print $2}'

"Автодополнение ssh-хостов в командной строке"
Отправлено тигар , 14-Апр-10 15:49 
эммм... а можно подробнее про "в последних версиях
OpenSSH имена хостов в данном файле перестали задаваться в открытом виде" ?

OpenSSH_5.4p1 FreeBSD-20100308, OpenSSL 0.9.8n 24 Mar 2010
по-прежнему все нормально с known_hosts
кусочек .cshrc:

if ( -r $HOME/.ssh/known_hosts ) then
     set hosts=`cat $HOME/.ssh/known_hosts | cut -f 1 -d \ | sed -e 's/,/ /g'` >& /dev/null
endif

complete ssh 'p/1/$hosts/' 'p/2/c/'


"Автодополнение ssh-хостов в командной строке"
Отправлено hostmaster , 15-Апр-10 00:12 
http://www.vitalvector.com/blog/2009/02/ssh-tip-hash-known-h...

"Автодополнение ssh-хостов в командной строке"
Отправлено тигар , 15-Апр-10 10:08 
т.е фразу которую я процитировал выше можно перефразировать как "если Ваша паранойа Вам не дает покоя то Вы можете включить HashKnownHosts и приделать такой вот костыль к shell`у". Так?

"Автодополнение ssh-хостов в командной строке"
Отправлено Michael Shigorin , 17-Апр-10 12:40 
При чём тут покойя, это хэширование -- штука полезная.  А к нормальному zsh (к дебиановскому не относится, в альте собран прилично) и приделывать ничего не надо, и так tab'ит.

"Автодополнение ssh-хостов в командной строке"
Отправлено тигар , 17-Апр-10 12:54 
что полезного дает это хеширование?


"Раздел полезных советов: Автодополнение ssh-хостов в командн..."
Отправлено McLeod095 , 15-Апр-10 11:44 
В итоге посмотрев на строку поиска пришел к вот такому варианту

complete -W "$(awk 'BEGIN{IGNORECASE=1} /^(Host|Hostname)/{print $2}' ~/.ssh/config)" ssh


"Автодополнение ssh-хостов в командной строке"
Отправлено vayerx , 16-Апр-10 12:21 
В итоге посмотрев на строку поиска пришел к вот такому варианту:

complete -W "$(awk 'BEGIN{IGNORECASE=1} /^(Host|Hostname)\W[^*?]+$/{print $2}' ~/.ssh/config)" ssh


"Автодополнение ssh-хостов в командной строке"
Отправлено anonymous , 16-Апр-10 23:19 
Я бы лучше сделал так:
complete -W "$([ -r ~/.ssh/config ] && echo `awk '/^Host/ {print $2}' ~/.ssh/config`)" ssh

"Автодополнение ssh-хостов в командной строке"
Отправлено universite , 19-Апр-10 06:21 
Извращенцы!!!
man alias
man hosts

"Автодополнение ssh-хостов в командной строке"
Отправлено Мимопроходил , 25-Апр-10 00:56 
А что сделаешь если удаленный шелл крутиться на кастомном порту? :)

"Автодополнение ssh-хостов в командной строке"
Отправлено universite , 25-Апр-10 22:10 
>А что сделаешь если удаленный шелл крутиться на кастомном порту? :)

alias ssh_server "ssh -p 22222 -l username server.com"


"Автодополнение ssh-хостов в командной строке"
Отправлено Michael Shigorin , 26-Апр-10 16:15 
>>А что сделаешь если удаленный шелл крутиться на кастомном порту? :)
>alias ssh_server "ssh -p 22222 -l username server.com"

Лучше в ~/.ssh/config оформить:

Host ssh_server
    HostName server.com
    Port 22222
    User username
    # можно ещё HostKeyAlias ssh_server, если там несколько sshd по портам видно


"Автодополнение ssh-хостов в командной строке"
Отправлено universite , 26-Апр-10 22:53 
>[оверквотинг удален]
>>alias ssh_server "ssh -p 22222 -l username server.com"
>
>Лучше в ~/.ssh/config оформить:
>
>Host ssh_server
>    HostName server.com
>    Port 22222
>    User username
>    # можно ещё HostKeyAlias ssh_server, если там несколько
>sshd по портам видно

Хорошо. Уговорили :)

а как тогда приватные ключи подставлять для каждого соединения?


"Автодополнение ssh-хостов в командной строке"
Отправлено Michael Shigorin , 01-Май-10 00:12 
>а как тогда приватные ключи подставлять для каждого соединения?

man ssh_config
/IdentityFile


"Автодополнение ssh-хостов в командной строке"
Отправлено vayerx , 26-Апр-10 01:28 
и в скриптах тоже?