Linux

為什麼 su 命令忽略 SIGSTOP?

  • January 25, 2020

進入後su當我提示輸入密碼時:

user@debian:~$ su
Password:

我無法從我的鍵盤(同一個終端)發送SIGSTOP( ctrl+Z) - 沒有任何反應。所以退出的唯一方法是輸入一些(正確或錯誤的)密碼。為什麼我不能su以這種方式暫停?

UPD:似乎ctrl+Z已經排隊了。因此,在發送時ctrl+Z- 什麼都沒有發生,但是在輸入Enter信號到達並su停止之後。仍然無法理解這種行為。這是所有類 Unix 還是僅適用於 Linux 的標準行為?

讓我們清除一些基本錯誤:

  1. 信號排隊。當涉及到信號時,排隊是一個特定的事情,並且不會發生在這個特定的信號上。信號被屏蔽
  2. 這個特殊的信號不是 SIGSTOP。該susp字元使線路規則發送一個SIGTSTP.

與許多與 1980 年代對loginandsu命令的觀點相矛盾的事情一樣,這裡行為的根源是 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 都具有行編輯庫,當它們接管提示輸入並進行自己的回顯時,它們會立即重新調整終端設置。

進一步閱讀

引用自:https://unix.stackexchange.com/questions/563912