2012-03-05 18 views
4

次のコードでは、別のマシンにsshを実行して、ファイルが存在するかどうかを確認しようとしています。
ファイルが存在する場合は、そのファイルにアクセスしているユーザーがそのファイルの作成者かどうか、つまりユーザー名がログファイルに含まれているかどうかを確認する必要があります。
存在する場合は、そのファイルを削除する必要があります。Perlの1セッションでのssh操作

$user = $ENV{USER}; 
    $il_check_cmd = "cat $shared_il_path/$il_name/info/.info_cat.log"; 
    my $ssh_delete = Net::SSH::Perl->new($hostname, protocol => '1,2', debug => 0, interactive => 1)  ; 
    $ssh_delete->login($username, $password); 
    ($stdout,$stderr,$exit) = $ssh_delete->cmd("$il_check_cmd"); 
    if((defined $stderr) && ($stderr =~ /No such file or directory/)) 
    { 
    print "-E- $RUNCMD: \"$il_name\" you have entered does not exist in \"$shared_il_path\"!!  !\n"; 
    print "-E- $RUNCMD:      or\n"; 
    print "-E- $RUNCMD: \"$il_name\" does not contain \".info_cat.log\" file!!!\n"; 
    print "-E- $RUNCMD: Exiting...\n"; 
    exit; 
    } 
    @content = split(/ /,$stdout); 
    chomp($user_e = shift(@content)); 
    if($user_e =~ /\b$user\b/) 
    { 
      print "This is the user who created the file"; 
      //then remove the $shared_il_path/$il_name/info/.info_cat.log 

    } 

答えて

2

ではなく、Net::SSH::Expectの使用を検討して一度だけ、私は単一のログインすなわちでこれを達成することができますどのように、ユーザーが自分のパスワードを入力します。リンクされたページには、SSHセッションのサンプルコードがあります。

1

問題が何ですか。 $ssh_deleteオブジェクトを通してリモート側にコマンドを送信し続けるだけです。

最近、BTWでは、現在、SSHのモジュールとして、Net::OpenSSHまたはNet::SSH2があります。

1
my ($stdout, $stderr, $exit) = $ssh->cmd(q{perl -e' 
    my ($file_name) = @ARGV; 

    ... 
    Perl code that does what you want to do 
    ... 

    if (...some error...) { 
     die("...error message...\n"); 
    } 
' filename}); 

if ($exit) { 
    # An error occurred. 
    die("Error: $stderr"); 
} 

ちょうどあなたが正常に« ' »を使用することになり« '\'' »を使用しています。

+0

SSHセッションで実行されるコマンドに関する返品ステータスまたは何らかのステータスを取得できますか? – Rajeev

+0

'$ exit'に置いた終了コードの意味ですか? ( 'exit(0)'がデフォルトであり、コードが死んだ場合は0以外の値になります。エラーの場合は 'exit(1)'を呼び出すこともできます) $ stdout'。 – ikegami

+0

エラーが発生した場合にexit(1)を呼び出す方法。 – Rajeev

関連する問題