在远程计算机上以root权限运行rsync


30

我想将计算机中的文件夹与远程计算机上的文件夹同步。远程文件夹只能由操作root。我在可以使用的远程计算机上有一个帐户sudo。如何运行rsync使其在远程计算机上具有root权限?

我尝试了以下方法:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

但是(输入密码后),我得到以下错误:

sudo: no tty present and no askpass program specified

您是否可以更改远程文件夹的权限,以便您的用户对其具有写权限?
菲尔,

1
不幸的是,这不是一个选择。
彼得

在Unix SEunix.stackexchange.com/questions/92123/…上检查相同问题的答案要好得多。
ndemou

Answers:


12

试试这个解决方案。在您的sudoers文件(/etc/sudoers)中,按如下所示设置用户:

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsync通知sudo,当你的用户运行/usr/bin/rsync或仅rsync是不需要密码。

这样您的原件--rsync-path="sudo rsync"应该可以工作了。


完成rsync后,我使用sudo rsync选项而不设置用户名ALL...。在远程上,当我尝试cd或ls时。我被拒绝了。即使我是根。我必须向ls sudo。但如果使用cd,则甚至不可能。我试图整理所有目录和文件。仍然没有用。有人知道原因以及如何解决吗?
可怕的分号

2
您还应该说如何编辑sudoers文件
Jonathan

1
请参阅unix.stackexchange.com/a/92397/128237了解此修复程序的安全性。
BrainStorm.exe

11

这是我想出的解决方案:

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

有点任务!


12
希望您能在命令行中看到密码。在rsync运行的时间内,它应该是可见的。
BillThor

1
密码在哪里可见?只是在命令行的本地框中?还是这种方法还会创建远程漏洞?我试图理解上面的答案以及使用此解决方案的后果。我在这里问了一个问题:superuser.com/questions/398146/…–
MountainX

@MountainX在进程列表(例如ps aux)中将可见。测试:rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example,然后在和上打开远程计算机上的终端ps aux | grep findfind /仅当它是执行时间长的第一件事时才被使用。
伊万·武恰卡(IvanVučica)2014年

1
我知道这很旧,但是,如果您想避免在命令中使用密码,则可以使用ssh的密钥,并在远程计算机上使用NOPASSWD:ALL标志将您的用户添加到sudoers文件中。在以下链接中查看最高等级的答案。注意:这不是公认的答案:askubuntu.com/questions/147241/execute-sudo-without-password
Dave

10

该博客上的解决方案对我来说确实非常有效:http : //www.pplux.com/2009/02/07/rsync-root-and-sudo/

基本上:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

第一行允许交互式密码输入,而无需在屏幕上显示密码。在Ubuntu 9.04上非常适合我。


1
这需要取消设置tty_tickets选项:!tty_tickets
2011年

2
怎么样ssh -t [other options],而不是摆弄stty -echo
伊万·武恰卡(IvanVučica),2014年

就我而言,我尚未确定:tty_tickets无论如何...所以我可以尝试这种方法。
MountainX

1
sudo: no tty present and no askpass program specified
迈克尔

如何取消tty_tickets?在哪台机器上?在执行rsync命令期间?
乔纳森

4

您需要一种方法来向提供密码sudo。一个askpass计划的目的是索要密码时的正常机制不可用。设置sudo为不需要密码即可rsync作为您的用户名运行是一种选择。

我通常会为基于键的登录配置适当的限制,以应对此类情况。如果您配置了只能rsync以root身份运行的受限密钥,那么这种事情将变得更容易实现。另一种选择是使用一个rsycnd进程来处理远程请求。该配置提供了可以应用的多种限制。

编辑:在我在Linux设置 BackupPC的文章的“在客户端上创建用户ID”部分中,我包括一个用于为基于密钥的密钥设置密钥的脚本。另请参见ssh_config的文档,其中详细说明了可以通过限制脚本用法来限制脚本的操作,如脚本所示。


感谢您的帮助,但我找到了对我来说更好的解决方案。
彼得

有关基于密钥的登录的任何详细信息?
TheVillageIdiot


2

我对现有答案的复杂性感到惊讶。这是迄今为止容易和方便地配置系统(PC和远程主机),这样就可以以root身份连接到远程主机,而无需使用密码。而且与它的外观不同,它也是安全的

  1. 在远程主机上,请确保/ etc / ssh / sshd_config具有“ PermitRootLogin without-password”这一行(在许多发行版中,默认情况下都存在)。这允许root使用不安全的密码提示之外的任何身份验证方法来获取ssh shell 。
  2. (如果您还不知道如何)请按照许多教程中的任何一个通过ssh获取无密码登录
  3. 像平常一样使用rsync,没有任何密码提示。

只是不要忘记,只要远程主机的/root/.ssh/authorized_keys中的行存在,机器就可以从您的PC接受root命令。


rrsync使用此方法。
CODE READ

0

考虑到我想保持密码身份验证(因此我不想使用NOPASSWD或输入密钥),这对我有用:在Ubuntu 14.04上:

  • sudo通过禁用其中的tty_tickets一个临时文件/etc/sudoers.d/(在Debian中应该受到支持,请参见/etc/sudoers.d/README)来“ 在远程计算机上打开” ,以及“更新用户的缓存凭据”,这“将sudo超时再延长15分钟”。
  • 如其他答案所示运行rsyncwithsudo
  • sudo通过删除中的临时文件,在远程计算机上“关闭” /etc/sudoers.d/,然后重新启用tty_tickets

...或者使用命令行:

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

这些是在本地计算机上运行以下命令时得到的响应:

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

请注意,sudo -v应在每次将文件放入后运行/etc/sudoers.d/,以便接受其中的更改。


0

另一种方法是通过在远程计算机上启动rsync来解决权限限制。代替:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

你可以做:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

y.y.y.y本地计算机的IP地址在哪里。仅当本地计算机可以充当SSH服务器时,此方法才有效。


1
嗯...您不是在第一个命令行中将local复制到remote,然后在第二个命令行中将其复制到remote,而不是在第一个命令行中将远程复制到local(这等效于第一个)吗?
sdaau

哎呀!固定它。
基思(Keith)

0

我的工作是要补充 --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

例:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

通常,将密码放在命令行中不是一个好主意。例如,它们在过程树中变得可见。我有时会用$(cat my_password.txt)替换这种类型的语句中的实际密码,这样会更好

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


您可以通过一些上下文和解释来对此进行扩展吗?“添加”到什么地方?为什么这可以解决问题?谢谢。
fixer1234 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.