语境
我想设置rsync
服务器的备份,所以我运行以下命令
rsync -r -e ssh --rsync-path="sudo rsync" [email protected]:/ /backup/
理想情况下,该命令会询问我的私有 ssh 密钥密码,然后连接,然后询问 rsyncuser 的 sudo 密码,然后在服务器上运行 rsync。但我遇到了臭名昭著的错误:
sudo: no tty present and no askpass program specified
所以我必须将其添加到/etc/sudoers
(using sudo visudo
) 中,这基本上为用户提供了对系统的无密码完全读写访问权限rsyncuser
,这不符合我的口味:
rsyncuser ALL= NOPASSWD:/usr/bin/rsync
问题
我怎样才能告诉 sudo 从另一个 TTY 读取其密码?
这样,我可以rsync
在本地计算机上的一个终端窗口中运行,并使用另一个终端窗口打开到服务器的(可能是单独的)ssh 连接,并在那里提供 sudo 密码。
我想到做类似事情的唯一方法是使用expect
sudo 周围的脚本,它从命名管道读取密码,然后我将从另一个终端写入该管道。
注意:这更多的是为了实验和学习,而不是任何实际目的,我并不是想找出如何将 sudo 与 rsync 一起使用,我已经阅读了我能找到的所有相关内容。
答案1
sudo
SUDO_ASKPASS
如果没有从终端运行(如您的情况)或者设置了 -A ,将读取环境变量 。它使用它作为运行命令来获取密码。例如:
echo -e '#!/bin/sh\nhead -n 1' > ~/bin/reader
chmod a+x ~/bin/reader
export SUDO_ASKPASS="$HOME/bin/reader"
sudo -A echo "I'm root\!"
将提示您在标准输入上输入密码,并且不需要终端。
然而,在您尝试执行的特定情况下,最好允许 root SSH 登录,但只能使用 SSH 密钥且命令仅限于 rsync。这方面有一个很好的资源这里。
答案2
尝试:
ssh userfoo@host "sudo -S p'enter pw: ' [command] "
这将发出密码提示(“ enter pw:
”),该提示将显示在您的本地主机/终端上。这样做的缺点是您的密码在终端窗口上清晰显示,存在安全风险。它不会保存在您的本地.bash_history
,但它是终端窗口回滚历史记录。因此,如果您使用 Konsole,请使用Ctrl+ Shift+K来清除它。