SSH в Perl скрипте - PullRequest
       3

SSH в Perl скрипте

2 голосов
/ 15 августа 2011

Я новичок в 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 для каждого из серверов.

К вашему сведению - я не могу (не могу) установить какие-либо модули (например, Net :: OpenSSH). Можем ли мы сделать это с помощью чего-то вроде?

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

Ответы [ 2 ]

1 голос
/ 15 августа 2011

Посмотрите на 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
0 голосов
/ 15 августа 2011

Вы можете получить более гладкие имена файлов с помощью glob :

@files = glob $wild_f_nme;

Вы можете извлечь цифры в дате с помощью регулярного выражения, например;

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

Я бы использовал модуль даты, чтобы найти самые последние даты. Например, POSIX :: strptime .

...