我在 Debian 上的 root crontab 中使用以下命令。
rsync -vqrlHEAXogDtzhi --log-file=${LOG} --progress --rsync-path="sudo /usr/bin/rsync" --exclude-from=$CONFIG_DIR/excludes -e "ssh -i /home/backups/.ssh/id_rsa" backups@${HOSTNAME}:/ ${BACKUP_DIR}
我得到了以下信息:
sudo: no tty present and no askpass program specified
我尝试在 ssh 命令中添加 -t,得到以下结果:
Pseudo-terminal will not be allocated because stdin is not a terminal.
我尝试将 -t -t 添加到 ssh 命令中,得到以下结果:
protocol version mismatch -- is your shell clean?
我已将 .hushlogin 添加到远程框上的备份用户,并确认我可以使用密钥以备份身份通过 ssh 连接到远程框,且不会显示任何内容(登录被隐藏)。我仍然收到这些消息。
请注意,我可以使用密钥成功将备份通过 ssh 传输到远程机器。
请注意,我的 sudo 没有 -tt 选项。
请注意,在源和目标的 /etc/sudoers 文件中设置以下内容:
backups ALL= NOPASSWD:/usr/bin/rsync
请注意,我的 /etc/sudoers 文件没有任何引用:
Defaults requiretty
请注意,我不会在命令中回显我的密码。
我怎样才能剥这只猫的皮?:|
谢谢
答案1
有时你会对一些事情想得太多。
远程系统上未安装 Rsync。
/捂脸
答案2
把它放在这里以便我可以记住并分享这个技巧:
rsync -av -e "ssh -tt" --rsync-path="stty raw -echo; sudo /usr/bin/rsync" user@${HOSTNAME}:/ ${DEST_DIR}
这种方法似乎绕过了对 tty 的要求,因为在某些系统的默认/etc/sudoers
文件上强制执行。Defaults requiretty
此信息是在审查后编写的这个问题和答案。
在该答案中,他们建议Defaults requiretty
从中删除/etc/sudoers
。这是更简单的方法。但是,如果您无法修改远程主机/etc/sudoers
以删除此配置选项,则可以尝试强制本地rsync
使用ssh -tt
。此选项ssh
在ssh
客户端手册页像这样:
强制分配伪终端。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。
因此,我们强制 ssh 分配一个伪tty以避免出现错误:
Pseudo-terminal will not be allocated because stdin is not a terminal.
stty: standard input: Inappropriate ioctl for device
sudo: sorry, you must have a tty to run sudo
然后,--rsync-path
用以下命令覆盖:
stty raw -echo; sudo /usr/bin/rsync
stty raw -echo
是将远程终端的线路规则设置为直通。这实际上使其表现得像一个管道,而不是没有 的伪终端-tt
。
然后远程 rsync 命令将是sudo /usr/bin/rsync
,它现在有一个伪 tty 并将通过 的requiretty
检查sudo
。
答案3
sudo
如果该cron
作业以 root 身份执行,则您不需要。- 有一大堆不必要的标志:
-rlptgoD
;删除并替换为-a
。 - 来自的 TTY 消息
sudo
用于当地的TTY 而-t
选项ssh
是偏僻的TTY。不要混淆这两者。 - 难道
-v
又-q
互相矛盾吗? - 您最后要担心的是本地 SSH 私钥是否加密。前者不能用于无人值守的运行(例如,不是
stdin
TTY 的运行;它们不是从终端或终端仿真器运行的运行)。
编辑/更新:
- 我收回1和2。
- 3 应该是关于运行时没有本地 TTY
cron
,并且由于没有本地 TTY,因此 SSH 不会远程分配 TTY。
答案4
我猜这是 ssh 密钥问题。备份的私钥有密码短语,或者公钥不在远程用户钥匙串中。也许您之前的尝试使用了钥匙串中已加载的密钥?