私はパズルのさまざまな部分を見ながら、ターミナルエミュレータを理解しようとしています。
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
$
役に立つ場合に備えて、3番目の端末の端末設定は次のとおりです。
$ 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