(Я задал этот вопрос относительно zsh, но я также использую bash и считаю его полезным - как я предполагаю, многие другие тоже будут, поскольку у bash гораздо больше пользователей, чем у zsh.)
Я хотел бы настроить завершение команд в bash для отображения имен хостов после того, как я наберу
ssh [TAB]
взяв имена из моего файла .ssh / config (и желательно из 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
Теперь у вас есть пакет / функциональность, о которых говорил Ричард Холлоуэй.