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"
) 继续进行。
有什么方法可以让我按照用户输入read
的ssh
方式完成呼叫yes
(如果是,如何输入)?
当(在另一台机器上)我echo foobar > /dev/tty
在 xterm 中时,它会foobar
在我的控制台上写入。不出所料,如果 Iecho foobar > /proc/<pid>/fd/4
是/dev/tty
. 那么如何将输入输入到 ssh 中呢?
如果有人知道如何测试我的假设ssh
和/或使其以不同的方式进行,我也很高兴听到这个消息。
写入时/dev/tty
不考虑进程 ID;这样你就不会成功。
尽管是同一设备,但进程在给定设备上打开的文件描述符不同。对于 Linux,如果您知道进程 ID,则可以操作单独的文件描述符,即 /proc/ PID /fd/0 是 id 为PID的进程的标准输入。
对于您的情况,程序正在打开设备,其文件描述符也将位于 /proc/ PID /fd 中(但不太容易识别)。应用程序可以“查看”该目录中的符号链接信息,并对其进行操作。
如果仔细观察,/proc/ PID /fd中的项目都有不同的 inode 值(因为它们是不同的文件描述符)。回显 proc/ PID /fd中的条目意味着您正在回显该文件描述符。
但是 ssh 并不期望来自该方向的输入,也没有提供补充提示 - 您正在使用的解决方法可能是您能做的最好的解决方法。