Perl 使用Net::OpenSSH::rsync_get()方法作为sudo

Perl 使用Net::OpenSSH::rsync_get()方法作为sudo,perl,Perl,我正在使用模块使用rsync\u get方法下载目录。目录中的某些文件不允许我登录的用户读取某些文件,因此无法下载。有人能建议一个解决方法吗?是否有某种方法可以使用sudo命令运行此方法?此页面上的选项1对我很有用: 总结: 备选案文1。在/etc/sudoers文件中设置NOPASSWD crashingdaily ALL=NOPASSWD:/usr/bin/rsync 然后使用--rsync path选项指定sudo包装器 rsync-a-e“ssh”--rsync path=“sudo r

我正在使用模块使用
rsync\u get
方法下载目录。目录中的某些文件不允许我登录的用户读取某些文件,因此无法下载。有人能建议一个解决方法吗?是否有某种方法可以使用
sudo
命令运行此方法?

此页面上的选项1对我很有用:

总结:

备选案文1。在/etc/sudoers文件中设置NOPASSWD

crashingdaily ALL=NOPASSWD:/usr/bin/rsync 然后使用--rsync path选项指定sudo包装器


rsync-a-e“ssh”--rsync path=“sudo rsync”crashingdaily@server.remotehost.com:/u02/data\u pump\u dir//archive

如果您的
sudo
配置为不要求密码,您可以按照帖子中的操作:

$ssh->rsync_get({rsync_path => 'sudo rsync'}, ...);
另一方面,如果
sudo
需要密码才能作为root用户运行命令,我认为最简单的方法是使用如下包装器脚本,将密码发送到
sudo

#!/usr/bin/perl
# save me as ~/bin/sudo_rsync on the target machine

use strict;
use warnings;
use IO::Pty;

my $passwd = 's3cr3t';

my $pty = IO::Pty->new;
my $pid = fork;
unless ($pid) {
    defined $pid or die "unable to fork";
    $pty->make_slave_controlling_terminal;
    do { exec 'sudo', 'rsync', @ARGV };
    exit -1;
}

print {$pty} "$passwd\n";
waitpid($pid, 0);
然后,从本地机器

$ssh->rsync_get({rsync_path => '~/bin/sudo_rsync'},
                '/etc/shadow', '/tmp/shadow');
显然,在脚本中硬编码密码是一个非常糟糕的主意。。。但在命令行或环境变量中传递它也是一个坏主意。我认为除了避免让
sudo
在您想要自动执行的事情上询问密码之外,没有什么好的解决方案

另一个丑陋的解决方案,当sudo被配置为缓存凭证一段时间(在命令行上传递密码)时可以使用:

$ssh->rsync_get( { rsync_path =>
                   'sudo -k && ' .
                   'echo s3cr3t|sudo -Sp "" cat /dev/null && ' .
                   'sudo -Sp "" rsync' },
                 "/etc/shadow", "/tmp/shadow" );