2017-01-28 4 views
0

ファイルをscpしている間に/ tmpフォルダに特権がなく、実行中にsudo特権がない場合はタイムアウトを追加したいあなたはタイムアウトで何かをするだけではなく、記載されたパターンを待って停止したい場合は、「タイムアウト」のパターンを必要とするリモートサーバにファイルをscpしている間にタイムアウトを追加する方法とexpectスクリプトを使ってsudoする特権がない場合

spawn scp -o StrictHostKeyChecking=no \ 
    /tmp/rem_script.sh $env(user_name)@$env(first_db_node_ip):/tmp 
expect "password:" 
send -- "$env(rem_password)\r" 
expect eof 

spawn ssh -o StrictHostKeyChecking=no $env(user_name)@$env(first_db_node_ip) 
expect "password:" 
send -- "$env(rem_password)\r" 

expect -ex $ 
send "PS1=UGLY-PROMPT'# '\r" 
expect "UGLY-PROMPT# " 

send "sudo chmod 777 /tmp/rem_script.sh\r" 
expect { 
    "password:" { 
    send -- "$env(rem_password)\r" 
    exp_continue 
    } 
    "UGLY-PROMPT# " {} 
} 

send "sudo sh /tmp/rem_script.sh $env(asrm_name) $env(com_str)\r" 
expect { 
    "password:" { 
    send -- "$env(rem_password)\r" 
    exp_continue 
    } 
    -timeout 60 "UGLY-PROMPT# " {} 
} 

send "exit\r" 
expect eof 

答えて

0

を提案してくださいscript.Could以下でsudoコマンド。次のようなもの:

send "sudo sh /tmp/rem_script.sh $env(asrm_name) $env(com_str)\r" 
expect { 
    -timeout 60 
    "password:" { 
     send -- "$env(rem_password)\r" 
     exp_continue 
    } 
    timeout { send_user "timed out!" } 
    "UGLY-PROMPT# " {} 
} 

他のパターンがタイムアウトするのを待っていてもかまいません。

sudoやその他の権限が必要な場合は、エラーメッセージを具体的に探したいパターンを追加することもできます。

+0

こんにちはTim、あなたが追加したタイムアウトは、スクリプト全体を実行するのに効果的でしょうか?または、パスワードを期待する時間だけ?スクリプトは60秒以上かかる場合に起こります。その場合、間に終了しますか?私が間違っている場合に私を修正してください。 –

+0

タイムアウトは、 "sudo sh"コマンドからの応答です。この場合、期待されるパターンが60秒以内に見られない場合、 "send_user"コマンドはテキストを "タイムアウト!"ユーザー出力に出力します。スクリプトを終了させたい場合は、exitコマンドをそのブロックに入れる必要があります。 グローバルタイムアウトブロックを作成する方法がわかりません。私はこれを行う必要がないと感じたことはありません。ドキュメントを見ているものは見つけられません。 –

+0

私の間違いを訂正する編集された答えは次の答えで指摘されました。 –

1

the accepted answerに次のコードは、ませ仕事ん:代わりに、私たちはexpect {}ブロックに-timeout Nを入れて

expect -timeout 60 { 
    "password:" { 
     send -- "$env(rem_password)\r" 
     exp_continue 
    } 
    timeout { send_user "timed out!" } 
    "UGLY-PROMPT# " {} 
} 

を持っています。次の例を参照してください。

[STEP 101] $ cat foo.exp 
proc expect_prompt {} { 
    global spawn_id 
    expect -re {bash-[.0-9]+(#|\$)} 
} 

spawn bash --norc --noprofile 

expect -timeout 2 { 
    not-found {} 
    timeout { 
     send_user ">>> you should never see this.\n" 
    } 
} 

expect { 
    -timeout 2 not-found {} 
    timeout { 
     send_user ">>> instead, you would see this.\n" 
    } 
} 

expect_prompt 
send "exit\r" 
expect eof 
[STEP 102] $ expect foo.exp 
spawn bash --norc --noprofile 
bash-4.4$ >>> instead, you would see this. 
exit 
exit 
[STEP 103] $ 
関連する問題