Python Portio 스크립트를 일반 사용자로 실행하세요. 루트 액세스가 필요하지 않습니다.

Python Portio 스크립트를 일반 사용자로 실행하세요. 루트 액세스가 필요하지 않습니다.

일반 사용자로 루트 스크립트를 실행하는 데 위험이 있다는 것을 알고 있지만 이 경우에는 선택의 여지가 없으며 내가 하는 일은 컴퓨터에 따라 다릅니다. GPIO 포트가 있는 소형 보드 컴퓨터가 있는데 출력 중 하나를 사용하여 종료 라인을 전환하여 장치를 재설정해야 합니다. 부품이 제대로 작동하고 장치가 예상대로 재설정됩니다.

내 문제는 장치를 재설정하기 위해 Python 스크립트를 작성했는데 작동하지만 루트 또는 "Sudo 프로그램 이름, 비밀번호 입력"으로 실행해야 한다는 것입니다. 하지만 루트 권한 없이 일반 사용자로 작업하려면 필요합니다. 즉, 일반 사용자를 추가했는데 무슨 짓을 해도 스크립트를 실행할 수 없었습니다.

sudoer 파일에 사용자를 추가하려고 시도했지만 작동하지 않았고 완전히 무시되었습니다. 권한을 변경하고 SUID 비트와 내가 생각할 수 있는 모든 것을 설정했지만 여전히 루트 비밀번호를 묻습니다. 작동하는 유일한 방법은 "사용자 및 그룹"을 열고 사용자를 Sudo 그룹에 추가하는 것입니다. 그러나 사용자는 내 기본 관리자 사용자와 같기 때문에 갖고 싶지 않은 프로그램에 액세스할 수 있습니다. 그것은 내가 원하는 것이 아닙니다. 이 사용자가 액세스할 수 있는 것(예: 단일 스크립트 또는 프로그램)을 어떻게든 제한하고 싶습니다.

다른 사람들이 드라이버를 작성해야 한다고 제안한 적이 있지만 그 방법이나 그 의미가 정확히 무엇인지 잘 모르고 일반적으로 그들은 자세히 설명하고 싶어하지 않습니다. 나는 Linux를 사용해 본 적이 있지만 이 분야의 전문가라고 생각하지 않습니다. 이 작업을 수행하는 방법을 아는 사람이 있나요?

답변1

해결책을 찾았습니다여기.

당신이 원하는 것은 필요한 포트에 대한 액세스만 허용하는 신뢰할 수 있는 I/O 인에이블러를 C로 작성한 다음 다음을 사용하는 것입니다.execvp()호출자의 주소 공간에서 스크립트를 실행합니다. 그런 다음 uid root를 컴파일된 I/O 활성화자로 설정할 수 있습니다.

다음은 위의 소스 코드를 적용한 몇 가지 예제 코드입니다(쓰기에 문제가 없는 주소 블록을 사용해야 합니다).

#include <stdio.h>
#include <stdlib.h>
#include <sys/io.h>

#define DESIRED_PORT    0x300
#define NUM_BYTES       8

int main(int argc, char*argv[])
{
    if (argc < 2) {
        printf("Error: no target program specified.\n");
        exit(1);
    }

    if (ioperm(DESIRED_PORT, NUM_BYTES, 1)) {
        printf("Error: couldn't set port permissions.\n");
        exit(1);
    }

    // Set uid to current user's id before executing the script
    setgid(getgid());
    setuid(getuid());

    if (execvp(argv[1], &argv[1]) < 0) {
        printf("Error: target program execution error.\n");
        exit(1);
    }
}

이름을 io_enable.c로 지정한 다음 uid 루트를 컴파일하고 설정합니다.

$ gcc io_enable.c -o io_enable
$ sudo chown root io_enable
$ sudo chmod u+s io_enable

다음으로, 다음 Python 스크립트를 사용하여 테스트할 수 있습니다.

#!/usr/bin/python
import portio

ADDR = 0x300

fd = open('/tmp/portio.log', 'w')

for i in range(10):
    portio.outb(i, ADDR)
    fd.write('Wrote %d, read %d.\n' % (i, portio.inb(ADDR)))

fd.close()

이름을 io_test.py로 지정하고 다음과 같이 실행했습니다.

$ ./io_enable python io_test.py

작동하는 것 같습니다.

$ cat /tmp/portio.log
Wrote 0, read 0.
Wrote 1, read 1.
Wrote 2, read 2.
Wrote 3, read 3.
Wrote 4, read 4.
Wrote 5, read 5.
Wrote 6, read 6.
Wrote 7, read 7.
Wrote 8, read 8.
Wrote 9, read 9.

답변2

sudoers파일 에 다음 행을 추가합니다 (프로그램을 사용하고 visudo파일을 직접 편집하지 마십시오 sudoers). 여기서 bob스크립트를 실행하도록 허용해야 하는 사용자 이름은 다음과 같습니다.

bob ALL = (root) NOPASSWD: /path/to/my/script

여러 사용자가 이 작업을 수행하도록 하려면 그룹에 넣고 라인을 resetters만드세요.sudoers

%resetters ALL = (root) NOPASSWD: /path/to/my/script

다른 규정이 있다면 bob참고해주세요sudoers파일의 마지막 일치 횟수. 그러므로 규칙이 있는 규칙을 NOPASSWD:규칙이 없는 규칙 아래에 배치하세요.

관련 정보