visudo에 추가된 명령이 여전히 권한 때문에 실패합니까?

visudo에 추가된 명령이 여전히 권한 때문에 실패합니까?

이제 내 sudo 파일에는 루트로 로그인하지 않고도 실행할 수 있는 두 개의 명령이 있습니다.

다음과 같습니다.

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.jpgvisudo 파일에 추가하려고 시도했지만 여전히 실패했습니다.

편집하다:

몇 가지 추가 정보 - 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:

나는 둘 다 가지고 있고 실행 prog1.py중입니다 prog2.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가 아닐 가능성이 높습니다. 루트가 파일을 삭제할 수 없는 몇 가지 상황이 있습니다:

  1. 이 파일은 읽기 전용으로 마운트된 볼륨에 있습니다( 참조 cat /proc/mounts).
  2. 파일은 파일 시스템 속성으로 보호됩니다(참고자료 참조 lsattr "$path").
  3. 상위 디렉토리는 파일 시스템 속성으로 보호됩니다.
  4. 멋진 커널 개입 작업(SELinux, Apparmor).

스크립트에 몇 초의 대기 시간을 추가하고 strace를 추가하는 것도 도움이 될 수 있습니다(루트로서):strace -f -p $PID

관련 정보