Làm cách nào để chỉ định mật khẩu cho 'psql' không tương tác?


337

Tôi đang cố gắng tự động hóa quá trình tạo cơ sở dữ liệu bằng một tập lệnh shell và một điều tôi đã gặp phải khi chặn đường bằng cách chuyển mật khẩu cho psql . Đây là một chút mã từ tập lệnh shell:

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

Làm cách nào để tôi chuyển mật khẩu psqltheo cách không tương tác?


1
Bạn có thể sử dụng một url kết nối. Kiểm tra câu trả lời này trong stackoverflow.com/questions/3582552/postgres-connection-url .
paulodaguani

Câu trả lời:


140

Từ tài liệu chính thức :

Cũng thuận tiện khi có tệp ~ / .pgpass để tránh thường xuyên phải nhập mật khẩu. Xem Phần 30.13 để biết thêm thông tin.

...

Tập tin này nên chứa các dòng có định dạng sau:

hostname:port:database:username:password

Trường mật khẩu từ dòng đầu tiên phù hợp với các tham số kết nối hiện tại sẽ được sử dụng.


29
Cảm ơn, tôi biết về pgpass, nhưng điều này không giải quyết được vấn đề - Tôi cần một tập lệnh bash độc lập để vận hành trên cơ sở dữ liệu, do đó câu hỏi của tôi về việc chuyển thông tin đến psql thông qua dòng lệnh.
Alex N.

6
Tôi nghĩ rằng tùy chọn duy nhất của bạn là thiết lập tệp .pgpass mà tập lệnh bash của bạn có quyền truy cập. Hoặc hoàn toàn không sử dụng mật khẩu - bạn có thể thiết lập một hình thức xác thực khác, chẳng hạn như nhận dạng hoặc sử dụng chứng chỉ SSL.
Flimzy

Đó là những gì tôi sợ :) Cảm ơn thông tin!
Alex N.

Một lựa chọn khác có thể là sử dụng mong đợi. Nhưng tôi thực sự ghét kỳ vọng :)
Flimzy

1
Đừng quên xóa nhóm và quyền người dùng khác để đọc, viết, thực thi tệp .pgpass! Chạychmod go-rwx .pgpass
Vladislavs Dovgalecs

609

Đặt biến môi trường PGPASSWORD bên trong tập lệnh trước khi gọi psql

PGPASSWORD=pass1234 psql -U MyUsername myDatabaseName

Để tham khảo, xem http://www.postgresql.org/docs/cản/static/libpq-envars.html


Biên tập

Vì Postgres 9.2, cũng có tùy chọn chỉ định chuỗi kết nối hoặc URI có thể chứa tên người dùng mật khẩu.

Sử dụng đó là một rủi ro bảo mật vì mật khẩu hiển thị dưới dạng văn bản đơn giản khi nhìn vào dòng lệnh của một quy trình đang chạy, ví dụ như sử dụng ps(Linux), ProcessExplorer (Windows) hoặc các công cụ tương tự, bởi những người dùng khác.

Xem thêm câu hỏi này trên Quản trị viên cơ sở dữ liệu


32
Ví dụ: trong một dòng bạn có thể làm một cái gì đó như: PGPASSWORD = pass1234 psql -u MyUsername myUserName
andyortlieb

3
Tôi nghĩ rằng đây là cách thuận tiện nhất để chạy tập lệnh SQL.
zr870

2
Tôi chỉ có thể thêm - thêm một spacedòng lệnh trước ký tự đầu tiên và lệnh sẽ không được lưu trong lịch sử bash. Hoạt động cho Ubuntu / bash.
baldr

5
THƯỞNG: Hoạt động cho Docker:docker run -e PGPASSWORD="$(pbpaste)" --rm postgres psql -h www.example.com dbname username -c 'SELECT * FROM table;'
Bilal Akil

3
Hãy cẩn thận và đảm bảo luôn luôn thêm một khoảng
trắng

102
  • trong một dòng:

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

    với lệnh một lệnh sql như"select * from schema.table"

  • hoặc dễ đọc hơn:

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

18
Một dòng có thể được đơn giản hóa một chút để: PGPASSWORD='password' psql .... cũng có lợi ích của biến không thể truy cập được sau khi lệnh được thực hiện.
Garrett

3
export PGPASSWORD=YourNewPasswordlàm việc cho tôi trên các biến thể khác.
Mikeumus

7
export PGPASSWORDâm thanh như một ý tưởng thực sự xấu
Hasen

1
Điều này sẽ lưu mật khẩu trong lịch sử bash của bạn ~ / .bash_history (trừ khi bạn luôn cẩn thận thêm một khoảng trắng trước đó) và cũng xuất mật khẩu vào môi trường hiện tại của bạn FWIW: |
rogerdpack

66

Tôi có xu hướng thích truyền URL tới psql :

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

Điều này cho tôi tự do đặt tên các biến môi trường của mình theo ý muốn và tránh tạo các tệp không cần thiết.

Điều này đòi hỏi libpq. Các tài liệu có thể được tìm thấy ở đây .


bạn có thể sử dụng một cái gì đó như thế này với pg_restore? Cảm ơn!
the_ccalderon

1
@ ccalderon911217 Rõ ràng bạn có thể: stackoverflow.com/a/28359470/1388292
Jacques Gaudin

@JacquesGaudin yep đã tự kiểm tra! Cảm ơn bạn!
the_ccalderon

26

Trên Windows:

  1. Gán giá trị cho PGPASSWORD: C:\>set PGPASSWORD=pass

  2. Chạy lệnh: C:\>psql -d database -U user

Sẵn sàng

Hoặc trong một dòng,

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

Lưu ý thiếu không gian trước &&!


1
Tôi đã thử điều đó, và nó đã không hoạt động. Vẫn đang được yêu cầu nhập mật khẩu.
antipotype

1
@antipotype Bạn cũng phải vượt qua tùy chọn -w.
mljrg

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

21

Điều này có thể được thực hiện bằng cách tạo một .pgpasstệp trong thư mục chính của Người dùng (Linux). .pgpass định dạng tệp:

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

Bạn cũng có thể sử dụng thẻ hoang dã *thay cho chi tiết.

Nói rằng tôi muốn chạy tmp.sqlmà không cần nhập mật khẩu.

Với đoạn mã sau bạn có thể trong tệp * .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
Điểm của tiếng vang "` chmod 0600 $ HOME / .pgpass` "là gì? Làm thế nào về chỉ chmod 0600 $ HOME / .pgpass?
Vlad Patryshev

12

Một cách khác để sử dụng PGPASSWORDbiến môi trường là sử dụng conninfochuỗi theo tài liệu :

Một cách khác để xác định tham số kết nối là trong chuỗi Conninfo hoặc URI, được sử dụng thay cho tên cơ sở dữ liệu. Cơ chế này cung cấp cho bạn quyền kiểm soát rất rộng đối với kết nối.

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

postgres=>

cảm ơn bạn, nó đã làm việc tốt cho tôi
grepit

4

Đã thêm nội dung của pg_env.sh vào .bashrc của tôi:

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

có thêm (theo gợi ý của người dùng4653174)

export PGPASSWORD='password'
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.