su 命令如何屏蔽/保护我的密码不显示在屏幕上?

Mik*_*e B 5 password terminal su

如果这是一个抽象的问题,请道歉 - 我会尽量具体。

当我在 bash shell 并通过 切换到其他帐户时su - foo,系统会提示我输入密码。我在此密码提示下输入的字符在屏幕上是隐藏的,没有指示我输入了多少个字符或它们是什么。bash(或一般的 Linux)是如何做到这一点的?

cho*_*oba 8

您键入的内容会显示在终端中,因为终端会“回显”它。当要求输入密码时,回显关闭。另请参阅help read及其-s选项。


Bru*_*ger 6

我相信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
Run Code Online (Sandbox Code Playgroud)

我不是 100% 错的。su实际上确实从 stdin 读取,但它确实关闭了使用终端控件在 stdin 上的回显ioctl()。在我输入密码su后,再次打开回显,再次使用ioctl()系统调用。

我知道其他一些程序,ftp特别是客户端,确实用于/dev/tty读取密码,这意味着您不能在命令行上输入密码,或者在“此处的文档”中,您必须使用一些恶作剧。