2013-04-25 12 views
5

私はサーバにsshする予定のスクリプトを書こうとしています。sudo suを送り、iptablesの状態をチェックしてサーバのログファイルに出力します。以下はスクリプトです。スクリプトがsshに無効なコマンド名を返すことを期待してください

1 #!/usr/bin/expect 
    2 exp_internal 1 
    3 log_user 0 
    4 set timeout 10 
    5 set password "******" 
    6 
    7 spawn /usr/bin/ssh -l subhasish *.*.*.* -p 10022 
    8 
    9 expect { 
10  -re "password: " {send "$password\r"} 
11  -re "$ " {send "sudo su\r"} 
12  -re "[sudo] password for subhasish:" {send "$password\r"} 
13  -re "# " {send "service iptables status\r"} 
14  } 
15 set output $expect_out(buffer) 
16 send "exit\r" 
17 puts "$output\r\n" >> output.log 

しかし、デバッグモードで実行している間、このようなエラーが発生しています。

expect -d testcase 
expect version 5.44.1.15 
argv[0] = expect argv[1] = -d argv[2] = testcase 
set argc 0 
set argv0 "testcase" 
set argv "" 
executing commands from command file testcase 
parent: waiting for sync byte 
parent: telling child to go ahead 
parent: now unsynchronized from child 
spawn: returns {24105} 
invalid command name "sudo" 
    while executing 
"sudo" 
    invoked from within 
"expect { 
    -re "password: " {send "$password\r"} 
    -re "$ " {send "sudo su\r"} 
    -re "[sudo] password for subhasish:" {send "$password\r"} 
..." 
    (file "testcase" line 9) 

どこが間違っているのかわかりません。それは無効なコマンド名 "sudo"と言いますが、これは予期しないことだと思います。それを回る方法。助けてください。ありがとう。

答えて

11

問題は、このライン

-re "[sudo] password for subhasish:" {send "$password\r"} 
Tclで

(ひいては期待で)大括弧は(シェルでバッククォートのような)コマンド置換の構文であるです。

別の問題が表示されます
-re {[sudo] password for subhasish:} {send "$password\r"} 

:あなたはこれらの正確な文字を見ることが期待されているので、あなたは括弧をエスケープするか、様々な拡張を防ぐ別の引用符を使用する必要があるのいずれか?あなたは正規表現としてそれを扱うように命令しているので、正規表現の大括弧は文字クラスを意味するので、a、s、u、d、oのいずれかの文字と一致します'

-re {\[sudo\] password for subhasish:} {send "$password\r"} 

または

-ex {[sudo] password for subhasish:} {send "$password\r"} 
+0

私はsudo suが "サブハッシュのためのパスワード:"を期待していたことを変更しました。更新されたコードを使用して、 #!/ usr/bin/expect -f #!/binに/ bashの セットタイムアウト60 LOG_USER 1 セットホスト*。*。*。* セットパスワード****** セットユーザーsubhasish セットのログファイルoutput.txtと 産卵のssh -p 10022 $ユーザー@ $ホスト は期待 "* assword:*?" 送信 - "$パスワード\ rを" LOG_USER 1 は "$" 送信期待 - "sudoの秀\ rを" は "パスワードsubhasishのために:" 期待 送信 - - "$ password \ r" "#" send - "サービスiptablesステータス\ r" log_file /home/subhasish/output.log "#" log_file send - "exit \ r"; send - "exit \ r"; exit 0 –

+0

手動ロギングは次のようになります。[root @ localhost subhasish]#ssh -p 10022 [email protected]*.*.*.* [email protected]*.*.*.*パスワード: 最終ログイン:月*。*。*からApr 29 07:19:52 2013。* [subhasish testhost @〜] $ sudoの秀 [sudoの] subhasishのパスワード: [ルート@ testhost subhasish]# –

+0

デバッグスクリプトは、そのがで立ち往生示し期待: を期待:「ん\ rを\ NLASTログイン:月¥¥*¥*¥*¥*¥*¥*¥0001b】0; subhasish @ testhost:〜¥u0007 "(spawn_id exp4)マッチグロブパターン" subhasishのパスワード: "?いいえ [subhasish @ testhost〜] $ expect: "\ r \ n最後のログイン:Mon Apr 29 07:35:36 2013 *。*。*。* \ r \ r \ n \ u001b] 0; subhasish @ testhost:〜\ u0007 \ u001b [?1034h [subhasish @ testhost〜] $ "(spawn_id exp4)マッチグロブパターン" subhasishのパスワード: "?いいえ –

3

おかげグレンが、それは今働いている:だから何あなたはおそらく必要なのはこれです。それは働いていなかった理由はもう一つの理由は、それがコードがあり、ここで、$プロンプトが返される前に、それ以外の場合は、「sudoの秀は」他の人に参考のために、送信された、通常のログインとsudoのログインの間スリープする必要がありました

#!/usr/bin/expect -f 
#! /bin/bash 

set timeout 60 
log_user 1 
set host *.*.*.* 
set password ****** 
set user subhasish 
set logfile output.txt 
spawn ssh -p 10022 [email protected]$host 
expect "*?assword:*" 
send -- "$password\r" 
#log_user 1 
sleep 2 
expect "$" 
send -- "sudo su\r" 
expect -gl {*password for subhasish:*} 
send -- "$password\r" 
expect "#" 
send -- "service iptables status\r" 
log_file /home/subhasish/output.log 
expect "#" 
log_file 
send -- "exit\r"; 
send -- "exit\r"; 
exit 0 
+0

プロンプトを待つことは非常に役に立ちました。 – phyatt

関連する問題