Suz*_*Soy 6 sudo rsync tty expect
我想设置rsync我的服务器的备份,所以我运行以下命令
rsync -r -e ssh --rsync-path="sudo rsync" rsyncuser@example.com:/ /backup/
Run Code Online (Sandbox Code Playgroud)
理想情况下,该命令会询问我的私人 ssh 密钥密码,然后连接,然后询问 rsyncuser 的 sudo 密码,然后在服务器上运行 rsync。但我得到了臭名昭著的错误:
sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)
所以我不得不将它添加到/etc/sudoers(使用sudo visudo),这基本上为用户提供了对系统的无密码完全读写访问权限rsyncuser,这不合我的口味:
rsyncuser ALL= NOPASSWD:/usr/bin/rsync
Run Code Online (Sandbox Code Playgroud)
我该如何告诉 sudo 从另一个 TTY 读取其密码?
这样,我可以rsync在本地机器上的一个终端窗口中运行,并使用另一个终端窗口打开一个(可能是单独的)与服务器的 ssh 连接,并在那里提供 sudo 密码。
我想到做这样的事情的唯一方法是expect在 sudo 周围使用脚本,它从命名管道中读取密码,然后我会从另一个终端写入该管道。
注意:这更多是为了实验和学习,而不是为了任何实际目的,我不是想找出如何将 sudo 与 rsync 一起使用,我已经阅读了我能找到的所有相关内容。
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\!"
Run Code Online (Sandbox Code Playgroud)
将提示您在 stdin 上输入密码,并且不需要终端。
但是,在您尝试执行的特定情况下,最好允许 root SSH 登录,但只能使用 SSH 密钥和仅限于 rsync 的命令。在灯架上有一个很好的资源在这里。