我定制了根文件系统Busybox
,使用的是 ,版本是1.36.1
.我不知道为什么在显示器键盘上ctrl+c
输入ping
IP时无法终止我的设备。但是,当我通过 SSH 连接到设备时, IP 可以通过?ping
终止。ctrl+c
也同样如此ctrl+u
。
我提到类似问题,但没有解决我的问题。
顺便说一句,我的系统没有桌面环境。我的处理器是 Intel x86_64 位。
#1 #stty -a(SSH 连接)
speed 38400 baud; rows 41; columns 143; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^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(监视键盘)
speed 38400 baud; rows 37; columns 100; 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; flush = ^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
#2 #cat /etc/inittab(旧)
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
#cat /etc/inittab (新)
::sysinit:/etc/init.d/rcS
tty1::respawn:/sbin/getty 38400 tty1
tty2::respawn:/sbin/getty 38400 tty2
tty3::respawn:/sbin/getty 38400 tty3
tty4::respawn:/sbin/getty 38400 tty4
tty5::respawn:/sbin/getty 38400 tty5
tty6::respawn:/sbin/getty 38400 tty6
::ctrlaltdel:/bin/umount -a -r
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
#3 #echo $SHELL(SSH 连接)
/bin/bash
#echo $SHELL(监视键盘)
/bin/sh
#4 #echo $TERM(SSH 连接)
xterm
#echo $TERM(监视键盘)
xterm
#5 #tty(SSH 连接)
/dev/pts/0
#tty(监视键盘)
/dev/console
#6 #ls -l /dev/console /dev/tty[0-9]
crw-rw---- 1 root root 5, 1 Jan 4 04:31 /dev/console
crw-rw---- 1 root root 4, 0 Jan 4 04:31 /dev/tty0
crw-rw---- 1 root root 4, 1 Jan 4 04:32 /dev/tty1
crw-rw---- 1 root root 4, 2 Jan 4 04:31 /dev/tty2
crw-rw---- 1 root root 4, 3 Jan 4 04:31 /dev/tty3
crw-rw---- 1 root root 4, 4 Jan 4 04:31 /dev/tty4
crw-rw---- 1 root root 4, 5 Jan 4 04:31 /dev/tty5
crw-rw---- 1 root root 4, 6 Jan 4 04:31 /dev/tty6
crw-rw---- 1 root root 4, 7 Jan 4 04:31 /dev/tty7
crw-rw---- 1 root root 4, 8 Jan 4 04:31 /dev/tty8
crw-rw---- 1 root root 4, 9 Jan 4 04:31 /dev/tty9
答案1
在“监视键盘”stty -a
输出上,有-isig -icanon -iexten
,而 SSH 会话启用了这些功能(-
前面没有标志)。
描述man stty
如下:
[-]icanon
启用特殊字符:erase、kill、werase、rprnt
[-]iexten
启用非 POSIX 特殊字符
[-]isig
启用中断、退出和挂起特殊字符
因此,对于-isig
,Control-C、Control-\ 和 Control-Z 特殊功能是关闭。同样,-icanon
表示erase
、 、kill
、werase
等rprnt
功能也不会生效。您可以通过stty isig icanon
监视器键盘会话来修复此问题。
这可能是因为您/bin/sh
直接启动,/etc/inittab
而没有在登录过程开始时使用类似过程getty
将 TTY 设备设置初始化为众所周知的值。
inittab
如果您想在不需要登录的情况下直接运行 shell ,您应该在 中自行执行任何必要的 TTY 初始化/etc/init.d/rcS
,例如:
for i in 1 2 3 4 5 6; do
stty -F /dev/tty$i isig icanon
done
在 SSH 会话中,使用伪 TTY 设备(简称 PTY),并sshd
自动进行初始化。
/dev/console
因为命令输出的结果tty
有点可疑。至少在 x86 架构上,/dev/console
本质上是当前活动控制台设备的兼容性别名:它通常可能连接到/dev/tty0
(即当前活动的 KVM 虚拟控制台),但它可能指向一个串行端口,就像/dev/ttyS0
内核console=
启动一样使用了选项。
您的内核是否启用了以下所有配置选项?
CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_VT_HW_CONSOLE_BINDING=y
- 或
CONFIG_VGA_CONSOLE=y
以及CONFIG_FRAMEBUFFER_CONSOLE=y
适当的帧缓冲区控制台驱动程序,例如CONFIG_FB_VESA=y
经典 BIOS 或CONFIG_FB_EFI=y
UEFI,和/或CONFIG_DRM_FBDEV_EMULATION=y
如果在控制台上使用较新的直接渲染 GPU 驱动程序,也可能如此。
控制台设备节点设置是否正确?在 Debian 12 系统上,ls -l /dev/console /dev/tty[0-9]
有以下输出:
crw--w---- 1 root tty 5, 1 Nov 10 02:26 /dev/console
crw--w---- 1 root tty 4, 0 Nov 10 02:25 /dev/tty0
crw--w---- 1 root tty 4, 1 Jan 30 13:37 /dev/tty1
crw--w---- 1 root tty 4, 2 Nov 10 02:25 /dev/tty2
crw--w---- 1 root tty 4, 3 Nov 10 02:25 /dev/tty3
crw--w---- 1 root tty 4, 4 Nov 10 02:25 /dev/tty4
crw--w---- 1 root tty 4, 5 Nov 10 02:25 /dev/tty5
crw--w---- 1 root tty 4, 6 Nov 10 02:25 /dev/tty6
crw--w---- 1 root tty 4, 7 Nov 10 02:26 /dev/tty7
crw--w---- 1 root tty 4, 8 Nov 10 02:25 /dev/tty8
crw--w---- 1 root tty 4, 9 Nov 10 02:25 /dev/tty9
权限和所有权可能会根据当前登录名以及您的发行版选择处理它们的方式而有所不同,但主要/次要设备编号(以逗号和空格分隔的两位数字)应该与此完全相同。