禁用自动完成需要 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 执行任何命令,而无需提示输入密码。

相关内容