Bashスクリプトでタイムアウトを予期する


13

次のスクリプトで「expect」のタイムアウトを追加するにはどうすればよいですか?120秒に設定したい。

#!/bin/bash
HOST="localhost"
USER="myuname"
PASS="mypassword"

VAR=$(expect -c "
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

echo "==============="
echo "$VAR"

回答:


13

のデフォルトのタイムアウトexpectは、マンページによると10秒です。120秒に変更するには、前spawn ssh $USER@$HOSTに、行を追加します

set timeout 120

これを作るために

VAR=$(expect -c "
set timeout 120
spawn ssh $USER@$HOST
expect \"password:\"
send \"$PASS\r\"
expect \"\\\\$\"
send \"ls\r\"
expect -re \"$USER.*\"
send \"logout\"
")

2

expectの次のmanページの抜粋によると:

"[[-opts] pat1 body1]を期待します... [-opts] patn [bodyn]

パターンの1つが生成されたプロセスの出力と一致するか、指定された期間が経過するか、ファイルの終わりが表示されるまで待機します。最終ボディが空の場合、省略できます。

最新のexpect_beforeコマンドのパターンは、他のパターンの前に暗黙的に使用されます。最新のexpect_afterコマンドのパターンは、他のパターンの後に暗黙的に使用されます。

expect文全体の引数に複数の行が必要な場合、すべての引数を1行に「ブレース」して、各行をバックスラッシュで終了させないようにすることができます。この1つのケースでは、通常のTcl置換がブレースにかかわらず発生します。

パターンがキーワードeofである場合、対応する本文はファイルの終わりで実行されます。パターンがキーワードtimeoutの場合、対応する本文はタイムアウト時に実行されます。タイムアウトキーワードを使用しない場合、タイムアウト時に暗黙的なヌルアクションが実行されます。デフォルトのタイムアウト期間は10秒ですが、「set timeout 30」コマンドによって、たとえば30に設定できます。無限タイムアウトは、値-1で指定できます。パターンがキーワードのデフォルトである場合、対応するボディはタイムアウトまたはファイルの終わりのいずれかで実行されます。

パターンが一致すると、対応する本文が実行されます。expectは本文の結果を返します(一致するパターンがない場合は空の文字列)。複数のパターンが一致する場合、最初に表示されるパターンを使用してボディが選択されます。...」


1

@DerfKはあなたの質問に答えました。ただし、メンテナンスのためにスクリプトをリファクタリングします。

#!/bin/bash
export HOST="localhost"
export USER="myuname"
export PASS="mypassword"

script=<<'END_OF_SCRIPT'
    set timeout 120
    spawn ssh $env(USER)@$env(HOST)
    expect "password:"
    send "$env(PASS)\r"
    expect "\$"
    send "ls\r"
    expect -re "$env(USER).*"
    send "logout"
    expect eof
END_OF_SCRIPT

VAR=$(expect -c "$script")

echo "==============="
echo "$VAR"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.