2012-09-04 3 views
1

다음번 루프는 출력을 생성하지 않습니다. 마지막 exp-> expect (5) 행 (잠자기의 종류)이없는 경우. 루프가 '보낸'명령을 완료하는 데 '너무 빠름'으로 실행 중이기 때문에 이것이라고 생각합니다. 다음 명령이 이전 명령이 완료 될 때만 실행되도록하려면 어떻게해야합니까? 로그 파일에 출력을 수집 중입니다.perl은 원격으로 30 개의 명령을 수행 할 것을 기대합니다.

모든 조언, pl.

ty.

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

답변

0

은 아마 당신은 패턴이 qr/($|#)/에 따라 일치하는 경우에만 내가 sub{...} 실행 내부의 문을 생각 또한

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

로 삼았 exp_continue를 사용해야합니다. 또한 입력 또는 명령을 입력 한 후에는 일반적으로 명령을 실행하기 위해 리턴 키를 누르므로 $cmd\n이라고 생각합니다.

+0

$ cmd를 마지막에 개행 문자가 있습니다. 그래서 나는 다른 것을 공급할 필요가 없다. – rajeev

+0

exp_continue를 사용하면 동일한 명령이 계속 실행됩니다. 끊이지 않는 루프를 죽여야합니다. – rajeev

0

Net :: OpenSSH에서이 작업을 수행 할 수없는 이유가 있습니까? 그 문서에서

, 당신은 (당신이 STDOUT 또는 STDOUT 그 과정에서 STDERR 단지를 캡처 할 필요가 있는지 여부에 따라) 캡처()/capture2() 메소드 를 사용할 수 있습니다. 예를 들어

:

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

내가 그 일을한다고 생각, 아니?

는 (난 그냥 죽은 - 간단한 스크립트로 이것을 테스트했습니다, 그리고 그것은 나를 위해 잘 작동.)

+0

예, 가능합니다. 하지만 여기에 다른 사용자로 ssh를 사용하고 다른 이드에게 sudo를 실행하면 그 시점에서 기대 한대로 실행해야합니다. – rajeev

관련 문제