编辑 sudoers 文件仍然要求输入密码
Editing sudoers file still asks for password
我正在尝试让 python 脚本访问 Odroid XU4 上的 GPIO 引脚,这需要 sudo。我只想让一个 GPIO 引脚从关闭变为开启,然后再次关闭。 python 脚本很好,但是当我 运行 它时它要求输入密码。
我已经使用 visudo
编辑了我的 sudoers 文件,以不需要密码来访问 GPIO。从以前的博客中,我发现 sudoers 指令的顺序很重要,并且已将其考虑在内。我当前的sudoers文件如下:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
username ALL=NOPASSWD: /sys/class/gpio/export
username ALL=NOPASSWD: /sys/class/gpio/gpio174/direction
username ALL=NOPASSWD: /sys/class/gpio/gpio174/value
为什么在尝试访问 GPIO pin 174 时仍然提示输入密码?正如其他帖子所建议的那样,我在 %admin
和 %sudo
行之后添加了 NOPASSWD 指令。
/sys/class/gpio/export(和其他)是伪文件,不是程序。 Sudo 致力于限制对程序而非文件的访问。
我建议查看 https://serverfault.com/questions/641483/how-to-grant-user-modify-only-specific-protected-file-by-sudo(或者更具体地说,应该有一种方法可以使用扩展权限授予用户对您关心的 3 个 sys 文件的访问权限,而这种方式不会'不需要 root。
或者,这可能更容易,你可以这样做
username ALL=NOPASSWD: /usr/bin/blinkscript
(其中 /usr/bin/blinkscript 是您的 python 程序,带有 #!/usr/bin/python 和权限设置,因此用户名不能覆盖文件等)
为清楚起见,具体演示:
给定一个包含以下内容的文件 blinkscript:
#!/usr/bin/python
print ("Hello World")
放在 /usr/bin 中,由 root 拥有,权限为 700
(就像在做 ls -l /usr/bin/blinkscript
时返回类似的东西:
-rwx------. 1 root root 40 Apr 8 19:52 /usr/bin/blinkscript
)
然后在你的 sudoers 文件的底部有一行:
user1 ALL=NOPASSWD: /usr/bin/blinkscript
如果我像 user1 一样:
blinkscript
我得到:"permission denied"
如果我像 user1 一样:
sudo blinkscript
我得到:"Hello World"(没有提示输入密码)
(请注意,我不必明确执行 /usr/bin/blinkscript,但这也有效)
如果我作为 user2(没有任何 sudo 权限)执行:
sudo blinkscript
我收到输入密码的提示,然后被列入坏男孩名单
(另请注意,我使用 700 的权限来清楚地显示权限;执行 755 之类的操作也可以,关键是如果您的脚本试图触及 /sys 文件,它会在 运行 有 sudo 而不是没有;我想说的是,如果您将权限设置为 777 或由 user1 拥有,则 user1 可以将文件编辑为 运行 他们想要的任何命令,从而违背了目的不只是首先做 user1 all=all nopasswd: all
)
我正在尝试让 python 脚本访问 Odroid XU4 上的 GPIO 引脚,这需要 sudo。我只想让一个 GPIO 引脚从关闭变为开启,然后再次关闭。 python 脚本很好,但是当我 运行 它时它要求输入密码。
我已经使用 visudo
编辑了我的 sudoers 文件,以不需要密码来访问 GPIO。从以前的博客中,我发现 sudoers 指令的顺序很重要,并且已将其考虑在内。我当前的sudoers文件如下:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
username ALL=NOPASSWD: /sys/class/gpio/export
username ALL=NOPASSWD: /sys/class/gpio/gpio174/direction
username ALL=NOPASSWD: /sys/class/gpio/gpio174/value
为什么在尝试访问 GPIO pin 174 时仍然提示输入密码?正如其他帖子所建议的那样,我在 %admin
和 %sudo
行之后添加了 NOPASSWD 指令。
/sys/class/gpio/export(和其他)是伪文件,不是程序。 Sudo 致力于限制对程序而非文件的访问。
我建议查看 https://serverfault.com/questions/641483/how-to-grant-user-modify-only-specific-protected-file-by-sudo(或者更具体地说,应该有一种方法可以使用扩展权限授予用户对您关心的 3 个 sys 文件的访问权限,而这种方式不会'不需要 root。
或者,这可能更容易,你可以这样做
username ALL=NOPASSWD: /usr/bin/blinkscript
(其中 /usr/bin/blinkscript 是您的 python 程序,带有 #!/usr/bin/python 和权限设置,因此用户名不能覆盖文件等)
为清楚起见,具体演示: 给定一个包含以下内容的文件 blinkscript:
#!/usr/bin/python
print ("Hello World")
放在 /usr/bin 中,由 root 拥有,权限为 700
(就像在做 ls -l /usr/bin/blinkscript
时返回类似的东西:
-rwx------. 1 root root 40 Apr 8 19:52 /usr/bin/blinkscript
)
然后在你的 sudoers 文件的底部有一行:
user1 ALL=NOPASSWD: /usr/bin/blinkscript
如果我像 user1 一样:
blinkscript
我得到:"permission denied"
如果我像 user1 一样:
sudo blinkscript
我得到:"Hello World"(没有提示输入密码)
(请注意,我不必明确执行 /usr/bin/blinkscript,但这也有效)
如果我作为 user2(没有任何 sudo 权限)执行:
sudo blinkscript
我收到输入密码的提示,然后被列入坏男孩名单
(另请注意,我使用 700 的权限来清楚地显示权限;执行 755 之类的操作也可以,关键是如果您的脚本试图触及 /sys 文件,它会在 运行 有 sudo 而不是没有;我想说的是,如果您将权限设置为 777 或由 user1 拥有,则 user1 可以将文件编辑为 运行 他们想要的任何命令,从而违背了目的不只是首先做 user1 all=all nopasswd: all
)