3

SSH を介してシステムにログインし、いくつかのコマンドを実行するための一般的な期待スクリプトを作成したいと考えています。私が見つけた例は次のとおりです。

#!/usr/bin/expect

set fid [open ./.secret]
set password [read $fid]
close $fid
spawn /usr/bin/ssh root@[lindex $argv 0]
expect {
  -re ".*Are.*.*yes.*no.*" {
    send "yes\n"
    exp_continue
    #look for the password prompt
  }

  "*?assword:*" {
    send $password
    send "\n"
  }
}

send -- "PS1='>'\r"
expect -re ">$" { send "hostname\r" }
expect -re ">$" { send "pwd\r" }

...スクリプトは正しくログインしているようですが、最後の 2 つの送信は実行されませんでした。アイデア?

編集: exp_internal を有効にした後、次のことに気付きました:

expect: does "" (spawn_id exp4) match glob pattern "*"? yes
expect: set expect_out(0,string) ""
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) ""
send: sending "PS1='>'\r" to { exp4 }
Gate keeper glob pattern for '>$' is '>'. Activating booster.

expect: does "" (spawn_id exp4) match regular expression ">$"? Gate ">"? gate=no


expect: does "\r\n" (spawn_id exp4) match regular expression ">$"? Gate ">"? gate=no
Last login: Tue Nov  6 14:13:31 2012 from 1.x.x.x

expect: does "\r\nLast login: Tue Nov  6 14:13:31 2012 from 1.x.x.x\r\r\n" (spawn_id exp4) match regular expression ">$"? Gate ">"? gate=no

PS1='>'\rプロンプトを上書きしたいので、送信しようとしています。プロンプトがどうなるかを予測する方法はないと思うので、どのようなパターンが予想されるかわかりません。上記から、プロンプトは変更されていないようです。このような問題にどのように取り組みますか?

4

1 に答える 1

1

スクリプトに明らかに問題はないようです(ただし、別のプロンプトを使用すると、照合が少し簡単になる場合があります)。それは微妙なことを意味します。これを追加することをお勧めします:

exp_debug 1

スクリプトの早い段階で。これにより、Expectエンジンは、何が行われているのかをより多く印刷できるようになります。これにより、(おそらく)何が問題になっているのか、または失敗しているのかを理解するのに役立ち、ここの人々があなたを助けてくれます…</ p>

于 2012-10-23T20:57:34.827 に答える