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

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

ssh [TAB]

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

Он делает некоторые из этого в настоящее время, но

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

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

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

11 голосов | спросил iconoclast 14 AM000000120000000531 2010, 00:47:05

3 ответа


1

Функция, которая обеспечивает завершение ssh, находится в /usr/share/zsh/functions/Completion/Unix/_ssh в моей системе.

Также см. man zshcompsys для документации (особенно выполните поиск на «узле», который появляется в нескольких местах и ​​«ssh», который появляется в несколько мест).

Возможно, добавление команды zstyle в ваш ~/.zshrc будет делать то, что вы ищете, не изменяя функцию завершения.

ответил Dennis Williamson 14 AM00000010000003231 2010, 01:08:32
1

Я делаю это, используя список всех хостов в данном домене, используя dig. Вы можете заменить эту функцию на любую систему поиска, включая файл хостов или статический список:

function complete_host_from_zone () {
    reply=(`dig axfr ouraynet.com @ns1.ouraynet.com | grep -e '^[a-z]' | cut -d\. -f1`)
}
compctl -x 'p[1]' -K complete_host_from_zone -- ssh

Примечание. Приведенный выше код не может полностью заменить полную систему для команды ssh в вашей конфигурации. Если у вас есть проблемы с этим, попробуйте изменить команду «ssh» на какую-либо другую случайную команду, например «mycompletetest», и посмотрите, работает ли это для завершения.

Также обратите внимание, что это делает передачу зоны DNS на каждом завершении! Если вы используете это много или на довольно статичном домене, имеет смысл сделать поиск и сохранить результат, а затем в вашей функции поиска просто установите ответ = zone_result.

ответил Caleb 19 +04002010-10-19T15:03:56+04:00312010bEurope/MoscowTue, 19 Oct 2010 15:03:56 +0400 2010, 15:03:56
0

Мне нравится хранить мой хеш-код known_hosts и скорее не будет превращать HashKnownHosts выключено. Я обнаружил, что посев, который @Gilles имеет с тем, что уже в моей истории, был довольно эффективным для моих нужд.

h=($(echo $(history | awk '{print $4 " " $5 "\n"}' | grep 'ssh ' | awk '{print $2}' | sort -u)))
if [[ -r ~/.ssh/config ]]; then
  h=($h ${${${(@M)${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*})
fi
if [[ -r ~/.ssh/known_hosts ]]; then
   h=($h ${${${(f)"$(cat ~/.ssh/known_hosts{,2} || true)"}%%\ *}%%,*}) 2>/dev/null
fi
if [[ $#h -gt 0 ]]; then
  zstyle ':completion:*:ssh:*' hosts $h
  zstyle ':completion:*:slogin:*' hosts $h
fi

Кроме того, FWIW, это то, что я использовал для Bash:

# SSH Autocompletion
complete -W "
  $(echo $(grep '^\s*ssh ' ~/.bash_history | sort -u | sed 's/^ssh //' | awk '{print $1}'))
  $(echo $(history | awk '{print $2 " " $3}' | grep 'ssh ' | awk '{print $2}' | sort -u))
  $(sed 's/#.*//;' ~/.ssh/config | awk ' /^Host (.+)$/ {$1 = "";print tolower($0)}')
" ssh
ответил Karl Wilbur 29 Jam1000000amThu, 29 Jan 2015 05:41:55 +030015 2015, 05:41:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132