ssh в perl-скрипте

Я новичок в перле. У меня есть входной файл со строками с разделителями, которые имеют server_name и имена файлов в качестве полей. Имена файлов имеют подстановочный знак (*) во входном файле веб-канала. Фактические имена файлов будут сопровождаться временными метками.

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 для всех удаленных серверов уже настроены, поэтому нам не нужно передавать идентификатор пользователя и пароль.

Я могу сделать это, если файлы существуют на том же сервере, используя следующее:

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`);

person kevin    schedule 15.08.2011    source источник
comment
Если вы можете писать файлы .pl, вы можете устанавливать модули. См. здесь.   -  person jiggy    schedule 15.08.2011


Ответы (2)


Посмотрите на 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
person ErikR    schedule 15.08.2011

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

@files = glob $wild_f_nme;

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

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

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

person TLP    schedule 15.08.2011
comment
Спасибо за ответ. Но моя главная задача — подключиться по ssh к удаленным серверам и зафиксировать временные метки изменения файла. - person kevin; 15.08.2011
comment
Понимаю. Я был сбит с толку тем, что вы спросили, как вы можете проверить временные метки. Использование ssh в Perl будет затруднено, если вы не можете использовать модули. Предполагая, что в вашей системе есть ssh, вы можете выполнить команду ssh для выполнения некоторого кода Perl. - person TLP; 15.08.2011