通过 SSH 进行 Rsync 时没有 tty

通过 SSH 进行 Rsync 时没有 tty

我在 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。此选项sshssh客户端手册页像这样:

强制分配伪终端。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -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

  1. sudo如果该cron作业以 root 身份执行,则您不需要。
  2. 有一大堆不必要的标志:-rlptgoD;删除并替换为-a
  3. 来自的 TTY 消息sudo用于当地的TTY 而-t选项ssh偏僻的TTY。不要混淆这两者。
  4. 难道-v-q互相矛盾吗?
  5. 您最后要担心的是本地 SSH 私钥是否加密。前者不能用于无人值守的运行(例如,不是stdinTTY 的运行;它们不是从终端或终端仿真器运行的运行)。

编辑/更新

  • 我收回1和2。
  • 3 应该是关于运行时没有本地 TTY cron,并且由于没有本地 TTY,因此 SSH 不会远程分配 TTY。

答案4

我猜这是 ssh 密钥问题。备份的私钥有密码短语,或者公钥不在远程用户钥匙串中。也许您之前的尝试使用了钥匙串中已加载的密钥?

相关内容