当我使用例如防火墙-cmd(正确地需要根权限来执行)时,当我试图自动完成一个选项(例如写"--perm“并点击TAB)时,会在一个窗口(在终端中不像sudo那样)提示我提供密码。每次我使用自动完成时都会发生这种情况,即使我在使用sudo之前输入了密码并/或运行了命令(该命令被配置为在一定时间内不提示我第二次提示)。
是否有任何方法使输入密码永久一段时间,或完全禁用身份验证仅仅是自动完成(我仍然希望认证的实际运行程序)?
显而易见的解决方案是以root身份登录(使用su或sudo -i),但我想避免这样做。
我使用的是bash和.bashrc
源代码,这是Debian中随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.
发布于 2016-11-12 22:03:17
通常,要查看与防火墙-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程序本身是一个python脚本,它最终需要根权限并请求身份验证。如果防火墙正在运行,则对firewall-cmd --state
的调用返回true。因此,如果防火墙没有运行,完成代码的意图似乎是不完成。但是,编写它是为了需要特权来查看防火墙是否正在运行,这将导致不必要的提示。
从完成函数中删除firwall-cmd --state 1> /dev/null || return
行使完成速度更快,不提示输入密码,以及其他一般优点。
发布于 2016-11-06 19:14:48
您可以使用sudo的nopasswd选项。只需在suoders文件中为用户添加nopasswd选项即可。
例如,如果您的用户名是imosdin,那么通过执行命令visduo
修改sudoers中的条目,然后添加/修改下面提到的条目。
imsodin ALL=(ALL) NOPASSWD: ALL
现在,系统将允许imsodin用户通过sudo执行任何命令,而无需提示密码。
https://unix.stackexchange.com/questions/321478
复制相似问题