运行 bash 的子进程在执行终端窗口上打印 ssh 登录提示符,而不是通过管道输入的代码,我不知道为什么

问题描述 投票:0回答:1

我正在用 C 语言为老式串行终端编写一个兼容层。它不支持正常的 ANSI 转义序列等,因此我使用一个程序作为 bash 和终端之间的中间人,手动转换转义码。 Termcap 对我的 Televideo 910 没有帮助。

我的代码分叉,执行 execlp 在子进程中运行 bash。我已将它连接到 pty,从该 pty 读取并写入父进程中的主文件描述符,以从 bash 获取字符并从终端向其发送按键。

它基本上可以工作,唯一的问题是,当我使用它尝试 ssh 到另一台机器时,登录提示的读取方式与所有其他 bash 输出不同,它出于某种原因进入控制终端。在这里要说得非常清楚,在我运行可执行文件 ./TVI.out 的窗口上,否则只是为了我的调试 printf,那里会出现 ssh 的密码提示。我没有镜像 bash 输出的代码,它只是以某种方式找到它并将其放在那里。输入 ssh 密码即可完成连接,并且 ssh 连接将按预期显示在终端上。我只希望密码登录屏幕也出现在终端本身上。

在 gdb 中,我遇到了 SIGTTOU 信号,我猜测这可能是罪魁祸首,但我在其上放置了一个空信号处理程序以尝试跳过它,尽管这不起作用。我还放置了一个 SIGTTIN 处理程序以防万一,但没有。快速浏览其他信号并没有向我指出仍需要处理的明显信号。

我尝试将 bash 进程的所有输出写入日志文件并检查,密码提示没有写入其中,但在控制终端窗口中登录后,它确实记录了上次登录时间和进一步的输出。

我使用 openpty 启动 pty 来与子 bash 进程通信,我不确定这是否是问题的一部分。

c ssh signals fork pty
1个回答
0
投票

所以我发现问题是我需要设置子进程。然而,我在执行此操作时遇到了问题,因此我将执行的进程更改为“setsid -c /bin/login”,而不仅仅是“/bin/login”,这似乎有效。

© www.soinside.com 2019 - 2024. All rights reserved.