ssh 터널을 통해 PostgreSQL 데이터베이스에 연결하려고합니다. 포트 3333에서 수신 대기하고 데이터베이스가있는 시스템의 포트 5432로 전달하도록 설정되어 있습니다. psql
터널을 통해 암호 인증으로 명령 을 사용하여 연결할 수 있지만 어떤 이유로 psycopg2
터널 을 통해 연결을 시도 하면 오류가 발생 FATAL: password authentication failed for user database_user
합니다. 사용자 이름과 암호를 따옴표로 묶어 보았습니다.
성공적인 psql
명령 :
psql -h localhost -p 3333 -U database_name database_user
#This command brings up password prompt
실패한 pscyopg2
명령 :
psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password='database_password' port=3333")
산출:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/database_user/.local/share/virtualenvs/project-QNhT-Vzg/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL: password authentication failed for user "database_user"
FATAL: password authentication failed for user "database_user"
다음은 pg_hba.conf
참조 용 으로 내 일부입니다 .
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 md5
host replication all ::1/128 md5
연결 문제를 디버깅 할 때 서비스에 도달하기 전에 어떤 계층을 거쳐야하는지 항상 기억하는 것이 좋습니다. PostgreSQL 서비스를 연결할 때 최소한 3 개의 계층이 있습니다.
문제를 일으키는 계층을 이해하는 것이 중요합니다. PostgreSQL 클라이언트 (시나리오에서 psycopg2로 래핑 됨) 오류는 임시 오류 메시지를 발행하여이 문제를 해결하는 데 도움이됩니다.
Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
즉, PostgreSQL 서비스 연결에 전혀 성공하지 못했고 서비스 이전에 문제가 발생합니다.No pg_hba.conf entry for host <hostname>, user <username>, database <database>
즉, PostgreSQL 서비스에 연결했지만 연결이 ACL에서 유효한 것으로 참조되지 않음을 의미합니다.password authentication failed for user "<user>"
즉, PostgreSQL 서비스에 연결했고 연결이 ACL 항목을 따르지만 인증에 실패했음을 의미합니다.이후 시나리오에서는 인증 모드를 정의하므로 트리거 된 항목을 아는 것이 중요합니다. 귀하의 경우에는 md5
항목 이었습니다 ( peer
모드 에는 비밀번호가 없으며 SSH 터널이 localhost를 매핑해야하므로 postgreSQL 관점 host
대신에 표시됩니다 local
) :
host all all 127.0.0.1/32 md5
분명히 귀하의 암호는 예상 한 것과 다릅니다. 이를 해결하려면 다음을 확인하십시오.
psycopg2
연결에 동일한 암호를 사용하면 연결할 수 있어야합니다.댓글을 읽으면 '
비밀번호에도 따옴표 가있는 것 같습니다 . 따라서 연결의 암호는 다음과 같을 수 있습니다.
psycopg2.connect("dbname='database_name' user='database_user' host='localhost' password="'database_password'" port=3333")
또는 따옴표가 필요한 경우 이스케이프해야하는 특수 문자를 사용했음을 나타낼 수 있습니다. 더 간단한 암호를 사용하여 디버그 한 다음 더 강력한 암호로 대체 할 수도 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다