The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Автодополнение ssh-хостов в командной строке
Простейшим способом упрощения набора параметров для частоиспользуемых хостов
является задание псевдонимов в ~/.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
 
13.04.2010 , Автор: bthemad , Источник: http://bthemad.wordpress.com/2010/0...
Ключи: ssh, bash, autocomplete, shell, console
Раздел:    Корень / Пользователю / Работа в консоли

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, log1301 (?), 11:44, 14/04/2010 [ответить] [﹢﹢﹢] [ · · · ]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    полезно, спасибо
     
  • 1.2, McLeod095 (ok), 14:17, 14/04/2010 [ответить] [﹢﹢﹢] [ · · · ]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    Т.к. я люблю использовать в качестве разделителей символы табуляции то строка
    cat ~/.ssh/config | grep -iE '^(Host|HostName) ' | awk '{print $2}'
    мне ровным счетом ничего не выводила. Пришлось переделать вот так
    cat ~/.ssh/config | awk '/^(Host|Hostname)/{print $2}'
     
  • 1.3, тигар (ok), 15:49, 14/04/2010 [ответить] [﹢﹢﹢] [ · · · ]  []     [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    эммм... а можно подробнее про "в последних версиях
    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/'

     
     
  • 2.4, hostmaster (??), 00:12, 15/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    http://www.vitalvector.com/blog/2009/02/ssh-tip-hash-known-hosts.html
     
     
  • 3.5, тигар (ok), 10:08, 15/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    т.е фразу которую я процитировал выше можно перефразировать как "если Ваша паранойа Вам не дает покоя то Вы можете включить HashKnownHosts и приделать такой вот костыль к shell'у". Так?
     
     
  • 4.9, Michael Shigorin (ok), 12:40, 17/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    При чём тут покойя, это хэширование -- штука полезная.  А к нормальному zsh (к дебиановскому не относится, в альте собран прилично) и приделывать ничего не надо, и так tab'ит.
     
     
  • 5.10, тигар (ok), 12:54, 17/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    что полезного дает это хеширование?

     

  • 1.6, McLeod095 (ok), 11:44, 15/04/2010 [ответить] [﹢﹢﹢] [ · · · ]  []     [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    В итоге посмотрев на строку поиска пришел к вот такому варианту

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

     
  • 1.7, vayerx (ok), 12:21, 16/04/2010 [ответить] [﹢﹢﹢] [ · · · ]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    В итоге посмотрев на строку поиска пришел к вот такому варианту:

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

     
  • 1.8, anonymous (??), 23:19, 16/04/2010 [ответить] [﹢﹢﹢] [ · · · ]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    Я бы лучше сделал так:
    complete -W "$([ -r ~/.ssh/config ] && echo 'awk '/^Host/ {print $2}' ~/.ssh/config')" ssh
     
  • 1.11, universite (ok), 06:21, 19/04/2010 [ответить] [﹢﹢﹢] [ · · · ]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    Извращенцы!!!
    man alias
    man hosts
     
     
  • 2.12, Мимопроходил (?), 00:56, 25/04/2010 [^] [^^] [^^^] [ответить]  []     [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    А что сделаешь если удаленный шелл крутиться на кастомном порту? :)
     
     
  • 3.13, universite (ok), 22:10, 25/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    >А что сделаешь если удаленный шелл крутиться на кастомном порту? :)

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

     
     
  • 4.15, Michael Shigorin (ok), 16:15, 26/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    >>А что сделаешь если удаленный шелл крутиться на кастомном порту? :)
    >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 по портам видно

     
     
  • 5.16, universite (ok), 22:53, 26/04/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    >[оверквотинг удален]
    >>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 по портам видно

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

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

     
     
  • 6.17, Michael Shigorin (ok), 00:12, 01/05/2010 [^] [^^] [^^^] [ответить]      [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    >а как тогда приватные ключи подставлять для каждого соединения?

    man ssh_config
    /IdentityFile

     
  • 2.14, vayerx (ok), 01:28, 26/04/2010 [^] [^^] [^^^] [ответить]  []     [п╨ п╪п╬п╢п╣я─п╟я┌п╬я─я┐]
  • +/
    и в скриптах тоже?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру