Perl - Как отправить двоичный файл (изображение) на удаленный хост с «главного» хоста и создать структуру каталогов тоже? - PullRequest
1 голос
/ 14 января 2011

Я много раз читал и тестировал безрезультатно.

Я нашел этот скрипт здесь на stackoverflow, который направил меня в правильном направлении, но мои способности недостаточны для изменения и полного понимания для моегонужно.

#! /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: $!";

Сценарий:

У меня есть файлы изображений в каталоге на "главном" хосте, например /home/user/public_html/images/red/id100/image01.jpg (thru image012.jpg)

Я хотел бы скопировать / отправить ихна мой удаленный хост, создающий путь red / id100, если! -d.(папка "/ images" уже существует.)

Мне также необходимо отправить имя пользователя и пароль на удаленный хост, чтобы войти. Это типичная среда общего сервера cpanel.

Мой основной сервер выделен, также с установленным управлением cpanel.

Я изучил NET :: FTP, File :: Remote, Net :: Telnet и Net :: SFTP, но нет доступных примеров, которые были бы "тупыми"до моего уровня.

Мне, в конечном счете, придется делать это и с файлами ascii, но, я думаю, как только я настрою это на работу с изображениями, я могу выяснить, переключатель xfermode, я надеюсь.

Спасибо за любую помощь и подробные примеры.Я всегда учусь великим вещам здесь.

1 Ответ

0 голосов
/ 14 января 2011

Использование SFTP должно быть довольно простым:

use Net::SFTP::Foreign;
my $sftp = Net::SFTP::Foreign->new($HOST, passwd => $PASSWD);
$sftp->error and die "Unable to connect to remote host: " . $sftp->error;
$sftp->rput($SRC_BASE, $DST_BASE);

... или используя ssh + rsync ...

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new($HOST, passwd => $PASSWD);
$ssh->error and die "Unable to connect to remote host: " . $ssh->error;
$ssh->rsync_put({recursive => 1}, $SRC_BASE, $DST_BASE)
  or die "rsync failed: " . $ssh->error;
...