Назад | Перейти на главную страницу

Как я могу управлять списком часто используемых хостов?

Как я могу быстро выбрать и войти на несколько хостов, к которым мне нужно получить доступ через ssh? Я создаю сценарий оболочки, подобный приведенному ниже, который использует dialog чтобы показать меню хостов из командной строки, но мне любопытно, есть ли лучший способ.

#!/bin/dash
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap "rm -f $tempfile" 0 1 2 5 15

while [ 1 ]
do
    dialog --menu "Select Host" 0 0 0 \
    "hostname1" "Host description 1" \
    "hostname2" "Host description 2" \
    "hostname3" "Host description 3" 2> $tempfile

    HOSTNAME=`cat $tempfile`

    if [ "x" = "x$HOSTNAME" ]; then
        break
    fi

    ssh $HOSTNAME
done

Мне нравится настраивать каждый хост с коротким именем в файле ~ / .ssh / config на моем клиентском компьютере. Вот пример:

Host host1
    HostName     longhostname.mydomain.com 
    User         remoteuser
    IdentityFile ~/ssh-keys/id_rsa-my-keypair

Таким образом, я могу просто набрать «ssh host1» и сразу войти в систему.

Для частого входа в систему я обычно использую короткие имена хостов. DNS нашей компании содержит большинство из них, остальные находятся в / etc / hosts. В сочетании с ssh-агентом это для меня достаточно удобно. Ах да, еще: мышечная память. Когда я думаю о имени хоста, оно волшебным образом появляется на экране, если мои пальцы находятся достаточно близко к клавиатуре.

Для менее частых команд я обычно полагаюсь либо на историю команд (если они не который нечасто) или Wiki, где они задокументированы (копирование / вставка). Этот подход имеет то преимущество, что менее частые задачи более или менее гарантированно полностью документируются.

Я думал поиграть с автоматическим завершением команд, чтобы ssh автоматически расширял частые имена хостов на «вкладке», но до сегодняшнего дня я не упускал этого слишком сильно ... Однажды я ...

Для решения на основе графического интерфейса просмотрите SSHmenu.

Честно я могу напечатать ssh user@host или когда я в окнах winkey+r then putty <server> быстрее, чем любая система меню. При этом я стараюсь по возможности избегать использования мыши, потому что эти тики часов складываются в конце дня.

У меня фотографическая память, поэтому просто запомните их IP-адреса, к сожалению, я знаю, но должен сказать, что кое-что принесет пользу :)

Я предпочитаю небольшие сценарии оболочки или псевдонимы оболочки. В лучших традициях UNIX я называю их как можно короче, чтобы минимизировать набор текста.

Например, у меня есть псевдоним «ns1», который представляет собой однострочную команду SSH, необходимую для входа на (очевидно) первый сервер имен, который я поддерживаю.

Обычно имя команды представляет собой краткую мнемонику имени машины, а версия этого имени без префикса по умолчанию - ssh. Таким образом, «ns1» отправит мне ssh, и (если бы это был ящик Windows) псевдоним «rns1» мог бы запускать клиентскую команду удаленного рабочего стола для этой машины.

Если бы у меня было так много, что я не мог бы отслеживать их все, я бы использовал метод сценария оболочки и сохранял бы строку описания в комментарии в каждом из них с общим тегом для всех сценариев. Затем я написал небольшой сценарий, который распечатал бы имя каждого файла в моем каталоге пользовательских сценариев, за которым следовало бы все, что я взял из этой строки комментария. Запуск этого сценария затем фиксировал на экране каждую команду и ее действия.

Я только что узнал несколько дней назад, что вы можете использовать ~/.ssh/config чтобы сделать это совершенно безболезненным.

Записи в этом файле выглядят так:

Host short
    User joni
    HostName short.foo.bar.domain.fi

(User можно опустить, и в этом случае используется ваше текущее имя пользователя.)

Затем вы можете использовать короткое имя хоста: ssh short. Или с включенным завершением bash вы просто набираете что-то вроде ssh sh, ударить вкладка и это все.

Это и Ctrl-R поиск в истории команд сделать SSH-подключение к моим любимым хостам достаточно простым.

