PostgreSQL : 비밀번호로 psql 실행 스크립팅


274

암호를 묻지 않도록 psql을 어떻게 호출 할 수 있습니까?

이것이 내가 가진 것입니다 :

psql -Umyuser < myscript.sql

그러나 암호를 전달하는 인수를 찾을 수 없으므로 psql은 항상 암호를 묻습니다.


4
나는 PGPASSWORD 환경 변수로 갔다. 이것은 내 유스 케이스에 완벽하게 맞았습니다. 스크립트에 단순하고 독립적입니다.
Axel Fontaine


답변:


315

PostgreSQL을 인증하는 방법에는 여러 가지가 있습니다. https://www.postgresql.org/docs/current/static/client-authentication.html 에서 비밀번호 인증에 대한 대안을 조사 할 수 있습니다 .

귀하의 질문에 대답하기 위해, 비밀번호 기반 인증을위한 비밀번호를 제공하는 몇 가지 방법이 있습니다. 확실한 방법은 비밀번호 프롬프트를 사용하는 것입니다. 그 대신 pgpass 파일 또는 PGPASSWORD환경 변수를 통해 비밀번호를 제공 할 수 있습니다 . 이것들을보십시오 :

암호는 명령 줄 인수로 제공 할 수있는 옵션이 없습니다. 그 정보는 모든 사용자가 사용할 수 있으므로 안전하지 않기 때문입니다. 그러나 Linux / Unix 환경에서는 다음과 같은 단일 명령에 환경 변수를 제공 할 수 있습니다.

PGPASSWORD=yourpass psql ...

11
PGPASSWORD는 더 이상 사용되지 않지만 여전히 작동합니다. Just FYI
Scott Marlowe

35
그렇습니다, 더 이상 사용되지 않습니다 (그리고 링크 중 하나에 언급되어 있습니다). 더 이상 사용되지 않기 때문에 많은 사람들에게 매우 유용하지만 심각한 보안 문제없이 일부 상황에서 사용할 수 있기 때문에 더 이상 사용되지 않습니다. 예를 들어 NFS 파일 시스템에 .pgpass를 저장하는 것보다 나쁘지 않은 것 같습니다. 나는 PGPASSWORD를 일상적으로 사용합니다.
Reece

1
명령 줄 정보가 "모든 사용자에게 제공된다"는 아이디어는 다중 사용자 시스템에 대한 가정을 기반으로하며 시스템이 단일 응용 프로그램을 실행하고 모두 자동화 된 대부분의 최신 환경에는 적용되지 않습니다.
Alex R

159
PGPASSWORD=[your password] psql -Umyuser < myscript.sql

1
이것은 테라 포름에서도 작동합니다. 당신, 내 친구는 생명의 은인입니다
wildthing81

67

스크립트 시작시이 명령 줄을 추가 할 수 있습니다.

set PGPASSWORD=[your password]

24
내 경우에는 set 명령이 작동 export PGPASSWORD=[password]하지 않았지만 작동했습니다.
Can Kavaklıoğlu

쉘 스크립트에서는 작동하지 않습니다. 나는 그것을 사용하고 #!/bin/sh set PGPASSWORD = postgres psql -h 192.168.3.200 -U postgres incx_um << EOF DELETE FROM usrmgt.user_one_time_codes WHERE time < NOW() - INTERVAL '30 minute' EOF
빈드 굽타에게

2
예를 들어 공백을 사용하지 마십시오. PGPASSWORD=password.
Ariejan

48

여러 개의 호스트 / 데이터베이스 연결을 사용하려는 경우 ~ / .pgpass 파일 을 사용하십시오.

