8

telnetを自動化するexpectスクリプトを作成しようとしています。これは私がこれまでに持っているものです。

#!/usr/bin/expect
# Test expect script to telnet.

spawn telnet 10.62.136.252
expect "foobox login:"
send "foo1\r"
expect "Password:"
send "foo2\r"
send "echo HELLO WORLD\r"
# end of expect script.

基本的に、私がやりたいのは、次のIPアドレスにtelnetで接続してから、HELLOWORLDをエコーすることです。ただし、telnetを試行した後、スクリプトが失敗したようです...ログインとパスワードの入力を受け入れることができるかどうかはわかりませんが、HELLOWORLDをエコーし​​ていません。代わりに、次の出力を取得します。

cheungj@sfgpws30:~/justin> ./hpuxrama 
spawn telnet 10.62.136.252
Trying 10.62.136.252...
Connected to 10.62.136.252.
Escape character is '^]'.
Welcome to openSUSE 11.1 - Kernel 2.6.27.7-9-pae (7).

foobox login: foo1
Password: foo2~/justin> 
4

4 に答える 4

6

わかりにくいですが、貼り付けている出力からは次のようになります。

  1. 次のコマンドを送信する前に、スクリプトがログインの完了を待機していません。
  2. 出力が表示される前に、スクリプトが終了してプロセスを閉じています。

人生に保証はありませんが、最初のステップとしてこれを試してみます。

#!/usr/bin/expect -f

spawn telnet 10.62.136.252
expect "foobox login:"
send "foo1\r"
expect "Password:"
send "foo2\r"

# Wait for a prompt. Adjust as needed to match the expected prompt.
expect "justin>"
send "echo HELLO WORLD\r"

# Wait 5 seconds before exiting script and closing all processes.
sleep 5

代替案

スクリプトを手動でプログラミングしても機能しない場合は、Expect に付属の autoexpect スクリプトを試してください。コマンドを手動で実行すると、autoexpect はそれらのコマンドに基づいて Expect タイプスクリプトを生成し、必要に応じて編集できます。

これは、特に問題を特定するのが難しい場合に、Expect が実際に何を見ているかを知る良い方法です。これにより、何年にもわたってデバッグ時間を大幅に節約できます。上記の解決策がうまくいかない場合は、試してみる価値があります。

于 2012-06-28T22:20:23.657 に答える
5

echo最初にプロンプ​​トを期待せずにコマンドを送信しています。試す:

# after sending the password
expect -re "> ?$"
send "echo HELLO WORLD\r"
expect eof
于 2012-06-28T22:18:46.433 に答える
1

この StackOverflow Questionを見たことがありますか?

彼は中括弧を使用して物事を機能させているようです。

于 2012-06-28T18:22:38.287 に答える