我正在使用Net::OpenSSH
模块使用rsync_get
方法下载目录。目录中的某些文件不允许我登录的用户读取一些文件,因此无法下载。任何人都可以为此提出解决方法吗?有没有办法用sudo
命令运行这个方法?在/ etc/sudoers文件使用Net :: OpenSSH :: rsync_get()方法作为sudo
选项1.设置NOPASSWD:此页面上
我正在使用Net::OpenSSH
模块使用rsync_get
方法下载目录。目录中的某些文件不允许我登录的用户读取一些文件,因此无法下载。任何人都可以为此提出解决方法吗?有没有办法用sudo
命令运行这个方法?在/ etc/sudoers文件使用Net :: OpenSSH :: rsync_get()方法作为sudo
选项1.设置NOPASSWD:此页面上
选项1为我工作:https://crashingdaily.wordpress.com/2007/06/29/rsync-and-sudo-over-ssh/
总结。
crashingdaily ALL = NOPASSWD:/ usr/bin/rsync 然后使用--rsync-path选项指定sudo包装器。
的rsync -a -e “SSH” --rsync路径= “须藤rsync的” [email protected]:/ U02/DATA_PUMP_DIR//归档
如果您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");