
答案1
這不是“sudo”提示符,而是“polkit”提示符。避免這種情況的一種方法—全局全部軟體,而不僅僅是 systemctl – 是編寫一個立即拒絕該操作(或立即允許該操作)的 polkit 規則。
polkit.addRule(function(action, subject) {
if (subject.user !== "root") {
if (/^org\.freedesktop\.systemd1\./.test(action.id)) {
return polkit.Result.NO;
}
}
});
(該subject.user
測試可以省略,因為 root 呼叫的操作完全繞過 polkit 檢查。)
polkit 規則儲存在 中/etc/polkit/rules.d/*.rules
,一般命名為80-custom.rules
(按升序處理)。欲了解更多信息,請參閱波爾基特(8)。
(也就是說,如果您的 sudo 配置是無密碼的,那麼使用「sudo」與讓 polkit 立即允許該操作之間沒有實際的安全差異。反之亦然,如果您的 sudo需要密碼...那麼為什麼不直接將其輸入到 polkit 對話框中呢?這是相同的密碼。
答案2
有一個選項--no-ask-password
。建立一個別名:
alias systemctl='systemctl --no-ask-password'
(在 Bash、Kubuntu 中測試)。
答案3
不要將 sudo 用於 systemctl,曾經;如果你是允許進行維護,正確設定 polkit。
基本原理:sudo
使您的程式由請求的使用者有效運作(通常:root
)。包括所有連結的工具包。程式、庫或 ...sudo 配置中的任何錯誤都會使您容易受到攻擊。在 的情況下systemd
,systemctl
二進位檔案只是控制器(一般來說)。它才不是需要 root 權限(對於大多數用例),因為它本身不執行特權操作,而是詢問init
.使用實際root
帳戶(直接或通過sudo
)是全有或全無的原子(炸彈)解決方案,而僅有的所需要的就是授權(不:驗證)反對systemd
。既然systemd
明白polkit
了授權, 使用經過驗證的root
只是授予的權限太多了。
考慮 中的一個錯誤systemctl
,它允許直接呼叫任意命令(而不是通過systemd
)。當root
權限由 授予時sudo
,可以執行任意 EUID=0 的命令。以systemctl
非特權使用者身分執行時,只能使用他先前取得存取權限的帳戶來執行此類命令。這是一些基本安全規則的簡單結果:
- 僅使用所需的權限集(不是完整的權限集 ==
root
), - 僅將這些權限授予需要它的程式碼(在
systemd
不授予權限的情況下授權systemctl
)。
至於成為一台機器的唯一用戶 - 如果您使用非特權帳戶而不是該帳戶工作root
,我假設您想限制您正在執行的程式獲得多餘的權限。systemctl
僅因為該root
帳戶是authorized
命令而授予它們systemd
是多餘的權限。
此外,polkit
您可以為不同的操作(啟動/停止/重新載入/其他)和不同的服務設定不同的存取標準。您可以將精確的指令放入 中sudoers
,但 polkit 解決方案知道此類指令的特定部分。
結論sudo
:如果有任何特權較低的方法可用,請勿使用。sudo
是全有或全無的最後解決方案。
如果您希望密碼提示以文字形式顯示,而不是圖形形式,只需取消設定顯示,例如:將您的終端機與執行身份驗證代理程式的圖形會話解除綁定。