단계 :

  1. 사용 vim ~/.pgpass하거나 유사한 파일을 작성하십시오 . 다음 형식으로 정보를 입력하십시오 hostname:port:database:username:password. 필드 값 주위에 문자열 따옴표를 추가하지 마십시오. *를 포트 / 데이터베이스 필드의 와일드 카드로 사용할 수도 있습니다.
  2. chmod 0600 ~/.pgpasspsql에 의해 자동으로 무시되지 않도록 해야합니다 .
  3. psql 명령을 실행하는 bash 프로파일에 별명을 작성하십시오. 예를 들어 alias postygresy='psql --host hostname database_name -U username', 값은 ~ / .pgpass 파일에 입력 한 값과 일치해야합니다.
  4. bash 프로파일을 소싱 . ~/.bashrc하거나 유사하게 제공하십시오.
  5. 명령 행에서 별명을 입력하십시오.

내보내기 PGPASSWORD = ''변수가 설정되어 있으면 파일보다 우선합니다.


1
chmod 600파일에 대한 작업을 수행해야 합니다. 그렇지 않으면 psql문서에 따라 자동으로 파일을 무시합니다.
RichVel 2019

33

이것은 오래된 질문 일 수도 있지만 아무도 언급하지 않은 다른 방법을 사용할 수 있습니다. 연결 URI에서 직접 비밀번호를 지정할 수 있습니다. 문서는 여기 또는 대안 적으로 여기 에서 찾을 수 있습니다 .

다음에 제공된 연결 URI에서 직접 사용자 이름과 비밀번호를 제공 할 수 있습니다 psql.

# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb

2
Postrgres 9.3은 환경 변수를 무시합니다PGPASSWORD
david.perez

14

나와 같은 창에 문제가 있고 (Windows 7 64 비트를 사용하고 있음) set PGPASSWORD=[Password]작동하지 않습니다.

그런 다음 Kavaklioglu가 의견 중 하나에서 말했다시피,

export PGPASSWORD=[password]

파일 상단에 또는 사용하기 전에 파일을 저장하기 전에 파일을 저장해야합니다.

확실히 창문에서 작동합니다 :)


1
export PGPASSWORD=[password]명령 줄 (cmd.exe)을 전혀 사용하지 않습니다. cygwin 또는 이와 유사한 것을 사용하지 않았습니까?
Devin Snyder

cl에서만 작동하며 파일에 추가 했습니까? 이제 방금 명령에 입력 했습니까?
Jamie Hutber

리눅스 / Mac 환경에서 사용하는 것이 좋습니다 .Windows의 경우이 환경 변수를 내보내는 방법을 찾아야한다고 생각합니다.
Pengfei.X

글로벌 암호를 추가하십시오. 흥미로운 아이디어이기도합니다
Jamie Hutber


7

PGPASSWORD 환경 변수 사용에 대한 보안 문제를 고려할 때 가장 좋은 전체 솔루션은 다음과 같습니다.

  1. 사용하려는 비밀번호로 자신의 임시 pgpass 파일을 작성하십시오.
  2. PGPASSFILE 환경 변수를 사용하여 psql에게 해당 파일을 사용하도록 지시하십시오.
  3. 임시 pgpass 파일 제거

여기 몇 가지주의 할 점이 있습니다. 1 단계는 존재하는 사용자의 ~ / .pgpass 파일로 뭉크 지 않도록합니다. 또한 파일에 권한이 0600 이하인지 확인해야합니다.

일부는 bash를 활용하여 다음과 같이 바로 가기를 제안했습니다.

PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb

이것은 실제 파일에 데이터를 쓸 필요가 없도록 <() 구문을 사용합니다. 그러나 psql은 사용중인 파일을 확인하고 다음과 같은 오류를 발생시키기 때문에 작동하지 않습니다.

WARNING: password file "/dev/fd/63" is not a plain file

이 접근법의 실제 예는 stackoverflow.com/a/40614592/3696363에 나와 있습니다.이 질문에 대한 또 다른 대답입니다.
Eliyahu Skoczylas

이 사용자는 내가 찾고있는 것과 똑같은 것을 요구하지는 않지만 접근 방식이 일치하지 않는다고 말할 것입니다. PGPASSFILE = <(whatever) 구문을 사용하는 경우 파일의 암호 해독과 같은 작업을 수행하여 작성된 파일 디스크립터에만 표시 할 수 있습니다. 임시 파일을 작성하면 자격 증명이있는 디스크에 파일이있는 문제를 근본적으로 해결할 수 없습니다. 이와 같은 임의의 산업 규칙을 다루는 것은 재미 있지 않지만 많은 사람들이 다루는 일입니다.
Desidero

