2016-04-23 22 views
1

私は、Perlでリモートマシンにsshするスクリプトを作成しようとしています。ssh perlスクリプトが実行されていません

私は何が間違っているのか分かりませんが、スクリプトを実行すると、パスワードを入力した後にrootパスワードと空白の出力が表示されます。ここで

は私のスクリプトです:

#!/usr/bin/perl 
use strict; 
use warnings; 

my @id=`ssh expert\@x.x.x.x`; 
print"@id"; 
+0

シェルプロンプトで「ssh [email protected]」と入力するとどうなりますか? – Marty

+1

あなたは 'ssh'ターゲットコマンドを与えていないので、シェルプロンプトが表示されます。だから、あなたが望むのは、シェルプロンプトで単にsshを使っている間に 'my @id = \' ssh expert @ ... date \ ';'(例えば) –

+0

リモートにログインすることができるのです – Sravan

答えて

1

私は理由の下のためのPerlコード内のシステムのsshコマンドを使用しないことをアドバイスします:

  1. それは出力難しい
  2. エラー処理を解析すると
  3. 困難になります
  4. プログラミングの柔軟性が低い

ではなく、CPANライブラリを使用してください。 PerlコードからSSHコマンドを起動するためのNet :: SSH :: Perl

以下に述べるように、このモジュールを使用してシェルを開くことがそのシンプル:

以下
$ssh->shell 

Opens up an interactive shell on the remote machine and connects it to your STDIN. This is most effective when used with a pseudo tty; otherwise you won't get a command line prompt, and it won't look much like a shell. For this reason--unless you've specifically declined one--a pty will be requested from the remote machine, even if you haven't set the use_pty argument to new (described above). 

This is really only useful in an interactive program. 

In addition, you'll probably want to set your terminal to raw input before calling this method. This lets Net::SSH::Perl process each character and send it off to the remote machine, as you type it. 

To do so, use Term::ReadKey in your program: 

    use Term::ReadKey; 
    ReadMode('raw'); 
    $ssh->shell; 
    ReadMode('restore'); 

は、コマンド出力を発射し、解析するために同じモジュールを使用することがいかに簡単かを示して簡単な例です:

ネット:: SSH :: PerlのCPANのドキュメントへ
use Net::SSH::Perl; 
    my $ssh = Net::SSH::Perl->new($host); 
    $ssh->login($user, $pass); 
    my($stdout, $stderr, $exit) = $ssh->cmd($cmd); 

リンク:http://search.cpan.org/~schwigon/Net-SSH-Perl-1.42/lib/Net/SSH/Perl.pm

私が使用することを好むもう一つのモジュールは、ネットで::のOpenSSH:http://search.cpan.org/~salva/Net-OpenSSH-0.70/lib/Net/OpenSSH.pm

use Net::OpenSSH; 

    my $ssh = Net::OpenSSH->new($host); 
    $ssh->error and 
    die "Couldn't establish SSH connection: ". $ssh->error; 

    $ssh->system("ls /tmp") or 
    die "remote command failed: " . $ssh->error; 

    my @ls = $ssh->capture("ls"); 
    $ssh->error and 
    die "remote ls command failed: " . $ssh->error; 

    my ($out, $err) = $ssh->capture2("find /root"); 
    $ssh->error and 
    die "remote find command failed: " . $ssh->error; 

    my ($rin, $pid) = $ssh->pipe_in("cat >/tmp/foo") or 
    die "pipe_in method failed: " . $ssh->error; 

    print $rin "hello\n"; 
    close $rin; 
2

これは、プログラムに依頼したものです。このライン

`ssh expert\@x.x.x.x` 

あなたはおそらく一度、リモートシステムとやり取りする必要が与えられたパラメータサブプロセス

  • を終了して、SSHを実行している新しいサブプロセスを開始し、SSHから任意のテキスト出力を返します。あなたは接続しているので、リモートシステムに接続するにはperlプロセスが必要です。または、終了する前にハッシュ接続されているサブプロセスにリッスンして話すことができる必要があります。

    最初の方法ははるかに簡単な方法です。 Net::OpenSSHモジュールを使用してドキュメントを読むと、オブジェクトを作成して接続を開くことができます。その後、コマンドを送信し、そのオブジェクトのcaptureメソッドを使用して出力を取得することができます

  • +0

    思考:なぜそれが話ですか*と* *の代わりに*を聞く*と話す*そして*から聞く?ああ私たちはあなたを愛して英語 – Borodin