当我使用 socat 创建自己的 pty 对时,作业控制不起作用

当我使用 socat 创建自己的 pty 对时,作业控制不起作用

我正在尝试通过查看拼图的不同部分来理解终端模拟器。

我正在尝试使用 socat 启动 pty 对和 shell 进程,然后使用 picocom 连接到它。

这是我对 socat 命令的理解:

$ socat -d -d PTY,raw,echo=0 EXEC:"/bin/sh",pty,stderr,setsid,sane
2024/03/12 08:12:16 socat[9106] N PTY is /dev/pts/5
2024/03/12 08:12:16 socat[9106] N forking off child, using pty for reading and writing
2024/03/12 08:12:16 socat[9106] N forked off child process 9107
2024/03/12 08:12:16 socat[9106] N forked off child process 9107
2024/03/12 08:12:16 socat[9106] N starting data transfer loop with FDs [5,5] and [7,7]
2024/03/12 08:12:16 socat[9107] N execvp'ing "/bin/sh"

现在尝试连接 picocom。貌似可以,但是信号不行。

$ picocom /dev/pts/5
picocom v3.1

port is        : /dev/pts/5
flowcontrol    : none
baudrate is    : 9600
parity is      : none
databits are   : 8
stopbits are   : 1
escape is      : C-a
local echo is  : no
noinit is      : no
noreset is     : no
hangup is      : no
nolock is      : no
send_cmd is    : sz -vv
receive_cmd is : rz -vv -E
imap is        : 
omap is        : 
emap is        : crcrlf,delbs,
logfile is     : none
initstring     : none
exit_after is  : not set
exit is        : no

Type [C-a] [C-h] to see available commands
Terminal ready

$ tty # make sure I'm hooked up to the right thing
/dev/pts/6
$ sleep 10 # see if signals are working
^C$ sh # signals are not working - so opening a new shell which will show the error message that picocom hid
sh: 0: can't access tty; job control turned off
$ 

这是第三个终端的终端设置,以防有帮助

$ stty -a -F /dev/pts/5
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
$ stty -a -F /dev/pts/6
speed 38400 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

我上次实验设置getty时遇到了类似的问题: 当我尝试通过串行设置 getty 时,作业控制不起作用

问题是 getty 不喜欢在现有的 tty 内运行。这里也是同样的问题吗?有没有办法告诉 socat 不要在 tty 内运行?设置 shell 进程的终端模拟器不使用 systemd,那么它们是如何做到的呢?我怎样才能像终端模拟器一样设置一个可以连接的 shell 进程?


更新:

我尝试在 systemd 中运行 socat 以防万一,结果是一样的。


回复评论:

这是在 systemd 中运行 socat 命令的情况

$ ps j $$
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
16170 16171 16170 16170 ?           -1 S     1000   0:00 /bin/sh

这是 socat 在另一个终端的前台运行的情况

$ ps j $$
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
19215 19216 19216 19216 ?           -1 Ss    1000   0:00 /bin/sh
$ tty
/dev/pts/11

(10/11 是我使用 socat 命令创建的对)


事情发生了一点曲折。这只发生在dash.如果你改为输入bash,或者甚至bash --noediting --posix或者ln -s /bin/bash sh,然后使用它sh来打开 posix 模式,作业控制似乎可以工作。如果您先进入 bash,然后从那里打开 dash,则作业控制可以工作,但如果您最初打开 dash,然后从 dash 内部打开 bash,则它不起作用。只要你选择,终端设置都是一样的--noediting。所以 dash 的启动方式肯定有一些不同。

答案1

对我有用的是使用bash而不是sh

socat -d -d PTY,raw,echo=0 EXEC:"/bin/bash",pty,stderr,setsid,sane
2024/03/12 18:32:09 socat[24732] N PTY is /dev/pts/2
2024/03/12 18:32:09 socat[24732] N forking off child, using pty for reading and writing
2024/03/12 18:32:09 socat[24732] N forked off child process 24733
2024/03/12 18:32:09 socat[24732] N forked off child process 24733
2024/03/12 18:32:09 socat[24732] N starting data transfer loop with FDs [5,5] and [7,7]
2024/03/12 18:32:09 socat[24733] N execvp'ing "/bin/bash"

然后在平行会议中,

picocom /dev/pts/2; echo EXIT FROM PICOCOM
picocom v3.1
[…]
Type [C-a] [C-h] to see available commands
Terminal ready

pi$ sleep 5
^C
$ sleep 5
^Z
[1]+  Stopped                 sleep 5
$ jobs
[1]+  Stopped                 sleep 5
$ exit
exit

FATAL: read zero bytes from port
term_exitfunc: reset failed for dev UNKNOWN: Input/output error
EXIT FROM PICOCOM

我根本无法让/bin/sh( /bin/dash) 使用 Ctrl/C 或 Ctrl/Z 等信号。

相关内容