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

发布于 2024-09-07 21:54:15 字数 140 浏览 7 评论 0原文

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

谢谢。

I have a file say /a/b/c/file in my host. I want to create a file on remote host in directory say dest. Now the question is, how do I create a file in remote host as /dest/a/b/c/d/file using perl script and using ssh. Any idea how do I create directories in script.?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吖咩 2024-09-14 21:54:15

要重现目录结构,请使用 File::Spec 模块:catfile 将片段连接起来形成路径,abs2rel 给出相对于一些基本目录。

File::Copy 模块的 copy< /code> 将复制到句柄。这非常适合 sshopen3 在目标端打开标准输入、输出和错误句柄的方式。

远程命令有 3 部分:

  • mkdir -p $dst_dir,创建目标路径中该文件之前的所有目录
  • cat >$dst_file,连接 SEND< /code> 目标文件
  • 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

To reproduce the directory structure, use catfile and abs2rel from the File::Spec module: catfile joins pieces to make a path, and abs2rel gives the path relative to some base directory.

The File::Copy module's copy will copy to a handle. This fits nicely with how sshopen3 opens handles to the standard input, output, and error on the destination side.

The remote command has 3 parts:

  • mkdir -p $dst_dir, creates all directories preceding the file in the destination path
  • cat >$dst_file, connects the SEND handle to the destination file
  • md5sum $dst_file, shows that the data arrived safely

Sample program below:

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

Sample run:

$ ./create-file
746308829575e17c3331bbcb00c0898b  /tmp/host/a/b/c/file
746308829575e17c3331bbcb00c0898b  /tmp/dest/a/b/c/file
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文