암호를 묻지 않도록 psql을 어떻게 호출 할 수 있습니까?
이것이 내가 가진 것입니다 :
psql -Umyuser < myscript.sql
그러나 암호를 전달하는 인수를 찾을 수 없으므로 psql은 항상 암호를 묻습니다.
암호를 묻지 않도록 psql을 어떻게 호출 할 수 있습니까?
이것이 내가 가진 것입니다 :
psql -Umyuser < myscript.sql
그러나 암호를 전달하는 인수를 찾을 수 없으므로 psql은 항상 암호를 묻습니다.
답변:
PostgreSQL을 인증하는 방법에는 여러 가지가 있습니다. https://www.postgresql.org/docs/current/static/client-authentication.html 에서 비밀번호 인증에 대한 대안을 조사 할 수 있습니다 .
귀하의 질문에 대답하기 위해, 비밀번호 기반 인증을위한 비밀번호를 제공하는 몇 가지 방법이 있습니다. 확실한 방법은 비밀번호 프롬프트를 사용하는 것입니다. 그 대신 pgpass 파일 또는 PGPASSWORD
환경 변수를 통해 비밀번호를 제공 할 수 있습니다 . 이것들을보십시오 :
암호는 명령 줄 인수로 제공 할 수있는 옵션이 없습니다. 그 정보는 모든 사용자가 사용할 수 있으므로 안전하지 않기 때문입니다. 그러나 Linux / Unix 환경에서는 다음과 같은 단일 명령에 환경 변수를 제공 할 수 있습니다.
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
스크립트 시작시이 명령 줄을 추가 할 수 있습니다.
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
하지 않았지만 작동했습니다.
#!/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
PGPASSWORD=password
.
여러 개의 호스트 / 데이터베이스 연결을 사용하려는 경우 ~ / .pgpass 파일 을 사용하십시오.
단계 :
vim ~/.pgpass
하거나 유사한 파일을 작성하십시오 . 다음 형식으로 정보를 입력하십시오
hostname:port:database:username:password
. 필드 값 주위에 문자열 따옴표를 추가하지 마십시오. *를 포트 / 데이터베이스 필드의 와일드 카드로 사용할 수도 있습니다.chmod 0600 ~/.pgpass
psql에 의해 자동으로 무시되지 않도록 해야합니다 .alias postygresy='psql --host hostname database_name -U username'
, 값은 ~ / .pgpass 파일에 입력 한 값과 일치해야합니다.. ~/.bashrc
하거나 유사하게 제공하십시오.내보내기 PGPASSWORD = ''변수가 설정되어 있으면 파일보다 우선합니다.
chmod 600
파일에 대한 작업을 수행해야 합니다. 그렇지 않으면 psql
문서에 따라 자동으로 파일을 무시합니다.
이것은 오래된 질문 일 수도 있지만 아무도 언급하지 않은 다른 방법을 사용할 수 있습니다. 연결 URI에서 직접 비밀번호를 지정할 수 있습니다. 문서는 여기 또는 대안 적으로 여기 에서 찾을 수 있습니다 .
다음에 제공된 연결 URI에서 직접 사용자 이름과 비밀번호를 제공 할 수 있습니다 psql
.
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
나와 같은 창에 문제가 있고 (Windows 7 64 비트를 사용하고 있음) set PGPASSWORD=[Password]
작동하지 않습니다.
그런 다음 Kavaklioglu가 의견 중 하나에서 말했다시피,
export PGPASSWORD=[password]
파일 상단에 또는 사용하기 전에 파일을 저장하기 전에 파일을 저장해야합니다.
확실히 창문에서 작동합니다 :)
export PGPASSWORD=[password]
명령 줄 (cmd.exe)을 전혀 사용하지 않습니다. cygwin 또는 이와 유사한 것을 사용하지 않았습니까?
비밀번호 파일을 작성해야합니다 . 자세한 정보는 http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html 을 참조 하십시오 .
PGPASSWORD 환경 변수 사용에 대한 보안 문제를 고려할 때 가장 좋은 전체 솔루션은 다음과 같습니다.
여기 몇 가지주의 할 점이 있습니다. 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
바탕 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 번호를 파일 이름에 추가하여 부작용없이 동시에이 스크립트를 두 번 이상 실행할 수 있습니다.
chmod
4 행 에서 명령 사용에 유의하십시오. 마이티 바이트에 설명 된 " 일반 파일 이 아님 "오류와 마찬가지로이 작업을 수행하지 않으면 " 권한 "오류 도 있습니다 .
7 행 에서 기본값 ( localhost : 5432 )을 사용하고 데이터베이스 사용자가 한 명인 경우 -h
myserver , -p
myport 또는 -U
jdoe 플래그 를 사용할 필요가 없습니다 . 여러 사용자의 경우 (그러나 기본 연결) 해당 줄을 다음으로 변경하십시오.
psql mydb jdoe
스크립트를 실행 파일 로 실행 하는 것을 잊지 마십시오
chmod +x runpsql
( 또는 스크립트 파일이라고 부르는 것 )
최신 정보:
나는했다 RichVel 의 조언을 읽을 파일 제작 전에 그것으로 암호를 가하고있다. 약간의 보안 구멍이 닫힙니다. 감사!
mktemp
고유 한 명명 체계를 사용하는 대신 임시 파일을 만드는 데 사용할 수 있습니다 . /tmp/tmp.ITXUNYgiNh
Linux 및 /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
MacOS X 와 같은 이름의 새 임시 파일을 생성하고 stdout에 이름을 인쇄합니다.
chmod 600
파일을 만든 후 암호를 작성하기 전에 파일을 작성하는 것이 가장 좋습니다 . 작성된대로 서버의 악성 스크립트는이 형식의 파일을 지속적으로 읽으려고 시도 할 수 있으며 때로는 암호를 얻는 데 성공할 수도 있습니다. 또한이 스크립트가 어떤 이유로 중단되면 파일이 디스크에 남게됩니다. 셸 trap
핸들러를 작성하면 이 문제를 해결할 수 있습니다. 이와 같은 보안 스크립트를 작성하는 것이 쉽지는 않다는 점을 고려하여 export PGPASSWORD
대신 사용 하는 것이 좋습니다 .
PGPASSWORD
9.3에서 더 이상 사용되지 않으므로 필요합니다 .
:이 유용하게 사용할 수있는 윈도우 PSQL 명령 줄을 : 암호없이 로그인을 허용하는 방법이 있나요?
8 년 후 ...
내 Mac에서는 ~/.pgpass
다음과 같이 파일에 줄을 넣어야했습니다
.
<IP>:<PORT>:<dbname>:<user>:<password>
참조 :
https://www.postgresql.org/docs/current/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass