我有两台计算机,它们都有一个 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
终端进程并继续重新启动它,如下所示必要的。