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

时间:2017-03-05 05:39:11

标签: perl

我使用Net::OpenSSH模块使用rsync_get方法下载目录。目录中的某些文件不允许我登录的用户阅读某些文件,因此无法下载这些文件。有人可以为此建议解决方法吗?有没有办法用sudo命令运行此方法?

2 个答案:

答案 0 :(得分:2)

此页面上的选项1适用于我:https://crashingdaily.wordpress.com/2007/06/29/rsync-and-sudo-over-ssh/

要点:

选项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_pump_dir / / archive

答案 1 :(得分:0)

如果sudo被配置为不要求输入密码,您可以在帖子中进行操作:

$ssh->rsync_get({rsync_path => 'sudo rsync'}, ...);

另一方面,如果sudo需要密码以root身份运行命令,我认为最简单的方法是使用如下的包装脚本,将密码发送到sudo:< / p>

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