Если вы хотите ускорить соединение, то использование функций ControlPath / ControlMaster клиента OpenSSH помогает и позволяет использовать большинство соединений, которые используются нечасто, так что можно мультиплексировать несколько входов через одно TCP-соединение. ~/.ssh/config анализируется так, что для любого параметра конфигурации используется первое найденное совпадение, поэтому вы можете сделать что-то вроде этого:

Host *-nomaster
        ControlMaster no
        ControlPath none

Host *
        ControlPath ~/.ssh/cp/%h-%p-%r

Host *-master
        ControlMaster yes

Host foobar foobar-master foobar-nomaster
        Hostname foobar.example.org

и тебе нужно будет mkdir ~/.ssh/cp тоже конечно.

Затем я просто использую завершение табуляции zsh который поставляется с завершением табуляции для многих команд, включая ssh. Для ssh он будет отдавать предпочтение хостам из файлов known_hosts (как пользовательских, так и системных), но если префикс хоста не соответствует им, будет использовать правила хоста ~ / .ssh / config.

screen

Затем я просто оставляю их открытыми.

Какой ваш любимый инструмент или метод для быстрого входа на хосты, к которым вам нужно получить доступ через ssh?

Я использовал скрипты, но мне очень нравится использовать iterm и его функцию закладок.

Конечно, выполнение щелчков мышью и поиск «сервера» в списке занимает больше времени, чем ввод его в командную строку. Но у iTerm есть сочетания клавиш.

А с помощью закладок я могу кластеризовать группы серверов в логические папки (производство / веб или производство / зоны / веб). У меня есть более сотни серверов, за которыми нужно ухаживать: запоминания всех их имен не произойдет, не говоря уже о попытках вспомнить, какие серверы принадлежат моей ферме JDE, а какие являются моим кластером приложений BOM.

Особенно в 03:00, когда все ломается.

Если у вас в качестве оболочки используется bash, вы можете использовать следующий фрагмент, чтобы использовать ваш файл known_hosts для bash_completion:

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

это не работает, если вы хешируете свои известные хосты, поэтому вам придется анализировать что-то еще, например, ваш файл / etc / hosts.

Порт osx для bash_completion уже включает поддержку завершения ssh tab

Завершение вкладки scp тоже довольно приятно, но требует использования ssh-agent или ssh_config для ссылки на файл идентификации без пароля с соответствующим открытым ключом на удаленном хосте.

Пакет bash-completion для linux и OS X использует ssh known_hosts для завершения записей хоста табуляцией. Это плюс полный файл хоста - мой метод.

Я использую комбинацию .ssh / config и screen:

Сначала (как упоминалось в нескольких предыдущих ответах) я настраиваю свой файл .ssh / config так, чтобы я мог использовать короткие имена и не вводить свое имя пользователя (которое не совпадает с именем пользователя моего локального компьютера, поэтому хорошо иметь его явно. ssh / config) и желательно использовать открытые ключи для входа без пароля.

У меня есть псевдоним (или функция), который перечисляет все хосты в моем файле .ssh / config, поэтому, если я забуду их имена (у меня есть доступ к нескольким дюжинам, а схемы именования дико несовместимы, и я не использую все из них так же часто, как и другие) Я могу просто набрать «хосты», чтобы увидеть все их имена в списке.

Теперь о экране. Поскольку запуск screen на моем локальном компьютере означает, что я теряю все свои сеансы, когда беру свой ноутбук домой на ночь, и одно из больших преимуществ screen - наличие постоянных сеансов, я не запускаю screen локально. Вместо этого я вхожу на удаленный сервер и запускаю screen на этом сервере (назовем его «перемычкой», поскольку он служит «отправной точкой») и оттуда захожу на другие машины, с которыми я работаю.

Я НЕ помещаю их все в свой файл .screenrc для автоматического входа в систему, потому что мне не нужен КАЖДЫЙ сервер КАЖДЫЙ раз. Обычно мне нужно какое-то подмножество, поэтому у меня есть сеанс экрана с одним подмножеством и другой сеанс экрана с другим подмножеством экрана.