パスワードを指定してSSHコマンドを実行する

■前置き

サーバを10台とか100台とか管理している状況を想像してみてください。

その10台に全く同じファイルをコピーしたいとか
全く同じコマンドを実行させたいとか
同じ操作をしたくなる状況は多々あると思います。
普通にsshで1台1台にログインして操作すればいいのですが
数が多くなると面倒なので、なんとかスクリプトを組みたいと思うものです。
流石に100回も同じパスワードを打ちたくないですし。

■既存の手法

公開鍵を各サーバに登録してしまえば
自作スクリプトなり、psshなり、codeployなり、選択肢はあれこれありますが
ここでは鍵を登録していない状況で操作するための方法を考えます。

■expectを使った方法

サーバ側に特に準備をしない方法として
expectを使う手があります。
こんな感じのスクリプトを作ります。
ちなみに操作するPC側にはexpectをインストールする必要があります。

#!/usr/local/bin/bash

expect -c "
set timeout 5
spawn ssh $1
expect 'rsa\':'
send \r
expect 'password:'
send $2\r
interact
"

expectは対話的な操作を実行するプログラムです。
spawn hogehogeを実行し、
expect "hoge"で、hogeという出力を読み、send "hoge\r"hogeを入力します。
expect 'password:'みたいにやれば、パスワードの入力を求められた時に、
次のsendでパスワードを入力することができるわけです。

通常は1行目は
#!/usr/local/bin/expect にするらしいですが、
bashを経由して expect -c "中身" のようにすることによって
$1を引数として渡せるらしいです。

このスクリプトをexsshなんて名前にして
# exssh user@server password
のようにそれぞれ指定して実行すれば、勝手にログインしてくれます。
$3で、実行させたいコマンドを指定できるように改造してもいいでしょう。

あるいは
# exssh "user@server reboot" password
のように、$1の一部としてコマンドを指定する手もあります。