Làm thế nào tôi có thể gọi psql để nó không nhắc mật khẩu ?
Đây là những gì tôi có:
psql -Umyuser < myscript.sql
Tuy nhiên, tôi không thể tìm thấy đối số vượt qua mật khẩu và vì vậy psql luôn nhắc nhở về nó.
Làm thế nào tôi có thể gọi psql để nó không nhắc mật khẩu ?
Đây là những gì tôi có:
psql -Umyuser < myscript.sql
Tuy nhiên, tôi không thể tìm thấy đối số vượt qua mật khẩu và vì vậy psql luôn nhắc nhở về nó.
Câu trả lời:
Có một số cách để xác thực với PostgreSQL. Bạn có thể muốn điều tra các lựa chọn thay thế để xác thực mật khẩu tại https://www.postgresql.org/docs/civerse/static/client-authentication.html .
Để trả lời câu hỏi của bạn, có một vài cách cung cấp mật khẩu để xác thực dựa trên mật khẩu. Cách rõ ràng là thông qua dấu nhắc mật khẩu. Thay vào đó, bạn có thể cung cấp mật khẩu trong tệp pgpass hoặc thông qua PGPASSWORD
biến môi trường. Xem những điều này:
Không có tùy chọn để cung cấp mật khẩu dưới dạng đối số dòng lệnh vì thông tin đó thường có sẵn cho tất cả người dùng và do đó không an toàn. Tuy nhiên, trong môi trường Linux / Unix, bạn có thể cung cấp một biến môi trường cho một lệnh như thế này:
PGPASSWORD=yourpass psql ...
PGPASSWORD=[your password] psql -Umyuser < myscript.sql
Bạn có thể thêm dòng lệnh này khi bắt đầu tập lệnh của mình:
set PGPASSWORD=[your password]
export PGPASSWORD=[password]
đã hoạt động
#!/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
.
Nếu bạn dự định có nhiều kết nối máy chủ / cơ sở dữ liệu, tệp ~ / .pgpass là cách để sử dụng.
Các bước:
vim ~/.pgpass
hoặc tương tự. Nhập thông tin của bạn theo định dạng sau:
hostname:port:database:username:password
Không thêm dấu ngoặc kép xung quanh các giá trị trường của bạn. Bạn cũng có thể sử dụng * làm ký tự đại diện cho các trường cổng / cơ sở dữ liệu của mình.chmod 0600 ~/.pgpass
để nó không bị âm thầm bỏ qua bởi psql.alias postygresy='psql --host hostname database_name -U username'
Các giá trị phải khớp với các giá trị mà bạn đã nhập vào tệp ~ / .pgpass.. ~/.bashrc
hoặc tương tự.Lưu ý rằng nếu bạn có bộ biến PGPASSWORD = '' xuất, nó sẽ được ưu tiên hơn tệp.
chmod 600
tập tin, nếu không psql
sẽ âm thầm bỏ qua nó (theo các tài liệu).
Đây có thể là một câu hỏi cũ, nhưng có một phương pháp thay thế mà bạn có thể sử dụng mà không ai đề cập đến. Có thể chỉ định mật khẩu trực tiếp trong URI kết nối. Các tài liệu có thể được tìm thấy ở đây , thay thế ở đây .
Bạn có thể cung cấp tên người dùng và mật khẩu của mình trực tiếp trong URI kết nối được cung cấp cho psql
:
# postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
psql postgresql://username:password@localhost:5432/mydb
PGPASSWORD
Nếu bạn gặp sự cố trên các cửa sổ như tôi (Tôi đang sử dụng Windows 7 64-bit) và set PGPASSWORD=[Password]
không hoạt động.
Sau đó, như Kavaklioglu đã nói trong một trong những bình luận,
export PGPASSWORD=[password]
Bạn sẽ cần lưu phần này ở đầu tệp hoặc trước bất kỳ cách sử dụng nào để tập trước khi được gọi.
Chắc chắn không hoạt động trên windows :)
export PGPASSWORD=[password]
hoàn toàn không hoạt động với tôi bằng cách sử dụng dòng lệnh (cmd.exe). Bạn có chắc chắn rằng bạn không sử dụng cygwin hoặc một cái gì đó tương tự?
Bạn phải tạo một tệp mật khẩu: xem http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html để biết thêm thông tin.
Với những lo ngại về bảo mật về việc sử dụng biến môi trường PGPASSWORD, tôi nghĩ giải pháp tổng thể tốt nhất là như sau:
Có một vài điểm lưu ý ở đây. Bước 1 là ở đó để tránh mucking với tập tin ~ / .pgpass của người dùng có thể tồn tại. Bạn cũng phải đảm bảo rằng tệp có quyền 0600 trở xuống.
Một số đã đề xuất tận dụng bash để tắt phím này như sau:
PGPASSFILE=<(echo myserver:5432:mydb:jdoe:password) psql -h myserver -U jdoe -p 5432 mydb
Điều này sử dụng cú pháp <() để tránh cần phải ghi dữ liệu vào một tệp thực tế. Nhưng nó không hoạt động vì psql kiểm tra tập tin nào đang được sử dụng và sẽ đưa ra một lỗi như thế này:
WARNING: password file "/dev/fd/63" is not a plain file
Nó có thể được thực hiện đơn giản bằng cách sử dụng PGPASSWORD. Tôi đang sử dụng psql 9.5.10. Trong trường hợp của bạn, giải pháp sẽ là
PGPASSWORD=password psql -U myuser < myscript.sql
Dựa trên câu trả lời của mightybyte cho những người không thoải mái với kịch bản shell * nix , đây là một kịch bản hoạt động:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
touch $PGPASSFILE
chmod 600 $PGPASSFILE
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
Ký hiệu đô la kép ( $$
) /tmp/pgpasswd$$
ở dòng 2 sẽ thêm số ID quy trình vào tên tệp, để tập lệnh này có thể được chạy nhiều lần, thậm chí đồng thời, không có tác dụng phụ.
Lưu ý việc sử dụng chmod
lệnh ở dòng 4 - giống như lỗi " không phải là tệp đơn giản " mà mightybyte đã mô tả, cũng có lỗi " quyền " nếu điều này không được thực hiện.
Ở dòng 7, bạn sẽ không phải sử dụng cờ -h
myserver , -p
myport hoặc -U
jdoe nếu bạn sử dụng mặc định ( localhost : 5432 ) và chỉ có một người dùng cơ sở dữ liệu. Đối với nhiều người dùng, (nhưng kết nối mặc định) thay đổi dòng đó thành
psql mydb jdoe
Đừng quên để tập lệnh thực thi với
chmod +x runpsql
( hoặc bất cứ điều gì bạn gọi là tệp script )
CẬP NHẬT:
Tôi đã lấy lời khuyên của RichVel và làm cho tập tin không thể đọc được trước khi đặt mật khẩu vào đó. Điều đó đóng một lỗ hổng bảo mật nhẹ. Cảm ơn!
mktemp
để tạo một tệp tạm thời thay vì đưa ra sơ đồ đặt tên của riêng bạn. Nó tạo ra một tệp tạm thời mới (được đặt tên giống như /tmp/tmp.ITXUNYgiNh
trong Linux và /var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4
trên MacOS X) và in tên của nó thành thiết bị xuất chuẩn.
chmod 600
sau khi tạo tệp, nhưng trước khi ghi mật khẩu vào đó. Như đã viết, một tập lệnh độc hại trên máy chủ có thể liên tục cố gắng đọc các tệp có định dạng này và đôi khi sẽ thành công trong việc lấy mật khẩu. Ngoài ra, nếu kịch bản này bị gián đoạn vì một số lý do, tệp sẽ được để lại trên đĩa - viết trap
trình xử lý shell sẽ giải quyết vấn đề này. Cho rằng việc viết một tập lệnh an toàn như thế này không phải là chuyện nhỏ, tôi khuyên bạn nên sử dụng export PGPASSWORD
thay thế.
PGPASSWORD
đã bị phản đối trong 9.3.
Một cách khác để sử dụng PGPASSWORD
biến môi trường là sử dụng conninfo
chuỗi theo tài liệu
Một cách khác để chỉ đị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=>
Bạn có thể thấy điều này hữu ích: dòng lệnh Windows PSQL: có cách nào cho phép đăng nhập không cần mật khẩu không?
8 năm sau ...
Trên máy mac của tôi, tôi phải đặt một dòng vào tệp
~/.pgpass
như:
<IP>:<PORT>:<dbname>:<user>:<password>
Xem thêm:
https://www.postgresql.org/docs/civerse/libpq-pgpass.html
https://wiki.postgresql.org/wiki/Pgpass