7

PGPASSWORD를 사용하여 간단하게 수행 할 수 있습니다. psql 9.5.10을 사용하고 있습니다. 귀하의 경우 해결책은

PGPASSWORD=password psql -U myuser < myscript.sql


5

바탕 mightybyte의 대답 에 익숙하지 않은 사람들을 위해 * 괜찬아 쉘 스크립트, 여기에 작업 스크립트는 다음과 같습니다

#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE

2 행 의 이중 달러 부호 ( $$) /tmp/pgpasswd$$는 프로세스 ID 번호를 파일 이름에 추가하여 부작용없이 동시에이 스크립트를 두 번 이상 실행할 수 있습니다.

chmod4 행 에서 명령 사용에 유의하십시오. 마이티 바이트에 설명 된 " 일반 파일아님 "오류와 마찬가지로이 작업을 수행하지 않으면 " 권한 "오류 도 있습니다 .

7 행 에서 기본값 ( localhost : 5432 )을 사용하고 데이터베이스 사용자가 한 명인 경우 -hmyserver , -pmyport 또는 -Ujdoe 플래그 를 사용할 필요가 없습니다 . 여러 사용자의 경우 (그러나 기본 연결) 해당 줄을 다음으로 변경하십시오.

psql mydb jdoe

스크립트를 실행 파일실행 하는 것을 잊지 마십시오

chmod +x runpsql( 또는 스크립트 파일이라고 부르는 것 )

최신 정보:

나는했다 RichVel 의 조언을 읽을 파일 제작 전에 그것으로 암호를 가하고있다. 약간의 보안 구멍이 닫힙니다. 감사!


4
mktemp고유 한 명명 체계를 사용하는 대신 임시 파일을 만드는 데 사용할 수 있습니다 . /tmp/tmp.ITXUNYgiNhLinux 및 /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4MacOS X 와 같은 이름의 새 임시 파일을 생성하고 stdout에 이름을 인쇄합니다.
Ivan Kolmychek

1
보안 문제chmod 600 파일을 만든 후 암호를 작성하기 전에 파일을 작성하는 것이 가장 좋습니다 . 작성된대로 서버의 악성 스크립트는이 형식의 파일을 지속적으로 읽으려고 시도 할 수 있으며 때로는 암호를 얻는 데 성공할 수도 있습니다. 또한이 스크립트가 어떤 이유로 중단되면 파일이 디스크에 남게됩니다. 셸 trap핸들러를 작성하면 이 문제를 해결할 수 있습니다. 이와 같은 보안 스크립트를 작성하는 것이 쉽지는 않다는 점을 고려하여 export PGPASSWORD대신 사용 하는 것이 좋습니다 .
RichVel 2019

작은 보안 취약점을 지적한 @RichVel에게 감사합니다. 비밀번호를 입력하기 전에 파일 작성 및 비공개를 터치 하면 확실히 개선됩니다. 이 유형의 솔루션은 PGPASSWORD9.3에서 더 이상 사용되지 않으므로 필요합니다 .
Eliyahu Skoczylas

일부 문서 는 더 이상 사용되지
않는다고 말하지만

5

PGPASSWORD환경 변수 를 사용하는 대안 conninfo설명서 에 따라 문자열 을 사용 하는 것입니다

연결 매개 변수를 지정하는 대체 방법은 데이터베이스 이름 대신 사용되는 conninfo 문자열 또는 URI에 있습니다. 이 메커니즘은 연결을 매우 광범위하게 제어합니다.

$ psql "host=<server> port=5432 dbname=<db> user=<user> password=<password>"

postgres=>



-1

psql show password prompt는 PGPASSWORD 변수를 정의하더라도 psql에 -w 옵션을 지정하여 암호 프롬프트를 생략 할 수 있다는 것을 알았습니다.


-6

psql -h localhost -p 5432 -U user -w 명령에서 -w를 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.