Как создать файл на удаленном хосте вместе с созданием каталога с помощью ssh - PullRequest
3 голосов
/ 29 июня 2010

У меня на хосте есть файл say / a / b / c / file.Я хочу создать файл на удаленном хосте в каталоге, скажем, Dest.Теперь вопрос в том, как мне создать файл на удаленном хосте как / dest / a / b / c / d / file, используя скрипт perl и используя ssh.Любая идея, как мне создать каталоги в скрипте.?

1002 * Спасибо.

1 Ответ

2 голосов
/ 29 июня 2010

Чтобы воспроизвести структуру каталогов, используйте catfile и abs2rel из модуля File::Spec: catfile объединяет части для создания пути, а abs2rel дает путь относительно некоторых базовый каталог.

copy модуля File::Copy будет скопирован в дескриптор. Это хорошо согласуется с тем, как sshopen3 открывает дескрипторы для стандартного ввода, вывода и ошибки на стороне назначения.

Удаленная команда состоит из 3 частей:

  • mkdir -p $dst_dir, создает все каталоги, предшествующие файлу в пути назначения
  • cat >$dst_file, подключает дескриптор SEND к файлу назначения
  • md5sum $dst_file, показывает, что данные благополучно прибыли

Пример программы ниже:

#! /usr/bin/perl

use warnings;
use strict;

use File::Basename;
use File::Copy;
use File::Spec::Functions qw/ abs2rel catfile /;
use Net::SSH qw/ sshopen3 /;

my $HOST     = "user\@host.com";
my $SRC_BASE = "/tmp/host";
my $SRC_FILE = "$SRC_BASE/a/b/c/file";
my $DST_BASE = "/tmp/dest";
system("md5sum", $SRC_FILE) == 0 or exit 1;

my $dst_file = catfile $DST_BASE, abs2rel $SRC_FILE, $SRC_BASE;
my $dst_dir  = dirname $dst_file;
sshopen3 $HOST, *SEND, *RECV, *ERRORS,
         "mkdir -p $dst_dir && cat >$dst_file && md5sum $dst_file"
  or die "$0: ssh: $!";

binmode SEND;
copy $SRC_FILE, \*SEND or die  "$0: copy failed: $!";
close SEND             or warn "$0: close: $!";  # later reads hang without this

undef $/;
my $errors = <ERRORS>;
warn $errors if $errors =~ /\S/;
close ERRORS or warn "$0: close: $!";

print <RECV>;
close RECV or warn "$0: close: $!";

Пример прогона:

$ ./create-file
746308829575e17c3331bbcb00c0898b  /tmp/host/a/b/c/file
746308829575e17c3331bbcb00c0898b  /tmp/dest/a/b/c/file
...