2017-03-05 35 views
2

我正在使用Net::OpenSSH模块使用rsync_get方法下载目录。目录中的某些文件不允许我登录的用户读取一些文件,因此无法下载。任何人都可以为此提出解决方法吗?有没有办法用sudo命令运行这个方法?在/ etc/sudoers文件使用Net :: OpenSSH :: rsync_get()方法作为sudo

选项1.设置NOPASSWD:此页面上

回答

0

如果您sudo被configurred到没有要求一个密码,你可以做在您的文章:

$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要求在第一个地方自动完成的事情输入密码外,这个问题并不是一个好的解决方案!

另一个难看溶液时须藤被配置为高速缓存的凭证一会儿(通过在命令行上的口令),其工作原理:

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