Linux
為什麼 su 命令忽略 SIGSTOP?
進入後
su
當我提示輸入密碼時:user@debian:~$ su Password:
我無法從我的鍵盤(同一個終端)發送
SIGSTOP
(ctrl+Z
) - 沒有任何反應。所以退出的唯一方法是輸入一些(正確或錯誤的)密碼。為什麼我不能su
以這種方式暫停?UPD:似乎
ctrl+Z
已經排隊了。因此,在發送時ctrl+Z
- 什麼都沒有發生,但是在輸入Enter
信號到達並su
停止之後。仍然無法理解這種行為。這是所有類 Unix 還是僅適用於 Linux 的標準行為?
讓我們清除一些基本錯誤:
- 信號未排隊。當涉及到信號時,排隊是一個特定的事情,並且不會發生在這個特定的信號上。信號被屏蔽。
- 這個特殊的信號不是
SIGSTOP
。該susp
字元使線路規則發送一個SIGTSTP
.與許多與 1980 年代對
login
andsu
命令的觀點相矛盾的事情一樣,這裡行為的根源是 PAM。它不是
su
這樣做的。除了使用Linux PAM庫的作業系統之外,它不會發生在作業系統上。例如,在使用 OpenPAM 庫的 BSD 上不會發生這種情況。它是 Linux PAM 提供的 PAM 模組,命名為
pam_unix
執行此操作。更具體地說,misc_conv()
在程式碼內部呼叫的庫提供的預設“對話”函式pam_unix
正在執行此操作。SIGTSTP
它在提示輸入項目時專門屏蔽,表面上是為了讓庫可以清理. 這就是為什麼在輸入輸入之前不傳送信號的原因。OpenPAM
pam_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