首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl::OpenSSH和rsync_get()

Perl::OpenSSH和rsync_get()
EN

Stack Overflow用户
提问于 2022-07-21 00:49:35
回答 1查看 59关注 0票数 1

我正在尝试根据远程服务器上文件的ctime,使用rsync从远程目录中rsync脚本中的文件进行rsync文件同步,但遇到了一些困难。

代码语言:javascript
复制
use strict;
use Net::OpenSSH;
my $user = "phil";
my $password = 'pass';
my $host = "xavier";
my $local_rules = "/etc/mail/rules.cf";
my $remote_rules = "/etc/mail/rules.cf";
my $keypath = "$userhome/.ssh/scp-key.key";
my $ssh = Net::OpenSSH->new($host, user => $user, passphrase => $password, key_path => $keypath);

$ssh->rsync_get({exclude => '*~', archive => 1, safe_links => 1, verbose => 1,
        files_from => "<(find /var/spool/dir/quarantine -cnewer /home/phil/last-run -type f -exec basename {} \\;)>"}, '/var/spool/dir/quarantine/','/home/phil/quarantine/');

在执行时,它会失败,如下所示:

代码语言:javascript
复制
rsync: failed to open files-from file <(find /var/spool/dir/quarantine -cnewer /home/phil/last-run -type f -exec basename {} \;)>: No such file or directory
rsync error: syntax or usage error (code 1) at main.c(1765) [client=3.2.4]

当我在远程服务器上手动执行find命令时,它会生成一个文件列表。

我知道查找是在远程主机上执行的,但可能不是这样吗?

我遗漏了什么?有更好的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-21 21:43:54

在将参数files_from传递给rsync_get()命令行之前,将引用参数ssh。引用阻止Shell识别"<(find /var/spool/dir/quarantine -cnewer /home/phil/last-run -type f -exec basename {} \\;)"中的元字符。请向问题跟踪器报告并征求意见。

作为解决办法,您可以预先创建files_from文件:

代码语言:javascript
复制
use File::Temp qw(tempfile);
my ($fh, $tempfile) = tempfile();
my $res = system "find /var/spool/dir/quarantine -cnewer /home/phil/last-run -type f -exec basename {} \\; > $tempfile";
die "find command failed" if $res != 0;

然后,像这样运行rsync_get()

代码语言:javascript
复制
$ssh->rsync_get(
  {
    exclude => '*~', 
    archive => 1, 
    safe_links => 1, 
    verbose => 1,
    files_from => $tempfile
  }, 
  '/var/spool/dir/quarantine/',
  '/home/phil/quarantine/'
);

编辑

要从远程获取文件列表,可以尝试

代码语言:javascript
复制
use feature qw(say);
use File::Temp qw(tempfile);
my @files = $ssh->capture("find /var/spool/dir/quarantine -cnewer /home/phil/last-run -type f -exec basename {} \\;") or
  die "remote command failed: " . $ssh->error;
my ($fh, $tempfile) = tempfile();
say $fh $_ for @files;
close $fh;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73059537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档