当我使用例如firewall-cmd(它正确地需要root权限才能执行)时,当我尝试自动完成选项时(例如写“--perm”),我会在窗口中收到提示(因此不像sudo那样在终端中)提示我提供密码”并按 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 的原因(参见原始标签)是,当我中止身份验证对话时,我在标准输出上得到以下内容:
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 执行任何命令,而无需提示输入密码。