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

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

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

当我在 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读取密码,这意味着你不能在命令行上输入密码,或者在“此处文档”中,你必须使用一些恶作剧。

相关内容