2009-02-19 12 views
33

그래서 서브 프로세스를 사용하여 파이썬 스크립트 내에서 수퍼 유저로 프로세스를 실행하려고합니다.파이썬 스크립트에서 슈퍼 유저로 명령을 실행 중

proc = subprocess.Popen('sudo apach2ctl restart', 
         shell=True, stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

같은 ipython 쉘 뭔가에서 잘 작동하지만 최대한 빨리 스크립트로 스틱으로 나는 받기 시작 : sudo: apach2ctl: command not found합니다.

이것은 sudo가 우분투에서 환경을 처리하는 방식 때문이라고 생각합니다. (나는 또한 아무 소용으로 sudo -E apche2ctl restartsudo env path=$PATH apache2ctl restart을 시도했습니다)

내가하는 일에 대해 이동하는 방법을 내가 필요할 때 슈퍼 사용자 암호를 입력하라는 메시지가 슈퍼 사용자로 apache2ctl restart를 실행하려는 경우 그래서 제 질문은, 기본적으로

, 이? 나는 스크립트에 암호를 저장할 의도가 없다.

편집 :

내가 모두 문자열로 명령을 전달 시도리스트로 토큰 화했습니다. 파이썬 인터프리터에서는 문자열을 사용하여 패스워드 프롬프트를 제대로 볼 수 있습니다 (원래의 문제처럼 파이썬 스크립트에서 여전히 작동하지 않습니다). 목록은 sudo에 대한 도움말 화면을 제공합니다.

편집 2 : 그래서

는 내가 수집는 popen 그냥 문자열로 몇 가지 명령을 작동하지만 쉘은 = 사실, 그것은 sudo를 얻을 '= 진정한 쉘'없이

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart']) 

를 취한다 때이다 일하다.

감사합니다. 그것은 목록을 기대

cmd = ['sudo', 'apache2ctl', 'restart'] 
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

:

+2

이 사용자가 암호를 요구하지 않고이 명령을 실행할 수 있도록 sudo를 구성하는 방법은 어떻습니까? –

+0

당신이하고있는 일에 따라 ['proc.wait()'] (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait)를 사용하는 것이 좋습니다. 'wait'는 자식 프로세스가 실행을 마칠 때까지 진행되지 않습니다. – craymichael

답변

14

apache2ctl에 대한 전체 경로를 제공하십시오.

+0

나는 당신이 그것에 부딪쳤다 고 생각합니다. 인터프리터에서 스크립트를 실행하면 실행중인 대화 형 셸에서 $ PATH를 상속받습니다. 그러나 스크립트로 실행하면 $ PATH가 비대화 형 쉘에서 상속되고 동일하지 않을 수 있습니다. popen()을 사용할 때는 항상 전체 경로를 지정하는 것이 가장 좋습니다. –

+0

예 - 스크립트에서 바이너리를 참조 할 때마다 $ PATH에 의존 할 수 없습니다. 그건 그렇고, "apch2ctl"철자가 잘못되었습니다. ;) – ojrac

3

당신은 다음과 같이는 popen을 사용해야합니다.

+7

http://docs.python.org/library/subprocess.html 읽기 shell = True 인 경우 문자열과 시퀀스 args 사이에 차이가 있습니다. – jfs

+0

아, 전에는 그렇게 사용하지 않았어. –

+1

목록을 전달할 때 shell = True를 설정하지 마십시오. –

21

봅니다 :이 메시지를 표시하고 암호를 읽을 수있게하는

subprocess.call(['sudo', 'apach2ctl', 'restart'])

서브 프로세스는 실제 표준 입력/출력/ERR에 액세스 할 필요가있다. 파이프로 설정 한 경우 사용자가 직접 파이프에 비밀번호를 입력해야합니다. 당신이 그들을 정의하지 않으면

은, 그것은

7

또 다른 방법은 사용자 암호가없는 sudo user을 만드는 것입니다 ... 등, sys.stdout 잡고.

유형 명령 행에 다음을

sudo visudo 

그런 다음 당신과 함께 <username>를 다음을 추가 및 교체 :

<username> ALL=(ALL) NOPASSWD: ALL 

이 사용자가 sudo 명령을 실행 할 수 있습니다을 요구하지 않고 암호 (해당 사용자가 실행 한 응용 프로그램 포함).이것은 보안 위험 일 수 있습니다.