定制的Linux系统无法使用crtl+c终止ping命令?

定制的Linux系统无法使用crtl+c终止ping命令?

我定制了根文件系统Busybox,使用的是 ,版本是1.36.1.我不知道为什么在显示器键盘上ctrl+c输入pingIP时无法终止我的设备。但是,当我通过 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、 、killweraserprnt功能也不会生效。您可以通过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=yUEFI,和/或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

权限和所有权可能会根据当前登录名以及您的发行版选择处理它们的方式而有所不同,但主要/次要设备编号(以逗号和空格分隔的两位数字)应该与此完全相同。

相关内容