Python 스크립트를 사용하여 Linux System 명령을 슈퍼 사용자로 실행하십시오.

StackOverflow https://stackoverflow.com/questions/583216

문제

내 컴퓨터에 PostFix를 설치했으며 프로그래밍 방식으로 (Python을 사용하여) Fly에서 Virtual_alias를 업데이트하고 있습니다 (일부 조치에서). /etc/postfix/virtual_alias의 항목을 업데이트하면 명령을 실행 중입니다.

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
하지만 오류가 발생합니다.
sudo: sorry, you must have a tty to run sudo

언급 된 Sudo 명령을 인간이 아닌 방식으로 실행하고 싶습니다 (즉, 파이썬 스크립트 에서이 시스템 명령을 실행하고 있습니다.) 그렇다면이 명령이 프로그래밍 방식으로 실행되도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

Python 스크립트를 루트 자체로 실행할 수 있습니다. PostFix를 다시로드하기 위해 권한을 추가 할 필요가 없습니다.

또는 Sudo가 암호가 필요하지 않도록 구성 할 수 있습니다. /etc/init.d/postfix.

Sudo 구성 (Visudo를 통해)은 nopasswd를 허용합니다 : 암호없이 명령을 허용합니다. 보다 http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username>  ALL = NOPASSWD: /etc/init.d/postfix

또는 비슷한 것.

다른 팁

#include <unistd.h>
#include <stdlib.h>

// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix

int main( int argc, char **argv ) {
    setuid( geteuid() );
    system("/etc/init.d/postifx reload");
}

setuid-ed 프로그램으로 명령을 감싸십시오. 이렇게하면 모든 사용자가 PostFix를 다시 시작할 수 있습니다. 물론 특정 그룹에 대한 실행 권한을 추가로 제한 할 수 있습니다.

오류에 대답하려면 : "sudo : 죄송합니다. sudo를 실행하려면 tty가 있어야합니다."우리는 sudoers 파일에 "기본값 요구 사항"이라는 설정이 있습니다. 나는 그것을 언급하려고 시도했고 그것은 효과가있다 : d.

import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

물론 이것은 비밀번호가 일반 텍스트에 있기 때문에 거의 항상 좋은 생각이 아닙니다.

파이썬 에서이 작업을 수행하려면 다음을 수행해야합니다.

쉘 명령을 호출하는 줄 앞에이 명령을 씁니다.

os.setuid(os.geteuid())

그런 다음 "sudo"접두사없이 쉘 명령을 호출합니다.

보다 스택 클릭

사용자에게 실행할 수있는 부여가 필요합니다 Sudo 명령 비밀번호없이.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top