perl - 如何使用 ssh 在远程主机中创建文件以及创建目录

标签 perl file ssh file-handling net-ssh

我的主机中有一个文件/a/b/c/file。我想在目录 say dest 中的远程主机上创建一个文件。现在的问题是,如何使用 perl 脚本和 ssh 在远程主机中创建一个文件作为/dest/a/b/c/d/file。知道如何在脚本中创建目录吗?

谢谢。

最佳答案

要重现目录结构,请使用 File::Spec 中的 catfileabs2rel module: catfile 连接片段以创建路径,abs2rel 给出相对于某个基本目录的路径。

File::Copy模块的 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

关于perl - 如何使用 ssh 在远程主机中创建文件以及创建目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143907/

相关文章:

Excel::Writer::XLSX 在公式中添加了一个意想不到的@(第 2 部分)

python - 你能推荐一些关于面向对象软件设计的扩展例子吗?

java - Java中能否将字符串转换为包含转义序列的字符串?

vb.net - 将图像复制到剪贴板并将其粘贴为文件(vb.net)

python - 如何从远程计算机获取控制台输出(ssh + python)

perl - 如何在 Perl 中更改 ffmpeg.exe 的屏幕输出?

linux - 使用 perl regexp 获取在 linux 控制台中执行的脚本的名称

java - 在android中加载文件

windows - 从 Git Gui (windows) 推送到远程 Git 存储库的问题

git - 获取有关 Gerrit 更改的最新 refspec