在目标计算机上使用 rsync 和 sudo

在目标计算机上使用 rsync 和 sudo

有一个rsync 未按预期设置 UID 和 GID 的问题,我的直觉是应该在目标机器上rsync运行。root

我无法root通过 SSH 登录,因为出于安全原因,该功能已被禁用。目标计算机上的用户可以使用sudo

可以rsync一起使用吗sudo

答案1

在目标计算机上

  1. 找出路径rsyncwhich rsync
  2. 编辑/etc/sudoers文件:(sudo visudo另请参阅:我必须使用 visudo 吗?
  3. 添加行<username> ALL=NOPASSWD:<path to rsync>,其中用户名是 rsync 将用于登录的用户的登录名。该用户必须能够使用sudo

然后,在源机器上指定sudo rsync应使用的:

rsync ... --rsync-path="sudo rsync" ...

在目标机器上不使用它将NOPASSWD导致消息

sudo:没有 tty 存在并且没有指定 askpass 程序

答案2

我的解决方案是使用--rsync-path="sudo rsync",如果它要求输入密码,您可以使用如下解决方法:

rsync -avz --stats --rsync-path="echo <SUDOPASS> | sudo -Sv && sudo rsync"  [email protected]:/ .

但是,最好不要在命令行上输入密码,因为密码会存储在终端历史记录中。相反,您可以使用read -s来提示输入密码而不显示密码:

read -s -p "Remote sudo password: " SUDOPASS && rsync -avz --stats --rsync-path="echo $SUDOPASS | sudo -Sv && sudo rsync"  [email protected]:/ .

(注意:-p并非所有 shell(例如 zsh)都支持提示,如果出现错误,您可以将其关闭,或者在读取之前先回显)

答案3

您可以让远程 sudo 通过 X-windows 询问您的密码。以下是执行此操作的方法:

  1. 确保ssh-askpass已安装在远程主机上(当然,您正在使用 X-windows)
  2. 确保这是/etc/sudo.conf
# Path to askpass helper program
Path askpass /usr/bin/ssh-askpass
  1. 将这些选项添加到 rsync:-e "ssh -X" --rsync-path="sudo -A rsync"

    • ssh -X将转发您的 X-windows 信息和端口到您的远程会话
    • sudo -A将使 sudo 使用 ssh-askpass 向您询问密码

答案4

如果无法访问 sudoers 文件,只需为 ssh 命令创建一个包装脚本。

ssh_sudo:

{ 
  echo $PASSWORD;
  cat - ;
} | ssh $* &

首先,这会将密码传递给 ssh 客户端的 sudo 进程,以便在远程端启动 rsync。接下来,来自本地 rsync 的所有输入都将通过管道传输到 ssh。

最后调用 rsync 例如:

PASSWORD=<SUDOPASS> rsync -avzue ssh_sudo --rsync-path "sudo -S rsync" SRC DST

我想这里的安全性还不错,您只需将密码本地保存为环境变量即可。从文件中读取它也应该有效...

相关内容