2011-08-15 12 views
2

私はperlを使い慣れています。私は、server_nameとファイル名をフィールドとして持つパイプで区切られた行を持つ入力ファイルを持っています。ファイル名には、入力フィードファイルにワイルドカード(*)が含まれています。 実際のファイル名の後にタイムスタンプが付きます。ssh in perlスクリプト

Ex: Actual files in remote servers 
server_1/abc_20110801.txt 
server_1/abc_20110802.txt 
server_1/abc_20110803.txt 
server_2/xyz_20110801.dat 
server_2/xyz_20110802.dat 



Ex: Input feed file 
server_1|abc_*.txt 
server_2|xyz_*.dat 

私は、リモートサーバーへのSSH、ファイルを読み込むと「最新の」ファイル(この場合はSERVER_1/abc_20110803.txtとserver_2の/ xyz_20110802.dat)のタイムスタンプを捕獲しようとしています。 すべてのリモートサーバーへのsshキーは、ユーザーIDとパスワードを渡す必要がないように既に設定されています。

私は、ファイルは、以下のものを使用して、同じサーバーに存在する場合、これを行うことができるよ:

my @list_files = map { chomp; $_ } (`ls -t $wild_f_nme`); 
my $f_nme=$list_files[0]; 
my ($accesstime, $modtime, $createtime, $fsize) = (stat($f_nme))[8,9,10,7]; 

私は、リモートサーバにあるファイルのタイムスタンプをチェックするために、これをどのように行うだろう。私は各サーバーのssh接続を開始する必要があります。

FYI - モジュール(Net :: OpenSSHなど)をインストールできません(できません)。 これは、次のようなものを使用して達成できますか?あなたはglobとファイル名が多少スムーズに取得することができます

my @list_files = map { chomp; $_ } (`qx/ssh $serv_nme ls -t $d_loc/$wild_f_nme`); 
+1

あなたが.plのファイルを書き込むことができる場合、あなたはモジュールをインストールすることができます。 [ここ](http://www.perlmonks.org/?node_id=128077#permission)を参照してください。応答のために – jiggy

答えて

0

@files = glob $wild_f_nme; 

あなたは例えば、正規表現で日付の桁を抽出することができ;

my ($date) = $files[0] =~ /(\d{8})/; 

私は最新の日付を見つけるために日付モジュールを使用します。 POSIX::strptimeなどです。

+0

ありがとうございます。しかし、私の主な課題は、リモートサーバーにsshし、ファイルをキャプチャしてタイムスタンプを変更することです。 – kevin

+0

私は参照してください。タイムスタンプをチェックする方法を尋ねると、私はあなたに混乱しました。モジュールを使うことができないなら、sshをperlで使うのは難しいでしょう。システムにsshがあると仮定すると、sshコマンドを実行していくつかのperlコードを実行することができます。 – TLP

1

GRID::Machineをご覧ください。これにより、リモートマシン上でperlコードを実行し、perlデータ構造を返すことができます。

このような何かが(未テスト)動作するはずです:

use GRID::Machine; 

my $machine = GRID::Machine->new(host => $host); 

my $r = $machine->sub( 
    get_files=> q{ 
    my $pattern = shift; 
    my @files = glob($pattern); 
    # now stat each file name 
    my %stats; 
    for my $path (@files) { 
     $stats{$path} = [ stat($path) ] 
    } 
    return \%stats; 
    }; 
); 

die $r->errmsg unless $r->ok; 

$r = $machine->get_file_info($pattern); 
my $stats = $r->Result; 

# $stats is an array of hashes indexed by file name. 

# $stats->{$path}->[7] is the file length of $path on the remote machine