expectコマンドは、シェルの特定文字列の出力を待ち、任意文字を入力として与えることができる。
引数で渡すことのできないパスワード入力などに使われる。たとえばsshのパスワード入力の自動化とか。
expect -c " set timeout 5 spawn ssh hoge@serverHost expect \"password:\" send \"PASSWORD\n\" expect \"$\" interact "
このようにすると、sshがシェルスクリプト上で自動で実行できる。
expectコマンドは、一般に最後はinteractで終わらせる例が多く見つかるが、これはユーザの標準入力を受け付けるようにするコマンドである。 JenkinsJobやcrontabで実行した場合には画面がないため、interactがうまく実行できず、処理がおかしくなってしまう。 そのため、interactは使わないようにする。
ところで、このような処理が必要になる場合というのは、sshでリモートサーバのコマンドを自動実行するスクリプトであると考えられる。 その場合には、expectコマンドではなく、前記事で書いたように特定のコマンドのみ実行できる秘密鍵を登録してあげるほうが良い。