7

サーバーに ssh して sudo su を送信し、iptables のステータスを確認して、出力をサーバーのログ ファイルに出力するようなスクリプトを作成しようとしています。以下はスクリプトです。

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」と表示されます。これは、expect がこれらのコマンドを理解していないためだと思います。それを回避する方法。助けてください。ありがとう。

4

2 に答える 2

15

問題はこの行にあります

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

Tcl (およびそれゆえに期待される) では、角括弧はコマンド置換の構文です (シェルのバッククォートのように)。したがって、括弧をエスケープするか、さまざまな展開を防ぐ別の引用符を使用する必要があります。

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

これは別の問題を引き起こします: これらの正確な文字が表示されることを期待していますか? それを正規表現として扱うことを期待しているため、正規表現の角括弧は文字クラスを意味するため、「s」、「u」、「d」、または「o」のいずれかの単一の文字と一致します。 '。したがって、おそらく必要なのは次のとおりです。

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

また

-ex {[sudo] password for subhasish:} {send "$password\r"}
于 2013-04-26T02:24:32.730 に答える
4

ありがとうグレン、それは今働いています。それが機能しなかったもう 1 つの理由は、通常のログインと sudo ログインの間でスリープする必要があることです。それ以外の場合は、$ プロンプトが返される前に「sudo su」が送信されていました。

#!/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 $user@$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
于 2013-04-29T15:30:41.763 に答える