2013-07-27 1 views
0

내 목표는 내 리포지토리 및 패키지를 설치하는 python 스크립트로 새 AWS 인스턴스를 구성한 다음 하위 프로세스를 사용하여 (이 경우) 포스트그레스를 구성하는 것입니다. 값은 yaml 또는 json 파일에서 읽습니다. 지금까지 모든 패키지를 설치하고 환경에 대해 repos를 성공적으로 수행했습니다. 내가 붙어있는 곳은 postgres에서 사용자를 생성하고 데이터베이스를 만드는 python 스크립트이다.다중 표준 입력과 함께 subprocess.popen을 사용하여 시스템 구성 : Python 2.7

import subprocess 
# out is to show output, com is the stdin value(s) to pass 
def run(command, out=False, com=False,): 

    process = subprocess.Popen(
    command, 
    close_fds=True, 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT 
) 

    if out: 
    out = iter(process.stdout.readline, b'') 
    for line in out: 
     print(line) 

    if com: 
    process.stdin.write(com) 
    # http://stackoverflow.com/questions/16091112/python-pipe-to-popen-stdin 
    # process.communicate(com) doesn't fit, i need multiple stdin 

run(['ls', '-l'], True) # works 
run(['sudo', 'su', '-', 'postgres']) # works 

run(['createuser'], False, 'testuser') 
# broken, also after i get this working, this should be a list of stdin values  
# this results in infinite lines: 
# Shall the new role be a superuser? (y/n) 
# I do have a workaround, run(['createuser', '-d', '-r', '-s', '-w', 'username'], False) 
# Confirmed workaround created user successfully 

답변

0

나는 나이에 포스트 그레스를 사용하지 않은,하지만 난 당신이 포스트 그레스에 스와 원하는 추측하고있어, 다음 포스트 그레스 '권한이 필요한 명령을 실행합니다.

하지만 실행 ([ 'sudo', 'su', '-', 'postgres'])은 쉘을 열어 기다릴 것입니다. run ([ 'createuser'], False, 'testuser')는 결코 실행되지 않을 것입니다.

대신이 두 명령을 결합해야합니다. su를 사용하려면 "-c"옵션을 참조하십시오.

그리고 조금 더 안전하게 소스 사용자에게 sudo의 권한을 부여하여 방정식을 근절하고 코드를 좀 더 단순하게 만들 수 있습니다.

+0

도착했습니다. 다음의 무한한 출력을보십시오 : 새로운 역할을 수퍼 유저로할까요? (y/n) –

+0

이 문제를 해결하는 가장 좋은 방법은 여러 개의 표준 입력을 필요로하는 하위 프로세스가있는 명령을 실행하지 않는 것입니다. 나는 파이썬 3에서이 작업이 가능하다고 느낍니다. –

+0

다음에서 성취했습니다 : https://github.com/muhuk/cuisine-postgresql/blob/master/cuisine_postgresql.py –