Bash

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

  • September 16, 2018

當我使用正確需要 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從完成功能中刪除該行可以更快地完成,不提示輸入密碼和其他一般好處。

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