
Когда я использую, например, 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-cmd
coming 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 без запроса пароля.