Простейшим способом упрощения набора параметров для частоиспользуемых хостов является задание псевдонимов в ~/.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
полезно, спасибо
Т.к. я люблю использовать в качестве разделителей символы табуляции то строка
cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'
мне ровным счетом ничего не выводила. Пришлось переделать вот так
cat ~/.ssh/config | awk '/^(Host|Hostname)/{print $2}'
эммм... а можно подробнее про "в последних версиях
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
endifcomplete ssh 'p/1/$hosts/' 'p/2/c/'
http://www.vitalvector.com/blog/2009/02/ssh-tip-hash-known-h...
т.е фразу которую я процитировал выше можно перефразировать как "если Ваша паранойа Вам не дает покоя то Вы можете включить HashKnownHosts и приделать такой вот костыль к shell`у". Так?
При чём тут покойя, это хэширование -- штука полезная. А к нормальному zsh (к дебиановскому не относится, в альте собран прилично) и приделывать ничего не надо, и так tab'ит.
что полезного дает это хеширование?
В итоге посмотрев на строку поиска пришел к вот такому вариантуcomplete -W "$(awk 'BEGIN{IGNORECASE=1} /^(Host|Hostname)/{print $2}' ~/.ssh/config)" ssh
В итоге посмотрев на строку поиска пришел к вот такому варианту:complete -W "$(awk 'BEGIN{IGNORECASE=1} /^(Host|Hostname)\W[^*?]+$/{print $2}' ~/.ssh/config)" ssh
Я бы лучше сделал так:
complete -W "$([ -r ~/.ssh/config ] && echo `awk '/^Host/ {print $2}' ~/.ssh/config`)" ssh
Извращенцы!!!
man alias
man hosts
А что сделаешь если удаленный шелл крутиться на кастомном порту? :)
>А что сделаешь если удаленный шелл крутиться на кастомном порту? :)alias ssh_server "ssh -p 22222 -l username server.com"
>>А что сделаешь если удаленный шелл крутиться на кастомном порту? :)
>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 по портам видно
>[оверквотинг удален]
>>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 по портам видноХорошо. Уговорили :)
а как тогда приватные ключи подставлять для каждого соединения?
>а как тогда приватные ключи подставлять для каждого соединения?man ssh_config
/IdentityFile
и в скриптах тоже?