2012-02-20 19 views
0

私はパスワード変数$pwとコマンド変数$cmdを持っています。私はback-tick
を使用してコマンドを実行した場合リモートで実行されたコマンドをperlで期待通りに出力する

$pw=UNIX password of a remote machine. 

$cmd=Command to be executed in the remote machine. 

は、今私は出力変数に何らかの値を取得することができます。

私は同じコマンドを実行する場合は、私は同じを達成するために期待しています。私は、コマンドの出力を変数に期待通りに走らせる方法を意味します。

は機能が似ている期待の私:

sub expt($$){ 
my $cmd; 
my $timeout; 
    ($cmd, $pw)[email protected]_; 
$expect = Expect->new; 
$expect->raw_pty(1); 
printDebug("Running the command under expt"); 
$expect->spawn($cmd) 
    or die "Cannot spawn $cmd: $!\n"; 
$expect->expect($timeout, 
      [ qr/password:/i, #/ 
       sub { 
        my $self = shift; 
        $self->send("$pw\n"); 
        exp_continue; 
       } 
      ], 
      [qr/Are you sure you want to continue connecting \(yes\/no\)?/ 
       , sub { my $self = shift; 
            $self->send("yes\n"); 
            exp_continue; }], 
      [qr/Unix password \(user\):/ 
       , sub { my $self = shift; 
            $self->send("pw\n"); 
            exp_continue; } 
      ],      
       ); 

$expect->soft_close(); 
    return 0;    
} 

そして私は、私は、リモート・ホストでスクリプトを実行することができています。これにより

expt($cmd,$pw); 

のような関数を呼び出していますが、私の要件がにありますリモートホストの出力をローカル変数に格納します。

答えて

1

なぜ使用しないNet::SSH::Expect?これは、第一の方法により近いでしょう:あなたは「単なる」そのような何かを実行する必要があります。

my $ssh = Net::SSH::Expect->new (
     host => "myserver.com", 
     user => 'myuser', 
     raw_pty => 1 
    ); 
$ssh->run_ssh() or die "SSH process couldn't start: $!"; 
($ssh->read_all(2) =~ />\s*\z/) or die "where's the remote prompt?" 
$ssh->exec("stty raw -echo"); 
my $output = $ssh->exec($cmd); 

は、Net::SSH::Expectポッドのドキュメントを見てください、それは非常に広範です。

+0

私はいくつかの期待パターンにマッチしているし、スクリプトがsshをやっていないので、他のツールでmachinsにログインしていますが、これらのツールもパスワードが必要なので、パスワード入力の回数を減らしています。私が与えたsshは、実際のスクリプトがパスワードを複数のパターンマッチに渡すだけの例であり、リモートホストの実行があるときは必ず出力が必要です。 – user1068861

+0

正確です。私たちはあなたが尋ねる質問にのみ答えることができます;)このモジュールを使用して、 "send"、 "read_all"などの方法で遊ぶことができます。 – Ouki

+0

私が '' seq 1 10'のiのために "pogo --namespace yap run --job-timeout 720000 --timeout 360000 -I @ yap.ws.yosprod.sp1"のようなコマンドを渡したとすると、echo $ i;スリープ3; done ''このコマンドは複数のホスト上で実行され、ホストは即座に決定しますが、私はこれらのコマンドの出力を実行可能にします – user1068861

関連する問題