我可以在没有 pty 的情况下设置串行终端 (RS-232) 吗?

我可以在没有 pty 的情况下设置串行终端 (RS-232) 吗?

我有两台计算机,它们都有一个 RS-232 端口,并/dev/ttyS0通过空调制解调器连接在一起。

我试图一点一点地了解外部终端在过去是如何工作的,以及它与今天的 Linux 工作方式有何关系。

我已经让它像这样工作了:

主计算机:

$ sudo socat /dev/ttyS0,raw,echo=0 exec:"/bin/bash -i",pty,stderr,setsid,sigint,sane

终端:

picocom -b 9600 /dev/ttyS0

然而,这pty里面有 - 这就是为什么我在终端上得到这个:

# tty
/dev/pts/11

如果你有一个真正的现实生活中的 tty,你不应该需要一个伪 tty,不是吗?我的意思是,他们在做出伪任何东西之前就用电线连接了端子,不是吗?

所以我一直在尝试混合和匹配 socat 选项,使其不带 pty,但没有运气。如果我的终端计算机中出现任何内容,则没有回车或作业控制并tty显示“不是 tty”。

我必须承认我不理解 socat 语法(或终端设置) - 我希望看到正确的答案,并从那里理解语法。

有人可以告诉我如何制作一个没有 pty 的远程终端,或者帮助我接受这是不可能的吗?

答案1

如果从命令行启动getty,则可能需要以 root 身份运行它并将其包装到循环中:

while true; do getty -8 9600 ttyS0; done

一次调用只会getty给您一个会话,或者一组通常为 3 次的登录尝试,或者直到串行端口收到挂断信号。如果picocom最初发送挂断来重置串行线路,则会导致第一个getty退出。

如果getty进程没有被串行端口挂起信号提前终止,那么它将设置 TTY 设备,将内容发送/etc/issue到终端,然后显示登录提示。如果输入了有效的用户名,getty将会exec()(注意:没有 fork()首先)/bin/login,这通常会调用 PAM 库来处理密码提示和用户会话设置的其余部分。作为该过程的一部分,进程的身份将切换到正在登录的用户,然后启动为getty然后变成的进程login将再次调用exec()成为用户的 shell。如果该进程死掉了出于任何原因,用户的会话将结束,并且getty将启动新的进程以进行新的登录。

在循环中手动运行getty可能是“可视化”需要发生的事情的好方法,但这不是长期使用的正确方法。

所有getty进程实际上都是为了在init启动其生命的进程getty(并在成功登录后转换为用户的 shell)死亡时启动和重新启动......所以在使用 的现代 Linux 发行版上systemd,命令getty在连接到终端的串行端口上运行通常是:

systemctl start [email protected]

为了使其在重新启动后仍然存在,您还需要

systemctl enable [email protected]

如果您使用经典的 SysVinit,则文件中应该有注释掉的示例行/etc/inittab:只需取消注释相应的行,然后运行telinit q以使 SysVinit 重新读取其配置,并且init应立即启动getty终端进程并继续重新启动它,如下所示必要的。

相关内容