ルート権限を必要とするコマンドの自動補完時に認証プロンプトを無効にする

ルート権限を必要とするコマンドの自動補完時に認証プロンプトを無効にする

たとえば、実行にルート権限が必要なファイアウォール-cmd を使用する場合、オプションを自動補完しようとすると (たとえば、「--perm」と入力して TAB キーを押すなど)、ウィンドウ (つまり、sudo の場合のようにターミナル内ではありません) にパスワードを入力するように求められます。これは、以前にパスワードを入力した場合や、sudo を使用してコマンドを実行した場合 (一定時間、2 度目のプロンプトが表示されないように設定されています) でも、自動補完を使用するたびに発生します。

パスワードの入力を一定時間永続的にするか、単なる自動補完のために認証を完全に無効にする方法はありますか (実際にプログラムを実行するには認証が必要です)?

明らかな解決策は、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.

答え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 スクリプトであり、ルート権限が必要になり、認証を求められます。 の呼び出しは、firewall-cmd --stateファイアウォールが実行中の場合は true を返します。したがって、補完コードの意図は、ファイアウォールが実行中でない場合は補完を行わないことのようです。ただし、ファイアウォールが実行中かどうかを確認するには権限が必要であるように記述されており、これが不要なプロンプトの原因となっています。

firwall-cmd --state 1> /dev/null || return補完関数から行を削除すると、補完が速くなり、パスワードの入力が求められなくなり、その他の一般的な利点も得られます。

答え2

sudo の nopasswd オプションを使用できます。ユーザーの suoders ファイルに nopasswd オプションを追加するだけです。

たとえば、ユーザー名が imosdin の場合、コマンドを実行して sudoers のエントリを変更しvisduo、以下のエントリを追加/変更します。

imsodin ALL=(ALL) NOPASSWD: ALL

これで、システムは imsodin ユーザーがパスワードを要求せずに sudo 経由で任意のコマンドを実行できるようにします。

関連情報