语境

语境

语境

我想设置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 密码。

我想到做类似事情的唯一方法是使用expectsudo 周围的脚本,它从命名管道读取密码,然后我将从另一个终端写入该管道。

注意:这更多的是为了实验和学习,而不是任何实际目的,我并不是想找出如何将 sudo 与 rsync 一起使用,我已经阅读了我能找到的所有相关内容。

答案1

sudoSUDO_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来清除它。

相关内容