
當我使用例如firewall-cmd(它正確地需要root權限才能執行)時,當我嘗試自動完成選項時(例如寫“--perm”),我會在視窗中收到提示(因此不像sudo那樣在終端機中)提示我提供密碼」並按 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 的原因(請參閱原始標籤)是,當我中止身份驗證對話時,我在標準輸出上得到以下內容:
Authorization failed.
Make sure polkit agent is running or run the application as superuser.
答案1
通常,要查看與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
從完成功能中刪除該行可以使完成速度更快,不提示輸入密碼,以及其他一般優點。
答案2
您可以使用 sudo 的 nopasswd 選項。只需在 suoders 檔案中為您的使用者新增 nopasswd 選項即可。
例如,如果您的使用者名稱是 imosdin,請執行 command 修改 sudoers 中的條目visduo
,並新增/修改下面提到的條目。
imsodin ALL=(ALL) NOPASSWD: ALL
現在,系統將允許 imsodin 使用者透過 sudo 執行任何命令,而無需提示輸入密碼。