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

Как отредактировать завершение команды для ssh на bash?

задал этот вопрос относительно zsh, но я также использую bash и считаю его полезным - как я предполагаю, многие другие тоже будут, поскольку у bash гораздо больше пользователей, чем у zsh.)

Я хотел бы настроить завершение команд в bash для отображения имен хостов после того, как я наберу

ssh [TAB]

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

В настоящее время он делает кое-что из этого, но

  1. он вообще не использует .ssh / config
  2. сначала требуется имя пользователя, хотя использование .ssh / config делает ненужным ввод имени пользователя
  3. он представляет несколько списков (вероятно, один из known_hosts, а другой из / etc / hosts, но я не проверял это)

Поэтому я хочу, чтобы в список (желательно один) были включены известные имена пользователей, а также известные имена хостов после ввода ssh [TAB]

(Я прихожу сюда раньше, чем Google, потому что 1) это приведет к тому, что ответ будет сохранен здесь, и 2) это, вероятно, более эффективно. Если никто не ответит, я найду ответ.)

Я написал это руководство из двух частей некоторое время назад:

http://www.debian-administration.org/article/316/An_introduction_to_bash_completion_part_1

http://www.debian-administration.org/article/317/An_introduction_to_bash_completion_part_2

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

Если вы находитесь на Сервер Ubuntu машина, то вы должны знать, что в Ubuntu записи в ~/.ssh/known_hosts хешированы, поэтому завершение SSH не может их прочитать. Разработчики Canonical считают это функцией, а не ошибкой. Даже добавив HashKnownHosts no к ~/.ssh/config и /etc/ssh/ssh_config Мне не удалось предотвратить хеширование хоста.

Однако вы можете прочитать настроенные записи из ~/.ssh/config, которые не хешируются. На основе ссылки из Ответ Стива Кемпа, вот сценарий для Bash Completion, который считывает записи из этого файла:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config | awk '{print $2}')

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

Поместите этот сценарий в /etc/bash_completion.d/ssh а затем отправьте его с помощью следующей команды:

$ . /etc/bash_completion.d/ssh

Это то, что у меня есть .bashrc для завершения имени хоста ssh:

SSH_COMPLETE=( $(cut -f1 -d' ' ~/.ssh/known_hosts |\
                 tr ',' '\n' |\
                 sort -u |\
                 grep -e '[:alpha:]') )
complete -o default -W "${SSH_COMPLETE[*]}" ssh

Эта функциональность уже обеспечивается завершением bash. Фактический файл, если вы хотите отредактировать его функции, это /etc/bash_completion.d/ssh.

Это предусмотрено пакетом завершение bash.

При вводе ssh <TAB> он перечислит все хосты в / etc / hosts и ~ / .ssh / config в одном списке.

Если у вас есть Пользователь, указанный для данного хоста, вам не нужно указывать его при использовании ssh.

Итак, если вы хотите использовать ssh для сервера brandon

Введите ssh br <TAB>, и он должен автоматически заполнить слово brandon, если этот хост находится либо в / etc / hosts, либо в ~ / .ssh / config.

Если вы используете Mac, вы можете использовать Homebrew для установки завершения bash:

brew install bash-completion

Добавьте следующее в ~/.bash_profile

if [ -f /usr/local/etc/bash_completion ]; then
. /usr/local/etc/bash_completion
fi

Если вы установили завершение bash с MacPorts, добавьте это в bash_profile

if [ -f /opt/local/etc/bash_completion ]; then
. /opt/local/etc/bash_completion
fi

Теперь у вас есть пакет / функциональность, о которых говорил Ричард Холлоуэй.