有一个rsync 未按预期设置 UID 和 GID 的问题,我的直觉是应该在目标机器上rsync
运行。root
我无法root
通过 SSH 登录,因为出于安全原因,该功能已被禁用。目标计算机上的用户可以使用sudo
。
可以rsync
一起使用吗sudo
?
答案1
在目标计算机上
- 找出路径
rsync
:which rsync
- 编辑
/etc/sudoers
文件:(sudo visudo
另请参阅:我必须使用 visudo 吗?) - 添加行
<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 询问您的密码。以下是执行此操作的方法:
- 确保
ssh-askpass
已安装在远程主机上(当然,您正在使用 X-windows) - 确保这是
/etc/sudo.conf
:
# Path to askpass helper program
Path askpass /usr/bin/ssh-askpass
将这些选项添加到 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
我想这里的安全性还不错,您只需将密码本地保存为环境变量即可。从文件中读取它也应该有效...