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 については以下などを参照のこと。