web-dev-qa-db-ja.com

Bashスクリプトでのタイムアウトが予想されます

次のスクリプトで「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
Bijo

マンページによると、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\"
")
13
DerfK

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

"[[-opts] pat1 body1] ... [-opts] patn [bodyn]が必要です

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

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

Expectステートメント全体の引数に複数の行が必要な場合、各行がバックスラッシュで終了しないように、すべての引数を1つに「分割」することができます。この1つのケースでは、ブレースにもかかわらず、通常のTcl置換が行われます。

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

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

2
mdpc

@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"
1
glenn jackman