SSH 接続のパスワード入力を自動化するシェルスクリプトを作ってコマンド化した
MacOS にて実施。
SSH 接続する際、とある理由で公開鍵認証方式が使えず、sshpass という便利なツールも導入できなかったので、他の方法でパスワード入力を自動化する方法を調べた。
expect・spawn・send コマンドで作れる!
結論からいうと、以下のようなシェルスクリプトを作れば、SSH 接続とパスワード入力を自動化できる。
#!/bin/sh
expect -c "
set timeout 5
spawn ssh -p 22 【ユーザ名】@【接続先 URL】
expect \"Password:\"
send \"【パスワード文字列】\n\"
interact
"
expect -cで対話を自動化する。以降のコマンド全体をダブルクォートで囲んでいるset timeoutで応答がない場合のタイムアウト秒数を設定するspawnで任意のコマンド入力を再現するspawn直後のexpectで、指定の文言が出力されていることを確認する- 今回の場合、
sshコマンド実行後にパスワードを問われる「Password:」という文字列が出力されているかを確認している - ダブルクォートは
\でエスケープし、\"と書く
- 今回の場合、
sendでパスワード文字列の入力を再現している。エンターキーによる改行は\nを付与することで再現するinteractでプロセスの制御をユーザに渡し、ユーザからの標準入力を受け付けるようにする
というワケ。
こんなファイルを ~/myssh.sh に保存して、$ sh ~/myssh.sh という風に実行してやれば、自動 SSH ログインできるようになった。
コマンド化する
これだけでもだいぶ楽になったが、毎回 $ sh ~/myssh.sh とタイプするのは面倒だ。そこで、自作コマンドとして動作するようにする。
まずは PATH を確認する。最初から /usr/local/bin などに PATH が通っていると思うのでココに置いても良いが、今回はユーザホームの ~/bin/ 配下に自作コマンドを置きたいので、~/.bash_profile にて PATH を追加する。
# ~/.bash_profile
export PATH=~/bin:$PATH
このようにすると、~/ が展開されてユーザホームのフルパスを示すようになる。
$ echo $PATH
/Users/Neo/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
# 最初の「/Users/Neo/bin」がコレ。
編集後は $ . ~/.bash_profile で再読込する (ピリオド . は source コマンドと同じ)。
次に、先程作った myssh.sh を ~/bin/ 配下に移動し、名前を拡張子なしの myssh にリネームする。
リネームできたら、コマンドラインから以下の要領で全ユーザに実行権限を付ける。
$ chmod a+x ~/bin/myssh
ココまでできたら完成。以降は $ myssh と打つだけで自動 SSH ログインできるようになる。やったぜ。
参考文献
sshpass については以下などを参照のこと。