我的 sudo 文件现在有两个命令,无需以 root 身份登录即可运行。
它看起来像这样:
user ALL=(root) NOPASSWD: /home/user/prog1.py
user ALL=(root) NOPASSWD: /home/user/prog2.py
该prog1.py
文件无需密码即可正常运行。文件prog2.py
因权限被拒绝而失败?
第一个程序仅访问受根保护的文件以进行读取。第二个程序是创建符号链接并删除受根保护的文件:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from random import choice
from subprocess import Popen
def back_drop_change():
link = "/usr/share/slim/themes/default/background.jpg"
os.remove(link) # this is the line that returns permission denied
image_selection = list()
for di, _, fi in os.walk("/home/user/pictures/apod"):
for f in fi:
image_selection.append(di + "/" + f)
bck_img = choice(image_selection)
Popen(["ln", "-s", bck_img, link])
if __name__ == "__main__":
back_drop_change()
我尝试添加/usr/bin/rm /usr/share/slim/themes/default/background.jpg
到 visudo 文件,但仍然失败?
编辑:
一些额外的信息——
sudo -l
返回:
Matching Defaults entries for user on this host:
env_reset, editor="/usr/bin/vim -p -X", !env_editor
User user may run the following commands on this host:
(ALL) ALL
(root) NOPASSWD: /home/user/Pidtrk/main.py
(root) NOPASSWD: /home/user/backdrop.py
再说一次,我能够python2 Pidtrk/main.py
毫无错误地运行,但不能
python2 backdrop.py
。
这两个文件都属于同一个人User
,并且具有相同的Permissions
.
编辑2:
我同时拥有 ofprog1.py
和onprog2.py
运行。crontab
@reboot
如果我有这一行crontab
:
`python2 /home/user/prog1.py >> err.log 2>&1`
没有:
user ALL=(root) NOPASSWD: /home/user/prog1.py
在我的 sudoers 文件中,err.log 显示it failed with permissions denied
。
现在,当我将此行添加到 sudoers 时:
user ALL=(root) NOPASSWD: /home/user/prog1.py
重新启动后运行prog1.py
良好,为什么文件有什么不同prog2.py
?
答案1
正如澄清评论中所示,您正在尝试运行python2 /home/user/backdrop.py
.但是您已授予自己运行不同命令的权限 - 即。/home/user/backdrop.py
没有python2
--你不被允许这样做。sudo
对它所允许的事情非常挑剔;要么完全运行您有权限的命令,要么进行更改sudoers
以允许您实际想要运行的命令。
答案2
如果你确定
- 该错误是在脚本内引起的
- sudo 调用是正确的
那么问题很可能不是 sudo 。有几种情况不允许 root 删除文件:
- 该文件位于以只读方式安装的卷上(请参阅
cat /proc/mounts
)。 - 该文件受文件系统属性的保护(请参阅 参考资料
lsattr "$path"
)。 - 父目录受文件系统属性保护。
- 花哨的干预内核的东西(SELinux,Apparmor)。
在脚本中添加几秒钟的等待时间并附加 strace 也可能会有所帮助(作为 root):strace -f -p $PID