Вопрос или проблема
Есть ли способ изменить мой ~/.zshrc
, чтобы автозавершение ssh работало для Host
, а не для Hostname
?
У меня есть запись в ~/.ssh/config
, которая выглядит так:
Host staging-rfc staging
User crmpicco
Hostname staging.rfc.crmpicco.co.uk
Если я набираю ssh sta[TAB]
, то автоматически подставляется полный адрес хоста staging.rfc.crmpicco.co.uk
, что приводит к ошибке “permission denied” – вероятно, потому что система пытается войти с пользователем моего терминала, а не “crmpicco”.
[email protected]: Разрешение отказано (publickey).
Мой ~/.zshrc
:
# Подсветка текущего варианта автозавершения
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
# Улучшенное автозавершение SSH/Rsync/SCP
zstyle ':completion:*:(scp|rsync):*' tag-order ' hosts:-ipaddr:ip\ address hosts:-host:host files'
zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost broadcasthost
zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*'
# Разрешить не учитывать регистр в автозавершении
zstyle ':completion:*' matcher-list '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' \
'+l:|?=** r:|?=**'
# Инициализировать автозавершение
autoload -Uz compinit && compinit -i
Изменение моего zstyle
на следующее сработало идеально:
zstyle ':completion:*:(ssh|scp|ftp|sftp):*' hosts $hosts
zstyle ':completion:*:(ssh|scp|ftp|sftp):*' users $users
Скрипт автозавершения _ssh_hosts
сначала обнаруживает host
tag в своем первом ветвлении if-else. Если тег установлен, он использует этот тег вместо чтения из .ssh/config
.
Используйте следующую строку, чтобы отключить тег hosts
в zshrc:
zstyle ':completion:*:(ssh|scp|sftp):*' hosts
Тогда ssh
/scp
/sftp
должны будут завершать как Host
, так и Hostname
в конфигурации ssh.
Ответ или решение
Решение проблемы автозавершения SSH в Zsh: Как настроить автозавершение для Host вместо Hostname
Вопрос о том, как настроить автозавершение SSH в Zsh для использования поля Host
вместо поля Hostname
в вашем ~/.ssh/config
– это распространенная проблема, с которой сталкиваются многие пользователи, пытающиеся упростить свои действия в терминале. В этом ответе я предложу детальное решение и объясню, как правильно настроить ваш файл конфигурации Zsh, чтобы достичь желаемого результата.
Проблема
При использовании команды ssh
с автозавершением, если вы вводите ssh sta[TAB]
, система завершает команду до полного имени хоста, в данном случае staging.rfc.crmpicco.co.uk
. Это может привести к ошибкам, поскольку SSH пытается войти с вашим текущим терминальным пользователем, вместо того чтобы использовать указанный в конфигурации пользователя, например, crmpicco
.
Рекомендации по настройке
Чтобы исправить данную проблему и настроить автозавершение таким образом, чтобы оно использовало значение Host
, вам необходимо выполнить следующие шаги в вашем файле ~/.zshrc
:
-
Отключите использование тега
hosts
:
Ваша настройка автозавершения должна инициировать поддержкуHost
в вашем файле конфигурации SSH. Для этого вам нужно отключить тегhosts
в Zsh, чтобы избежать конфликта сHostname
. Вы можете сделать это, добавив следующую строку в ваш файл~/.zshrc
:zstyle ':completion:*:(ssh|scp|sftp):*' hosts
Эта строка позволит Zsh рассматривать как
Host
, так иHostname
при автозавершении, что решит вашу проблему. -
Настройте дополнительные параметры завершения:
Убедитесь, что ваши настройки завершения для SSH являются полными и надежными. Включите параметр, который будет использовать значенияHost
иUser
. Ваш файл~/.zshrc
должен выглядеть следующим образом:# Highlight the current autocomplete option zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" # Better SSH/Rsync/SCP Autocomplete zstyle ':completion:*:(scp|rsync):*' tag-order ' hosts:-ipaddr:ip\ address hosts:-host:host files' zstyle ':completion:*:(ssh|scp|rsync):*:hosts-host' ignored-patterns '*(.|:)*' loopback ip6-loopback localhost ip6-localhost broadcasthost zstyle ':completion:*:(ssh|scp|rsync):*:hosts-ipaddr' ignored-patterns '^(<->.<->.<->.<->|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.<->' '255.255.255.255' '::1' 'fe80::*' # Support for user completion zstyle ':completion:*:(ssh|scp|ftp|sftp):*' users $users # Allow for autocomplete to be case insensitive zstyle ':completion:*' matcher-list '' 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' \ '+l:|?=** r:|?=**' # Initialize the autocompletion autoload -Uz compinit && compinit -i
Проверка изменений
После внесения изменений в файл ~/.zshrc
, не забудьте перезагрузить вашу оболочку или выполнить команду source ~/.zshrc
, чтобы обновить настройки. Теперь, когда вы введете ssh sta[TAB]
, система должна корректно завершать команду с использованием значения Host
, в этом случае — staging
, вместо полного имени хоста.
Заключение
Настройка автозавершения для использования Host
вместо Hostname
в Zsh — это простой процесс, который позволяет повысить удобство и эффективность работы в терминале. Отключив тег hosts
и откорректировав настройки завершения, вы сможете избежать ошибок доступа и упростить процесс подключения к вашим серверам. Надеюсь, это руководство поможет вам успешно настроить вашу оболочку Zsh для лучшего опыта работы с SSH.