停用自動完成需要 root 權限的命令時的身份驗證提示

停用自動完成需要 root 權限的命令時的身份驗證提示

當我使用例如firewall-cmd(它正確地需要root權限才能執行)時,當我嘗試自動完成選項時(例如寫“--perm”),我會在視窗中收到提示(因此不像sudo那樣在終端機中)提示我提供密碼」並按 TAB 鍵)。每次我使用自動完成功能時都會發生這種情況,即使我之前已經輸入了密碼和/或使用 sudo 運行了命令(配置為在特定時間內不會再次提示我)。

有什麼方法可以使輸入密碼在一段時間內永久有效,或者完全禁用身份驗證以實現自動完成(我仍然希望對實際運行程序進行身份驗證)?

顯而易見的解決方案是以 root 身份登入(使用 su 或 sudo -i),但我想避免這樣做。

我正在使用 bash,我的原始程式碼是Debian 中軟體包附帶的.bashrc標準檔案。bash_completionbash-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 執行任何命令,而無需提示輸入密碼。

相關內容