私たちの会社はコード操作を実行できるサーバーを提供しています。サーバーにログインするたびにパスワードを入力する必要があります。
~$ ssh -o StrictHostKeyChecking=no -p 22 [email protected]
Enter passphrase for key '/home/me/.ssh/id_rsa':
パスワードを入力してログインできます。
今度はパスワードを入力しないようにbashスクリプトを作成しようとしています。これは私のスクリプトです。
#!/usr/bin/expect -f
set ip x.x.x.x
set password mypwd
spawn ssh -o StrictHostKeyChecking=no -p 22 me@$ip
expect {
#"*yes/no" { send "yes\r"; exp_continue}
"*passphrase*" { send "$password\r" }
}
interact
しかし、スクリプトを実行すると期待どおりに動作しないようです。次の出力が表示されますが、それでも毎回パスワードを入力する必要があります。
spawn ssh -o StrictHostKeyChecking=no -p 22 [email protected]
Enter passphrase for key '/home/me/.ssh/id_rsa':
私は何が間違っていましたか?
さて、x.x.x.x
ちょうどIP4です。
答え1
*
"*passphrase*"
グローバルパターンをの始めと終わりに置くことは一致するだけなので意味がありません"passphrase"
。
問題は次のとおりですman expect
。時々、プロンプトと応答の間に遅延が必要です。。これは、アプリケーションがエコーをオフにし、その時点で入力をリフレッシュするために発生する可能性があります。少なくとも、プロンプトの最後の文字(この場合はコロン(スペースが来る可能性があります))と一致するように努力しなければパターンが"passphrase*:"
機能しません。
それでもそうでない場合は、短い待ち時間を追加してみてください。
{ sleep 0.5; send "$password\r" }
デバッグを実行して調査することもできますexpect -d
。