SSH と shell の補完 (completion)

SSH と shell の補完 (completion) について少々調べました.(2005/3/13 すこし改訂)

注: 調べた環境は Debian unstable です.version は Debian のパッケージの version です.

OpenSSH 4.0より, known_hostsファイルにおいて生のホスト名やIPアドレスを記録せず, ハッシュ値を記録することができるようになりました. これはログインしたホストの情報を他者に知られないようにするための機能です. この機能はいまのところデフォルトでは無効ですが, 将来有効なる模様です. この機能を利用する場合, known_hostsファイルを利用する補完が利用できなくなります. またもしこの機能を利用するならば, シェルの履歴ファイルにおいて, sshなどのコマンドの記録を取らないようにしなければならないでしょう.

bash (2.05b-5)

/etc/bash_completion ファイルを読みこむことで ssh,scp で ホスト名などの補完が行なえます.

ホスト名は

から抽出されます.

zsh (4.0.6-18)

${HOME}/.zshrc にて


autoload -U compinit
compinit

とすることで ssh,rcp,rsync などで ホスト名などの補完が行なえます. ホスト名は /etc/hosts から抽出されます.bash と同様にしたかったので調べたところ先の補完の設定をする前に変数 _cache_hosts を設定しておけばいいようです.

私は ${HOME}/.zshrc にて


_cache_hosts=(`perl -ne  'if (/^([a-zA-Z0-9.-]+)/) { print "$1\n";}'
~/.ssh/known_hosts`)
autoload -U compinit
compinit

としています.

known_hostsファイルはハッシュ化されてしまったので, ~/.ssh/configから取るようにしました(2009/12/18).


_cache_hosts=(`ruby -ne 'if /^Host\s+(.+)$/; print $1.strip, "\n"; end' ~/.ssh/config`)
autoload -U compinit
compinit

rsync -av などのあとで ホスト名を補完できるのは大変楽です. (補完候補の一覧にはでないのですが. いつからかでるようになっていました)

compctl を利用する設定方法もあります.

tcsh (tcsh-kanji 6.11.00-2.2)

ファイル /usr/share/doc/tcsh-kanji/examples/complete.tcsh.gz を伸長したものには rsh の定義はあっても ssh の定義はないので complete.tcsh.gz を伸長したもののなかで rsh のものを流用するように設定します.


    complete ssh        p/1/\$hosts/ c/-/"(l n)"/   n/-l/u/ N/-l/c/ n/-/c/ p/2/c/ p/*/f/

ホスト名などの補完が行なえます.ホスト名は,

から抽出されます.

bash と同様にするにはcomplete.tcsh.gz を伸長したもので 変数 hosts を設定しているところ変更します.

文責:春山 征吾 (HARUYAMA Seigo)
email: haruyama@unixuser.org