如果这是一个抽象的问题,我深表歉意 - 我会尽量具体。
当我在 bash shell 并通过 切换到另一个帐户时su - foo
,系统会提示我输入密码。我在此密码提示符下键入的字符在屏幕上隐藏,不显示我正在键入多少个字符或它们是什么。 bash(或一般的 Linux)是如何做到这一点的?
答案1
您键入的内容会显示在终端中,因为终端会“回显”它。当询问密码时,回显被关闭。另请参阅help read
及其-s
选项。
答案2
我相信su
可能打开了/dev/tty
,将终端驱动程序设置更改为不回显,然后从/dev/tty
的文件描述符中读取。
为了测试这个信念,我strace -o su.out su -
在我的 Arch Linux 笔记本电脑上运行。输出的相关部分strace
:
ioctl(0, SNDCTL_TMR_CONTINUE or TCSETSF, {B38400 opost isig icanon -echo ...}) = 0
write(2, "Password: ", 10) = 10
read(0, "hahanotthis\n", 511) = 7
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
我并不是100%错了。su
实际上是从 stdin 读取的,但它确实使用终端控件关闭了 stdin 上的回显ioctl()
。输入密码后,再次通过系统调用su
重新打开回显。ioctl()
我知道其他一些程序,ftp
特别是客户端,确实使用/dev/tty
读取密码,这意味着你不能在命令行上输入密码,或者在“此处文档”中,你必须使用一些恶作剧。