在自動完成需要 root 權限的命令時禁用身份驗證提示
當我使用正確需要 root 權限才能執行的例如 firewall-cmd 時,當我嘗試自動完成一個選項時(例如,寫“–perm " 並按 TAB)。每次我使用自動完成時都會發生這種情況,即使我之前已經輸入了密碼和/或使用 sudo 執行了命令(它被配置為在特定時間內不提示我第二次)。
有沒有辦法讓輸入密碼在一段時間內永久有效,或者完全禁用身份驗證以僅用於自動完成(我仍然需要身份驗證以實際執行程序)?
顯而易見的解決方案是以 root 身份登錄(使用 su 或 sudo -i),但我想避免這樣做。
我正在使用 bash 和我的原始碼,這是 Debian 中隨軟體包一起提供
.bashrc
的標准文件。bash_completion``bash-completion
我可以
. /etc/bash_completion
在我的.bashrc
.執行
complete -p firewall-cmd
結果
bash: complete: firewall-cmd: no completion specification
我認為涉及 polkit 的原因(參見原始標籤)是,當我中止身份驗證對話時,我在 stdout 上得到以下資訊:
Authorization failed. Make sure polkit agent is running or run the application as superuser.
通常,要查看與 firewall-cmd 之類的命令相關的完成,人們會使用
complete -p firewall-cmd
並期望看到類似complete -F _firewall_cmd firewall-cmd
返回的內容。然後_firewall_cmd
使用 . 檢查函式type _firewall_cmd
。Debian 的 bash 補全包使用
complete -D
命令設置預設補全功能,該功能在第一次使用時查看是否有特定的補全可用,如果有,則載入它。因此,在查看如何設置完成之前嘗試完成一次非常重要。
對於
firewall-cmd
這個 文件,定義了目前啟動的完成函式_firewall_cmd() { local cur prev words cword split _init_completion -s || return firewall-cmd --state 1> /dev/null || return
/usr/bin/firewall-cmd 程序本身是一個 python 腳本,它最終需要 root 權限並要求進行身份驗證。
firewall-cmd --state
如果防火牆正在執行,則呼叫返回 true。因此,完成程式碼的意圖似乎是在防火牆未執行時不完成。但是,它需要權限才能查看防火牆是否正在執行,這會導致不需要的提示。
firwall-cmd --state 1> /dev/null || return
從完成功能中刪除該行可以更快地完成,不提示輸入密碼和其他一般好處。