输入后su
当我提示输入密码时:
user@debian:~$ su
Password:
我无法从键盘(同一终端)发送SIGSTOP
( ) - 什么也没有发生。ctrl+Z
因此退出的唯一方法是输入一些(正确或错误的)密码。为什么我不能以su
这种方式暂停?
UPD:似乎正在ctrl+Z
排队。因此,当发送时ctrl+Z
- 没有任何反应,但在输入Enter
信号到达后并su
停止。还是无法理解这样的行为。这是所有类 Unix 系统的标准行为还是仅适用于 Linux?
答案1
让我们澄清一些基本错误:
- 信号不是排队。当涉及到信号时,排队是一个特定的事情,并且不会发生在这个特定信号上。信号是蒙面的。
- 这个特殊的信号不是
SIGSTOP
。该susp
字符导致线路纪律发送SIGTSTP
.
login
正如许多与 20 世纪 80 年代的和命令观点相矛盾的事情一样su
,这里行为的根源是 PAM。
它不是su
做这个的。除了使用Linux PAM图书馆。例如,在使用 OpenPAM 库的 BSD 上就不会发生这种情况。
正是 Linux PAM 提供的名为 PAM 的模块pam_unix
来做这件事。更具体地说,是在代码misc_conv()
内部调用的库提供的默认“对话”函数pam_unix
正在执行此操作。SIGTSTP
它在提示输入项时专门屏蔽,表面上是为了图书馆可以清理。这就是为什么在输入之前不会传递信号的原因。
OpenPAMpam_unix
也提供 PAM 模块。这将调用 OpenPAM 库提供的默认“对话”函数openpam_ttyconv()
。后者不屏蔽信号。似乎没有人注意到su
FreeBSD 等上可以在密码提示符处暂停。并且终端将关闭回声。这可能是因为 FreeBSD 上操作系统提供的命令行 shell 都有行编辑库,当它们接管提示输入并进行自己的回显时,它们会立即重新调整终端设置。
进一步阅读
- 乔纳森·德博因·波拉德 (2014)。 “二十多年前,PAM 改变了一切。”。不要滥用 su 来删除用户权限。常见答案。
- https://unix.stackexchange.com/a/561459/5132
- https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=243584