いくつかのサーバーを~/.ssh/config
、alpha
やbeta
など。コマンドssh al<tab>
およびscp file.tgz al<tab>
構成済みサーバーの名前をオートコンプリートしますか?
サーバーを定期的に追加および削除し、リストが非常に大きいため、サーバーが追加されるたびにanotherファイル(つまり、Bash配列)にサーバーを追加したくありません。
見つけた!!
Ubuntuでは ~/.ssh/known_hosts
のエントリはハッシュ化されている のようです。そのため、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 そのすばらしいガイドを書いてくれてありがとう!
どのディストリビューションを使用しているかは言いませんが、私のFedora 19システムには次のパッケージbash-completion
がインストールされています。これは、この完了ルールファイルを通じてこの機能を提供します。
/usr/share/bash-completion/completions/ssh
これが私がインストールしたパッケージです:
$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch
そのルールファイルを確認すると、$HOME/.ssh/config
ファイルを照会しているスタンザが表示されます。
$ grep config /usr/share/bash-completion/completions/ssh
local configfile
local -a config
# Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
configfile="$(dequote "${1:2}")"
[[ $1 ]] && configfile="$(dequote "$1")"
_known_hosts_real -a -F "$configfile" "$cur"
local configfile
# Search COMP_WORDS for '-F configfile' argument
configfile="$(dequote "${1:2}")"
[[ $1 ]] && configfile="$(dequote "$1")"
_known_hosts_real -a -F "$configfile" "$cur"
local configfile prefix
# Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
configfile="$(dequote "${1:2}")"
[[ $1 ]] && configfile="$(dequote "$1")"
_known_hosts_real -c -a -F "$configfile" "$cur"
私はまた、この要点 known_hosts_autocomplete.sh を見つけました。これは、$HOME/.ssh/known_hosts
ファイルを除いて同様のことを行います。
# add to ~/.bash_profile, and close/reopen a Shell. Will autocomplete any
# hosts found in known_hosts.
complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh
何らかの理由でssh
の完了ルールファイルが既にパッケージ化されていない場合は、$HOME/.ssh/config
ファイルを使用して同様のことを行うことができます。
Ubuntuが既知のホストをハッシュするため、オートコンプリートが機能していないことがわかりました。あなたは付け加えられます
Host *
HashKnownHosts no
.ssh/config
ファイルですが、既存のホストはハッシュ化されません。
DebianとUbuntuでssh自動補完を有効にするには:
Sudo apt-get install bash-completion
これには何もする必要がないがあり、known_hostsハッシュを使用することに注意してください。これは、上記の説明と元の質問とは異なります。 known_hostsからオートコンプリートする場合は、もちろんハッシュを無効にする必要がありますが、これはstronglyに対して推奨されません。
たとえば、私は:
Host *
HashKnownHosts yes
私の.ssh/configにありますが、.ssh/configおよび/ etc/hostsにリストされているホストに対して、sshのオートコンプリートがうまく機能しています。 OPが述べているように、ホストを.ssh/configに追加する必要があります。
ホストmy-awesome-Hostホスト名the.real.Host.name
(または、Debian/Ubuntuスクリプトの別のソースである/ etc/hostsにHostエントリーを追加できます。)
次に、ssh my-awe<tab>
と入力するだけで、自動的に完了します。繰り返しますが、これはHashKnownHostsの場合でも同様です。 (bashシェルでbash補完を有効にする必要があり、ディストリビューション用に上記のようにこれらのスクリプトを具体的にインストールする必要があることに注意してください。)
次に、これらの行を.bashrc
に追加して有効にします(ログアウトして再度ログインするか、新しいbash
を入力して新しいシェルを起動するだけです(有効にする必要はありません)。 /etc/bash.bashrc
および/etc/profile
ソース/etc/bash.bashrc
)ですでに有効になっている場合)。
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
これにより、~/.ssh/config
、/etc/hosts
などからのsshオートコンプリートが有効になります。
Debianのデフォルトはbashではなくashであることに注意してください。簡単にbashに切り替えることができます:
Sudo usermod -s /bin/bash "$USER"
(これを有効にするには、ログアウトしてから再度ログインする必要があります。)
Ubuntu 14.04では、ssh
は、~/.ssh/config
私がよくアクセスするサーバーの1つだけがオートコンプリートにアクセスしていることに気付いたとき、私はそれに気付きました。 2つの唯一の違いは、認証に関連するssh構成ファイルのエントリでした。他のサーバーの構成ファイルに新しいエントリを追加すると、オートコンプリートも開始されました。
これは尋ねていた人々のためのエントリーです:
Host server-name
GSSAPIAuthentication=no
(もちろん、まだ有効である限り)configで何を指定しているかが重要であるとしたら、私は非常に驚きます。