添加到 visudo 的命令仍然在权限方面失败?

添加到 visudo 的命令仍然在权限方面失败?

我的 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

如果你确定

  1. 该错误是在脚本内引起的
  2. sudo 调用是正确的

那么问题很可能不是 sudo 。有几种情况不允许 root 删除文件:

  1. 该文件位于以只读方式安装的卷上(请参阅cat /proc/mounts)。
  2. 该文件受文件系统属性的保护(请参阅 参考资料lsattr "$path")。
  3. 父目录受文件系统属性保护。
  4. 花哨的干预内核的东西(SELinux,Apparmor)。

在脚本中添加几秒钟的等待时间并附加 strace 也可能会有所帮助(作为 root):strace -f -p $PID

相关内容