我使用Net::OpenSSH
模块使用rsync_get
方法下载目录。目录中的某些文件不允许我登录的用户阅读某些文件,因此无法下载这些文件。有人可以为此建议解决方法吗?有没有办法用sudo
命令运行此方法?
答案 0 :(得分:2)
此页面上的选项1适用于我:https://crashingdaily.wordpress.com/2007/06/29/rsync-and-sudo-over-ssh/
要点:
选项1.在/ etc / sudoers文件中设置NOPASSWD。 p>
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" );