ホストに/a/ b / c/fileというファイルがあります。リモートホストのディレクトリsaydestにファイルを作成したい。ここで問題となるのは、perlスクリプトとsshを使用して、リモートホストに/ dest / a / b / c / d/fileとしてファイルを作成するにはどうすればよいかということです。スクリプトでディレクトリを作成するにはどうすればよいですか?
ありがとう。
ホストに/a/ b / c/fileというファイルがあります。リモートホストのディレクトリsaydestにファイルを作成したい。ここで問題となるのは、perlスクリプトとsshを使用して、リモートホストに/ dest / a / b / c / d/fileとしてファイルを作成するにはどうすればよいかということです。スクリプトでディレクトリを作成するにはどうすればよいですか?
ありがとう。
ディレクトリ構造を再現するには、モジュールからcatfile
andを使用します。ピースを結合してパスを作成し、ベースディレクトリからの相対パスを指定します。abs2rel
File::Spec
catfile
abs2rel
File::Copy
モジュールはcopy
ハンドルにコピーされます。sshopen3
これは、opensが宛先側の標準の入力、出力、およびエラーを処理する方法とうまく適合します。
リモートコマンドには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