zsh ssh автозавершение Host вместо Hostname из ~/.ssh/hosts

Вопрос или проблема

Есть ли способ изменить мой ~/.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:

  1. Отключите использование тега hosts:
    Ваша настройка автозавершения должна инициировать поддержку Host в вашем файле конфигурации SSH. Для этого вам нужно отключить тег hosts в Zsh, чтобы избежать конфликта с Hostname. Вы можете сделать это, добавив следующую строку в ваш файл ~/.zshrc:

    zstyle ':completion:*:(ssh|scp|sftp):*' hosts

    Эта строка позволит Zsh рассматривать как Host, так и Hostname при автозавершении, что решит вашу проблему.

  2. Настройте дополнительные параметры завершения:
    Убедитесь, что ваши настройки завершения для 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 '^(&lt;-&gt;.&lt;-&gt;.&lt;-&gt;.&lt;-&gt;|(|::)([[:xdigit:].]##:(#c,2))##(|%*))' '127.0.0.&lt;-&gt;' '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.

Оцените материал
Добавить комментарий

Капча загружается...