Отключить запрос на аутентификацию при автозавершении команды, требующей привилегий root

Отключить запрос на аутентификацию при автозавершении команды, требующей привилегий root

Когда я использую, например, firewall-cmd, которому для выполнения нужны привилегии root, мне в окне (а не в терминале, как в случае с sudo) предлагается ввести пароль, когда я пытаюсь выполнить автодополнение опции (например, написать "--perm" и нажать TAB). Это происходит каждый раз, когда я использую автодополнение, даже если я уже ввел свой пароль и/или выполнил команду с помощью sudo (которая настроена не запрашивать меня второй раз в течение определенного времени).

Есть ли способ сделать ввод пароля постоянным на определенное время или полностью отключить аутентификацию для простого автозаполнения (мне все равно нужна аутентификация для фактического запуска программы)?

Очевидным решением является вход в систему как root (используйте su или sudo -i), но я бы хотел этого избежать.

Я использую bash, а мои .bashrcисходные файлы — стандартный bash_completionфайл, поставляемый с bash-completionпакетом в Debian.

Я могу воспроизвести это только . /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-cmdcoming back. Затем можно проверить _firewall_cmdфункцию, используя type _firewall_cmd.

Пакет автодополнения bash для Debian использует 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

Вы можете использовать опцию nopasswd sudo. Просто добавьте опцию nopasswd в файл suoders для вашего пользователя.

например, если ваше имя пользователя imosdin, то измените запись в sudoers, выполнив команду visduo, и добавьте/измените указанную ниже запись.

imsodin ALL=(ALL) NOPASSWD: ALL

Теперь система позволит пользователю imsodin выполнять любую команду через sudo без запроса пароля.

Связанный контент