1

次のループは、出力 IF を生成しません。最後の exp->expect(5) 行 (一種のスリープ) がありません。これは、「送信済み」コマンドが終了するにはループが「速すぎる」ために実行されているためだと思います。前のコマンドが終了したときにのみ次のコマンドが実行されるようにするにはどうすればよいですか? ログファイルに出力を収集しています。

アドバイス、pl。

タイ。

use Expect;
...
...
foreach my $cmd (@cmd_array){
$exp->expect(3,
    [ qr/($|#)/ => sub { shift->send("$cmd");}]
       );
exp->expect(5);
}
4

2 に答える 2

0

exp_continueたぶん、次のように使用する必要があります-

use Expect;
...
...
foreach my $cmd (@cmd_array){
$exp->expect(3,
    [ qr/($|#)/ => sub { shift->send("$cmd\n");
                         exp_continue;}]
       );
}

sub{...}また、パターンが に従って一致する場合にのみ、内部のステートメントが実行されると思いますqr/($|#)/。また、入力またはコマンドを入力した後、通常はリターンキーを押してコマンドを実行すると思います$cmd\n

于 2012-09-05T01:12:38.380 に答える
0

Net::OpenSSH にこれを任せられない理由はありますか?

そのドキュメントから、capture() / capture2() メソッドを使用できます (プロセスから STDOUT または STDOUT と STDERR のみをキャプチャする必要があるかどうかによって異なります)。

例えば:

for my $command (@commands) {
    my $result = $ssh->capture($command);
}

うまくいくはずだと思いますよね?

(非常に単純なスクリプトでこれをテストしたところ、問題なく動作しました。)

于 2012-09-06T09:58:27.463 に答える