2013-05-26 2 views
0

나는 내 postgres 데이터베이스에서 데이터 덤프를 가져와야합니다.Bash 스크립트 : 쉘 스크립트에서 postgres 홈으로 로그인

어떻게하면 postgres 홈에 로그인합니까? . 나는 다음과 같은 스크립트를 가지고 있지만 그것은 작동하지 않습니다

#!/bin/sh$                  
export PASSWORD= something              
echo $PASSWORD | sudo -S su postgres                             
pg_dump somedb > dump.txt+`date +%Y-%m-%d`   

그러나 나는 오류가 발생하지 않습니다 내가 동시에 스크립트에 [email protected]:$에 기록되지 않는이 스크립트를 실행할 때. 내가 여기서 잘못하고있는 것이 있습니까?

+0

암호 뒤에 개행 문자가 오는가요? – demure

+0

암호 뒤에'='뒤에 공백이 있습니까? – Kevin

답변

2

스크립트가 실패하는 이유는이 라인

입니다
echo $PASSWORD | sudo -S su postgres 

su이 종속 쉘을 분기하도록합니다. 이 쉘은 암호를 읽는 데 이미 sudo -S에 의해 고갈 된 표준 입력을 읽으려고 시도합니다. 쉘이 더 이상의 입력 (EOF)을 찾지 못하면 종료합니다. 그런 다음 스크립트의 다음 행은 인용 된 행이 발생하지 않은 것처럼 실행되므로 UID로 실행됩니다.

더 나은 방법으로 원하는 것을 수행하려면 j.hloetzek's answer을 참조하십시오.

또한 붙여 넣은 스크립트에는 구문 오류가 두 개 있지만 어쨌든이 방법을 사용하면 안됩니다.

0

당신은 sudo 명령에 암호가 있지만, /etc/sudoers 특정 명령에 허용 할 수없는 파이프 (정확한 구문을 확인!) 암호없이 실행 할 수 있습니다

username YOURUSERNAME = NOPASSWD: /sbin/su postgres 
+0

"-S (stdin) 옵션을 사용하면 sudo는 터미널 장치 대신 표준 입력 장치에서 암호를 읽을 수 있습니다. 암호 뒤에 줄 바꿈 문자가 와야합니다." 그러나 그것은 실제 결함이 아닙니다. 그러나'sudoers'를 수정하는 것이 스크립트에 패스워드를 넣는 것보다 훨씬 낫습니다. – msw

+0

@msw : ok, 감사합니다.'-S'을 몰랐습니다! –

+0

어느 쪽도 아니기 때문에 나는 그것을 찾았다. 그것은 아마도 나쁜 생각입니다. (저는 유스 케이스가 안전하지 않다는 것을 생각할 수 없습니다) 당신과 나는 둘 다 나가지 않았다고 생각하는 이유입니다. – msw

관련 문제