Bash

SSH 和 SCP 的自動完成伺服器名稱

  • February 7, 2022

我在 中配置了一些伺服器~/.ssh/config,例如alphabeta。如何配置 Bash 以使命令和自動完成已配置伺服器的名稱?$ ssh alTab```$ scp file.tgz al`Tab``

我不想每次添加伺服器時都將伺服器添加到另一個文件(即 Bash 數組),因為我們會定期添加和刪除伺服器,而且列表非常大。

這是在 Kubuntu 12.10 上,我確實安裝了bash-completion

找到了!!

似乎在 Ubuntu中的條目~/.ssh/known_hosts是 hashed,因此 SSH 完成無法讀取它們。這是一個功能,而不是一個錯誤。即使通過添加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 ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

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

將該腳本放入/etc/bash_completion.d/ssh,然後使用以下命令獲取它:

$ . /etc/bash_completion.d/ssh

我發現本指南非常寶貴,如果沒有它,我將無法編寫此指南。感謝Steve Kemp寫了這麼棒的指南!

引用自:https://unix.stackexchange.com/questions/136351