将输入提供给 /dev/tty 以使 ssh 继续

Jon*_*ker 5 ssh terminal tty files

我有一个正在运行的系统,它使用 scp(1) 将文件从一台主机复制到另一台主机。系统正在处理一系列文件,但卡在其中一个文件上:也就是说,它昨天启动了一个今天仍在运行的 scp 命令。

运行 strace 表明 scp 正在等待读取管道文件,该文件连接到其 ssh 子进程的 stdout;这个孩子正在等待阅读 fd 4,即/dev/tty.

一个 ssh 目标具有与known_hosts源主机上的主机密钥冲突。我在长期运行的 scp 启动时摆弄了它;现在known_hosts一切都设置好了,我可以从源到所有目的地 ssh,而不会被提示输入任何内容。

我的假设是,ssh遇到了一个小的计时窗口,并向用户提供了一个未知的主机密钥,并且正在等待确认 ( "yes\n") 继续进行。

有什么方法可以让我按照用户输入readssh方式完成呼叫yes(如果是,如何输入)?

当(在另一台机器上)我echo foobar > /dev/tty在 xterm 中时,它会foobar在我的控制台上写入。不出所料,如果 Iecho foobar > /proc/<pid>/fd/4/dev/tty. 那么如何将输入输入到 ssh 中呢?


如果有人知道如何测试我的假设ssh和/或使其以不同的方式进行,我也很高兴听到这个消息。

Tho*_*key 2

写入时/dev/tty不考虑进程 ID;这样你就不会成功。

尽管是同一设备,但进程在给定设备上打开的文件描述符不同。对于 Linux,如果您知道进程 ID,则可以操作单独的文件描述符,即 /proc/ PID /fd/0 是 id 为PID的进程的标准输入。

对于您的情况,程序正在打开设备,其文件描述符也将位于 /proc/ PID /fd 中(但不太容易识别)。应用程序可以“查看”该目录中的符号链接信息,并对其进行操作。

如果仔细观察,/proc/ PID /fd中的项目都有不同的 inode 值(因为它们是不同的文件描述符)。回显 proc/ PID /fd中的条目意味着您正在回显该文件描述符。

但是 ssh 并不期望来自该方向的输入,也没有提供补充提示 - 您正在使用的解决方法可能是您能做的最好的解决方法。