저는 퍼즐의 다양한 조각을 보면서 터미널 에뮬레이터를 이해하려고 노력하고 있습니다.
socat을 사용하여 pty 쌍과 쉘 프로세스를 시작한 다음 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 /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 내부에서 실행되지 않도록 지시하는 방법이 있습니까? 쉘 프로세스를 설정하는 터미널 에뮬레이터는 systemd를 사용하지 않습니다. 그렇다면 어떻게 수행합니까? 터미널 에뮬레이터처럼 연결할 수 있는 쉘 프로세스를 어떻게 설정합니까?
고쳐 쓰다:
만일을 대비해 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 명령을 사용하여 만든 쌍입니다)
상황이 약간 뒤바뀌었습니다. 이는 대신 , even 또는 을 dash
입력한 다음 이를 사용하여 posix 모드를 켜는 경우에만 발생하며 작업 제어가 작동하는 것 같습니다. 먼저 bash를 입력한 다음 거기에서 dash를 열면 작업 제어가 작동하지만, 처음에 dash를 연 다음 dash 내에서 bash를 열면 작동하지 않습니다. 터미널 설정은 어디를 선택하든 동일합니다 . 따라서 대시가 시작되는 방식에는 약간의 차이가 있을 것입니다.bash
bash --noediting --posix
ln -s /bin/bash sh
sh
--noediting
답변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
Ctrl/C나 Ctrl/Z와 같은 신호를 사용하도록 /bin/sh
( ) 할 수는 없습니다 ./bin/dash