Làm thế nào để sử dụng psql mà không có mật khẩu nhắc?


70

Tôi đã viết một kịch bản để REINDEXlập chỉ mục trong cơ sở dữ liệu. Đây là một trong số chúng:

echo -e "\nreindex for unq_vbvdata_vehicle started at: `date "+%F %T"`" >> ${LOG_FILE}
psql -U ${USERNAME} -h ${HOSTNAME} -d ${DBNAME} -c "REINDEX INDEX scm_main.unq_vbvdata_vehicle;"
if [[ ${?} -eq 0 ]]; then
    echo "reindex for unq_vbvdata_vehicle finished at: `date "+%F %T"`" >> ${LOG_FILE}
else
    echo "reindex for unq_vbvdata_vehicle failed" >> ${LOG_FILE}
    exit 1
fi

Vấn đề là tôi không thể chạy tập lệnh này trong chế độ độc lập. psqlđang nhắc mật khẩu mỗi khi nó chạy. Cũng có hai hạn chế:

  1. Tôi không thể tạo người dùng trên cơ sở dữ liệu mà không có mật khẩu.

  2. REINDEXkhóa bảng, tôi nên sử dụng sleep <num>giữa mỗi bảng REINDEX.

Có giải pháp tự động nào không?

Câu trả lời:


111

Bạn có bốn lựa chọn liên quan đến lời nhắc mật khẩu:

  1. đặt biến môi trường PGPASSWORD. Để biết chi tiết, xem hướng dẫn:
    http://www.postgresql.org/docs/civerse/static/libpq-envars.html
  2. sử dụng tệp .pgpass để lưu trữ mật khẩu. Để biết chi tiết, xem hướng dẫn:
    http://www.postgresql.org/docs/civerse/static/libpq-pgpass.html
  3. sử dụng "xác thực tin cậy" cho người dùng cụ thể đó:
    http://www.postgresql.org/docs/civerse/static/auth-methods.html#AUTH-TRUST
  4. sử dụng URI kết nối có chứa mọi thứ:
    http://www.postgresql.org/docs/civerse/static/libpq-connect.html#AEN42532

4
Vì PostgreSQL 9.1 cũng có peerphương thức xác thực cho các kết nối cục bộ. Hiện tại chỉ dành cho Linux, BSD, OS X hoặc Solaris (không phải Windows).
Erwin Brandstetter

1
Một lưu ý về .pgpasstùy chọn, bạn vẫn phải chỉ định tên người dùng, cơ sở dữ liệu và tên máy chủ (nếu bạn vẫn bình thường) trong psqllệnh
raphael

đối với 3, bạn cần chỉnh sửa phương thức. nó được giải thích ở đây: gist.github.com/p1nox/4953113
FuzzyAmi

Dễ dàng sử dụng export PGPASSWORD="your_pw"để đi phiên bản 1
gies0r

18

Một ví dụ đơn giản với PGPASSWORDsẽ là một cái gì đó như:

PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME

Hy vọng nó giúp.


4
Xin chào Ian_H, cảm ơn ý kiến ​​của bạn và tôi đều đồng ý với quan điểm của bạn. Câu trả lời được chấp nhận là rất toàn diện và điều đó đã giải quyết vấn đề của tôi. Lý do tôi đặt câu trả lời của mình cho bài viết cũ này là vì nó vẫn không đơn giản với tôi, vì tôi tin rằng những người khác có thể có cùng cảm giác.
pdm

Đây chắc chắn là một bổ sung tốt cho câu trả lời được chấp nhận - lời nhắc hữu ích rằng chúng ta không cần thiết lập các bình ENV vĩnh viễn.
kevlarr

1

Tùy thuộc vào quyền tài khoản của bạn, ví dụ mà không chỉ định cơ sở dữ liệu có thể không thành công, vì quyền của người dùng được kiểm tra đối với cơ sở dữ liệu bạn kết nối. Nó là tốt hơn rõ ràng xác định cơ sở dữ liệu quá.

# this can fail.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME    

# this is more likely to work, assuming given account has permissions to that database.
PGPASSWORD=YOUR_PASSRORD psql -h YOUR_PG_HOST -U YOUR_USER_NAME -d YOUR_DATABASE  

0

Câu trả lời rất hữu ích trong chủ đề này. Tôi chỉ thêm cái này cho Ubuntu 18.04:

sudo PGPASSWORD=yourpasswordHere -u postgres psql

Điều này sẽ đưa bạn vào postgres mà không cần nhắc mật khẩu, mà không phải đặt bất kỳ biến môi trường nào. Đây không phải là một thiết lập vĩnh viễn.


Đừng làm điều này: Mật khẩu sẽ hiển thị trong đầu ra của ps -ef.
Colin 't Hart
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.