2014-10-01 3 views
1

서브 프로세스를 사용하여 암호를 보내고 막 다른 길에 머물러 있는데, 무엇이 잘못 됐는지 알지 못합니다. 나는 어떤 조언도 감사 할 것이다.파이썬 : 서브 프로세스를 사용하여 포스트그레스 비밀번호를 보내십시오.

내 코드 :

os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ") 
os.system("sudo -u postgres -h " + db_host + " createuser " + db_user); 
print bcolors.WARNING, "Please enter your password for : " + db_user, bcolors.ENDC 
str = "sudo -u postgres -h " + db_host + " psql postgres -c \"\password " + db_user + "\"" 
# os.system(str) 
p = subprocess.Popen(['sudo','-u', 'postgres', '-h', db_host, 'psql', 'postgres', "-c", "\password", db_user],stdin=subprocess.PIPE, shell=False) 
p.communicate(raw_input("Please give me a password!") 

os.system(str) 모든 것이 괜찮 사용하지만 사용자로부터 입력 한 비밀번호를 잡으려면 미래에 내가 구성 파일에 암호를 저장합니다. 그게 가능하니?

답변

2

현재 진행중인 작업을 중단하고 psycopg2을 사용하십시오. 부디. 당신은 거의 psql에 껍질을 벗을 필요가 없습니다. PostgreSQL 용 psycopg2 네이티브 클라이언트 드라이버로 연결하면됩니다.

수퍼 유저로 연결해야하는 경우 pg_hba.conf을 수정하여 사용자의 md5 비밀번호 인증을 허용하고 postgres 사용자의 비밀번호를 설정하십시오.

os.system("sudo -u postgres -h " + db_host + " psql postgres -c \"\password\" ")

이 이해가되지 않습니다


. -h 명령을 실행하려고합니다. 먼저 psql을 호출해야합니다.


sudo은 stdin에서 암호를 읽지 않으려 고합니다. stdin을 닫고 현재 tty를 보안 조치로 직접 다시 열어 암호를 트랩하는 명령으로 sudo을 랩핑하는 것을 막을 수 있습니다.

그래서 당신이하려는 것을 무 찌르도록 설계되었습니다.

할 수 있습니다 :

  • 설정 psql에 대한 sudo에서 NOPASSWD 모드;
  • sudo -ASUDO_ASKPASS 환경 변수의 askpass 도우미 프로그램과 함께 사용하십시오. 자신에게 pipe()을 작성하여 프로그램에서 상속받은 파일 설명 자의 암호를 읽는 SUDO_ASKPASS을 작성할 수 있습니다.
  • 암호 프롬프트를 사용하지 않으려면 sudo -n을 사용하십시오. 암호가 필요한 경우 sudo이 실패합니다.
  • ... 또는 모든의 가장, psql을 실행하는 데 sudo를 사용하지 않는, 단지 사용 psycopg2
관련 문제