Answers:
您在sudoers
文件中还有另一个与您的用户匹配的条目。该NOPASSWD
规则必须位于该规则之后才能优先。
完成此操作后,sudo
通常会提示除以外的所有命令输入密码/path/to/my/program
,它将始终让您运行而无需输入密码。
.bashrc
)吗?甚至是其中的shell脚本/usr/local/sbin
?尝试。
/etc
,但是某些系统将其放在其他位置。如果找不到,请尝试man sudoers
。该文件的本地位置应man
在sudo
为该系统构建时替换到页面中。
如果中有多个匹配条目/etc/sudoers
,则sudo使用最后一个。因此,如果您可以在带密码提示的情况下执行任何命令,并且希望能够在没有密码提示的情况下执行特定的命令,则最后需要例外。
myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program
请注意,使用(root)
,以允许该程序以root用户而不是其他用户身份运行。(除非您已经考虑了潜在的影响,否则请不要授予超出所需最低权限的更多权限。)
对于未运行Ubuntu或已更改默认sudo配置的读者(请注意,Ubuntu的sudo默认是可以的):运行具有提升特权的shell脚本是有风险的,您需要从干净的环境开始(一旦shell启动,为时已晚(请参阅在shell脚本上允许setuid,因此您需要sudo来解决)。确保Defaults env_reset
in /etc/sudoers
或此选项是编译时的默认值(sudo sudo -V | grep env
应包含Reset the environment to a default set of variables
)。
john ALL=(ALL) NOPASSWD: all
。通过没有意义su
。
sudoers
,您无需执行任何特殊操作:sudo
每次检查一次。
完整的解决方案:以下步骤将帮助您实现所需的输出:
创建一个新的脚本文件(替换create_dir.sh
为所需的脚本名称):
vim ~/create_dir.sh
该脚本将在用户的主目录中创建
添加只有a root
或sudo
用户才能执行的一些命令,例如在根目录级别创建文件夹:
mkdir /abc
注意:请勿添加sudo
到这些命令。保存并退出(使用:wq!
)
使用以下命令为其分配执行权限:
sudo chmod u+x create_dir.sh
进行更改,以便此脚本不需要密码。
打开sudoers
文件:
sudo visudo -f /etc/sudoers
在末尾添加以下行:
ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
替换ahmad
为您的用户名。还要确保这是最后一行。保存并退出。
现在,在运行命令时,请在命令sudo
之前添加:
sudo ./create_dir.sh
这将在脚本文件中运行命令,而无需输入密码。
请遵循此处提到的简单步骤http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/
sudo
部分sudo chmod u+x create_dir.sh
是不必要的,因为用户(大概)拥有其主目录的所有权。由于用户可以写入create_dir.sh
,因此您已经有效地为该用户提供了免费的root shell。
chmod
都是不必要的,因为您依赖于sudo
提升特权。
我认为您的语法有误。至少我使用以下对我有用的东西:
myusername ALL=(ALL) NOPASSWD: /path/to/executable
(ALL)
部分是可选的,省去它具有完全相同的效果。拥有(root)
虽然会更好,但是缺少它并不能解释问题。
如果您有像Manjaro这样的发行版,则必须首先处理覆盖/ etc / sudoers定义的文件,您可以将其删除或直接使用该文件来添加新配置。
该文件是:
sudo cat /etc/sudoers.d/10-installer
唯一的查看方式是在根特权下,如果没有该目录,您将无法列出该目录,该文件是Manjaro特有的,您可能会在其他目录中找到该配置的其他名称。
在您选择的文件中,您可以添加以下行以获得所需的配置:
忽略组的身份验证
%group ALL=(ALL) NOPASSWD: ALL
或忽略用户的身份验证
youruser ALL=(ALL) NOPASSWD: ALL
或忽略身份验证特定用户的可执行文件
youruser ALL=(ALL) NOPASSWD: /path/to/executable
快速说明:您正在打开无需身份验证即可使用SUDO的大门,这意味着您可以运行一切以修改系统中的所有内容,并负责任地使用它。
验证sudo是否没有别名。这样跑
/usr/bin/sudo /path/to/my/program
例如这样的shell别名:
alias sudo="sudo env PATH=$PATH"
可能会导致这种行为。
sudoers
sudo 的处理。还是在谈论重定向sudo
到总是打印此错误消息以获取密码的内容?这在这里不太可能……
alias sudo="sudo env PATH=$PATH"
我的身体造成的~/.bashrc
。我提交的答案不仅是为自己解决问题,也只是盲目地从事我的业务,它是针对与此线程相关的任何其他人的可能解决方案。
执行脚本时,需要以身份运行sudo /path/to/my/script
。
编辑:根据您对另一个答案的评论,您想从一个图标运行它。您将需要创建一个.desktop
使用sudo执行程序的文件,就像在终端上一样。
您也可以考虑使用gtk-sudo
可视密码提示。
您可能应该考虑这样一种想法,即您不应该以超级用户身份运行事物,并且更远地更改系统以使您完全不需要超级用户权限将是一个更好的方法。
这为我解决了这个问题(也尝试了一些其他答案,可能有帮助):
我正在调用的脚本位于/usr/bin
,我没有写权限的目录中(尽管我通常可以在其中读取任何文件)。该脚本是+ x(可执行的权限),但是仍然无法正常工作。将该文件移动到主目录中的路径,而不是/usr/bin
,我终于可以使用sudo调用它而无需输入密码。
我也对此有所怀疑(为以后的读者澄清):您需要以sudo身份运行脚本。类型sudo
时调用的脚本。不要sudo
在脚本中实际需要root的命令中使用命令(在我的情况下,更改键盘背光)。也许这也可行,但是您不需要这样做,这似乎是一个更好的解决方案。
sudo
如果您具有适当的权限(在中设置sudoers
)来运行有问题的命令而无需输入密码,那么实际上在脚本内部使用脚本是完全可以的。它使事情更加安全。
另一种可能是安装,配置,然后使用super命令以如下方式运行脚本:
super /path/to/your/script
如果你想运行一些二进制可执行文件(例如,您已经汇编成ELF一些C源代码的二进制) -其不是一个脚本-为根,你可能会考虑将它的setuid(实际上/bin/login
,/usr/bin/sudo
与/bin/su
和super
都使用这种技术)。但是,请非常小心,您可能会打开一个巨大的安全漏洞。
具体来说,您的程序应该是偏执的编码(因此,在“执行”之前,请检查所有参数以及环境和外部条件,并假设可能存在敌对用户),然后可以小心使用seteuid(2)和朋友(另请参见setreuid(2)) (另请参阅功能(7)和凭据(7)和execve(2) ...)
安装这样的二进制文件时,将使用chmod u+s
(阅读chmod(1))。
但是要非常小心。
在编码之前,请阅读有关setuid的许多知识,包括Advanced Linux Programming。
注意,脚本或任何shebang编辑的东西都不能设置为uid。但是您可以(用C语言)编写一个小的setuid-binary包装它。
理想情况下,如果要自定义可以通过哪些命令运行,sudo
则应在单独的文件下进行这些更改,/etc/sudoers.d/
而不是sudoers
直接编辑该文件。您还应该始终使用visudo
来编辑文件。你不应该授予NOPASSWD
的ALL
命令。
例:
sudo visudo -f /etc/sudoers.d/mynotriskycommand
插入您的线路授予权限:
myuser ALL= NOPASSWD: /path/to/your/program
然后保存并退出,visudo
如果您有任何语法错误,则会警告您。
您可以运行sudo -l
查看已被授予用户的权限,如果在输出中的NOPASSWD
任何%groupyouarein ALL=(ALL) ALL
命令之前出现任何特定于用户的命令,系统将提示您输入密码。
如果您发现自己创建了许多此类sudoers.d文件,则可能需要创建按用户命名的文件,以便于查看。请记住,文件名和文件中规则的顺序非常重要,无论是允许的数量还是更少的数量,最后一个加载的都将获胜。
您可以使用00-99或aa / bb / cc前缀来控制文件名的顺序,但是请记住,如果您有任何不带数字前缀的文件,它们将在编号文件后加载,覆盖设置。这是因为,根据语言设置的不同,shell会先使用“数字排序”,然后再按“升序”排序时使用大写和小写形式。
尝试运行printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
并printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
查看您当前使用的语言是否打印AaBbCc
等,ABC
然后abc
确定要使用的最佳“最后”字母前缀是什么。
以下是仅当命令具有一组特定选项(部分选项为变量)时才希望运行不带密码的命令的情况。AFAIK不可能在sudoers声明中使用变量或值范围,即可以允许显式访问command option1
但不能command option2
使用:
user_name ALL=(root) /usr/bin/command option1
但是,如果结构是command option1 value1
,value1
可以在哪里变化,则您需要为的每个可能值都有明确的sudoers行value1
。Shell脚本提供了一种解决方法。
该答案的灵感来自艾哈迈德·扎法尔(M. Ahmad Zafar)的答案,并在那里解决了安全问题。
sudo
。/usr/local/bin/
),将文件设置为root拥有(例如chown root:wheel /usr/local/bin/script_name
),而其他用户则没有写访问权限(例如chmod 755 /usr/local/bin/script_name
)。使用visudo将异常添加到sudoers中:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
。
运行您的脚本sudo script_name
。
例如,我想更改macOS上的显示睡眠超时。使用以下命令完成此操作:
sudo pmset displaysleep time_in_minutes
我认为更改睡眠超时是一种无辜的举动,它不能证明输入密码的麻烦,但pmset
可以做很多事情,我想将这些其他事情保留在sudo密码后面。
所以我在下面有以下脚本/usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
在sudoers
文件末尾,我有以下几行:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
要将超时设置为3分钟,我从普通用户帐户运行脚本user_name
:
sudo ds 3
PS我的大部分脚本是输入验证,这不是必需的,因此以下内容也可以工作:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
是python脚本,这是否仍然有效?