【发布时间】:2019-02-10 05:35:00
【问题描述】:
我想做以下事情:我想用 script 替换我的 CentOS 7 安装中的 systemd 程序,即最终将启动一个 shell,用户可以在其中以 root 用户身份在系统控制台上输入命令。
为此,我使用了 init=/sbin/myInit 参数。在这个脚本中我做了一些初始化,最后我调用 bash 来让用户输入命令。交互式 bash 总是出现在屏幕上。
很遗憾,输入存在问题,我无法解决:输入无法正常工作。当我按 enter 时,只有第二个 enter 起作用,但屏幕上没有执行新行。当我输入一些字符时,并不是所有的字符都被读取。控制台似乎处于某种 Unicode 模式(stty -a 显示 iutf8 参数),并且 bash 无法正确读取输入。输出很好,我脚本中的所有 echo 命令都正确打印在屏幕上(我只打印 ASCII 字符)。
我尝试了各种组合,使用不同的 LC_ALL 设置(LC_ALL=C、LC_ALL=C.utf-8、没有 LC_ALL 或 LANG 变量初始化),将 stdin/stdout/stderr 重定向到 /dev/console,/dev/tty0 或 /dev/tty1,TERM 变量被初始化为 linux 值,但没有任何作用。我尝试了 unicode_start 和 unicode_stop 命令,但 unicode_stop 不起作用,并且我收到错误消息“stty:标准输入:无法执行所有请求的操作”。如果我运行 showkey 命令,然后按 enter 键,则检测到正确的 keycode 28,与正常启动相同。
比这更奇怪的是,如果我使用 init=/bin/bash 内核参数,输入工作正常,如果我手动运行我的脚本,它也工作正常.如果我将 bash 可执行文件复制到类似 /bin/mys 的位置,并使用 init=/bin/mys,则会出现相同的输入问题。似乎 initrd 图像对 /bin/bash 的处理方式不同。也许它执行了一些初始化或其他操作,使 bash 能够从终端正确读取。为什么我们在 init=/bin/bash 和 init=/bin/mys 之间会有这种差异?它最终是相同的可执行文件。
我做错了什么?
作为一个关于 init 程序的一般问题,有人可以解释一下 init 程序应该如何正常工作吗?它必须响应的任何特定信号,要执行的任何控制台初始化?
我试图解决这个问题好几天了,但我找不到任何解决方案。在网上我找不到任何关于此的文章。因此,任何建议将不胜感激。谢谢你。
【问题讨论】:
标签: linux bash console init systemd