비 대화식으로 'psql'에 암호를 지정하려면 어떻게합니까?


337

쉘 스크립트를 사용하여 데이터베이스 생성 프로세스를 자동화하려고하는데 비밀번호를 psql에 전달하여로드 블록을 쳤습니다 . 쉘 스크립트의 코드는 다음과 같습니다.

psql -U $DB_USER -h localhost -c"$DB_RECREATE_SQL"

psql비 대화식 방식으로 비밀번호를 전달하려면 어떻게합니까 ?


1
연결 URL을 사용할 수 있습니다. 이 답변은 stackoverflow.com/questions/3582552/postgres-connection-url 에서 확인하십시오 .
paulodiovani

답변:


141

로부터 공식 문서 :

암호를 정기적으로 입력하지 않으려면 ~ / .pgpass 파일을 사용하는 것이 편리합니다. 자세한 정보는 섹션 30.13 을 참조하십시오.

...

이 파일에는 다음 형식의 줄이 포함되어야합니다.

hostname:port:database:username:password

현재 연결 매개 변수와 일치하는 첫 번째 행의 비밀번호 필드가 사용됩니다.


29
고맙습니다, pgpass에 대해 알고 있지만 문제를 해결하지 못합니다. 데이터베이스를 조작하기 위해 자체 포함 된 bash 스크립트가 필요하므로 명령 줄을 통해 psql에 정보를 전달하는 것에 대한 질문입니다.
Alex N.

6
유일한 옵션은 bash 스크립트가 액세스 할 수있는 .pgpass 파일을 설정하는 것입니다. 또는 비밀번호를 전혀 사용하지 마십시오. ident 또는 SSL 인증서 사용과 같은 다른 형태의 인증을 설정할 수 있습니다.
Flimzy 2016 년

그것이 내가 두려워했던 것입니다 :) 정보 주셔서 감사합니다!
Alex N.

또 다른 옵션은 expect를 사용하는 것입니다. 하지만 난 정말 기대 싫어 :)
Flimzy

1
.pgpass 파일을 읽고 쓰고 실행하기위한 그룹 및 기타 사용자 권한을 제거하는 것을 잊지 마십시오! 실행chmod go-rwx .pgpass
Vladislavs Dovgalecs

611

psql을 호출하기 전에 스크립트 내에서 PGPASSWORD 환경 변수를 설정하십시오.

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

자세한 내용은 http://www.postgresql.org/docs/current/static/libpq-envars.html을 참조하십시오 .


편집하다

Postgres 9.2부터는 사용자 이름 비밀번호를 포함 할 수 있는 연결 문자열 또는 URI 를 지정하는 옵션도 있습니다.

ps다른 사용자가 (Linux), ProcessExplorer (Windows) 또는 유사한 도구를 사용하여 실행중인 프로세스의 명령 행을 볼 때 비밀번호가 일반 텍스트로 표시되므로 보안 위험이 있습니다 .

데이터베이스 관리자에 대한이 질문도 참조하십시오.


32
예를 들어 한 줄로 다음과 같은 작업을 수행 할 수 있습니다. PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
이것이 단순히 SQL 스크립트를 실행하는 가장 편리한 방법이라고 생각합니다.
zr870

2
추가 할 수 있습니다- space첫 번째 문자 앞에 명령 줄에 추가 하면 명령이 bash 기록에 저장되지 않습니다. 우분투 / bash에서 작동합니다.
baldr

5
보너스 : Docker에서 작동 :docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil

3
조심하고 항상 선행 공간을 추가해야합니다 그렇지 않으면 bash history ~ / .bash_history 파일에 표시됩니다 ...
rogerdpack

102
  • 한 줄로 :

    export PGPASSWORD='password'; psql -h 'server name' -U 'user name' -d 'base name' -c 'command'

    명령 은 SQL 명령 등"select * from schema.table"

  • 또는 더 읽기 쉬운 :

    export PGPASSWORD='password'
    psql -h 'server name' -U 'user name' -d 'base name' \
         -c 'command' (eg. "select * from schema.table")

18
한 줄은 다음과 같이 약간 단순화 할 수 있습니다 PGPASSWORD='password' psql .... . 명령이 완료된 후 변수에 액세스 할 수 없다는 이점도 있습니다.
Garrett

3
export PGPASSWORD=YourNewPassword다른 변형을 통해 나를 위해 일했습니다.
Mikeumus

7
export PGPASSWORD정말 나쁜 생각처럼 소리
하센

1
이렇게하면 bash history ~ / .bash_history 파일에 비밀번호가 저장되고 (앞에 항상 공백을 추가하지 않는 한) 현재 환경으로 비밀번호를 내 보냅니다. FWIW : |
rogerdpack

68

psql에 URL을 전달하는 것을 선호합니다 .

psql "postgresql://$DB_USER:$DB_PWD@$DB_SERVER/$DB_NAME"

이를 통해 원하는대로 환경 변수의 이름을 자유롭게 지정할 수 있으며 불필요한 파일을 만들지 않아도됩니다.

이 필요합니다 libpq. 설명서는 여기 에서 찾을 수 있습니다 .


pg_restore와 같은 것을 사용할 수 있습니까? 감사!
the_ccalderon 19

1
@ ccalderon911217 분명히 당신은 할 수 있습니다 : stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudin yep 자신을 테스트했습니다! 감사합니다!
the_ccalderon

26

Windows에서 :

  1. PGPASSWORD에 값을 지정하십시오. C:\>set PGPASSWORD=pass

  2. 명령을 실행하십시오. C:\>psql -d database -U user

준비된

아니면 한 줄로

set PGPASSWORD=pass&& psql -d database -U user

&&! 전에 공간 부족에주의하십시오.


1
나는 그것을 시도했지만 작동하지 않았다. 여전히 비밀번호를 요청하고 있습니다.
antipattern

1
@antipattern 옵션 -w도 전달해야합니다 .
mljrg

1
PGPASSWORD=xxxx psql -U username -d database -w -c "select * from foo;"공장.
Steve Shipway

21

.pgpass(Linux) 사용자의 홈 디렉토리에 파일 을 작성하여 수행 할 수 있습니다 . .pgpass 파일 형식:

<databaseip>:<port>:<databasename>:<dbusername>:<password>

*세부 정보 대신 와일드 카드 를 사용할 수도 있습니다 .

tmp.sql암호를 묻지 않고 실행하고 싶다고 가정 해보십시오 .

다음 코드를 사용하면 * .sh 파일에서 할 수 있습니다

echo "192.168.1.1:*:*:postgres:postgrespwd" > $HOME/.pgpass
echo "` chmod 0600 $HOME/.pgpass `"

echo " ` psql -h 192.168.1.1 -p 5432  -U postgres  postgres  -f tmp.sql `        

11
echo "`chmod 0600 $ HOME / .pgpass`"의 요점은 무엇입니까? chmod 0600 $ HOME / .pgpass는 어떻습니까?
Vlad Patryshev

12

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

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

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

postgres=>

4

pg_env.sh의 내용을 내 .bashrc에 추가했습니다.

cat /opt/PostgreSQL/10/pg_env.sh

#!/bin/sh
# The script sets environment variables helpful for PostgreSQL

export PATH=/opt/PostgreSQL/10/bin:$PATH
export PGDATA=/opt/PostgreSQL/10/data
export PGDATABASE=postgres
export PGUSER=postgres
export PGPORT=5433
export PGLOCALEDIR=/opt/PostgreSQL/10/share/locale
export MANPATH=$MANPATH:/opt/PostgreSQL/10/share/man

추가 (사용자 당 4653174 제안)

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