如何才能撥打psql以便它不會提示輸入密碼?Postgresql:使用密碼腳本執行psql
這是我有:
psql -Umyuser < myscript.sql
但是,我找不到任何通過密碼的說法,所以psql的始終會提示它。
如何才能撥打psql以便它不會提示輸入密碼?Postgresql:使用密碼腳本執行psql
這是我有:
psql -Umyuser < myscript.sql
但是,我找不到任何通過密碼的說法,所以psql的始終會提示它。
有幾種方法來驗證到PostgreSQL。您可能希望調查http://www.postgresql.org/docs/current/static/client-authentication.html的密碼驗證替代方案。
要回答你的問題,有幾種方法提供基於密碼的驗證密碼。顯而易見的方法是通過密碼提示。除此之外,您可以在pgpass文件中或通過PGPASSWORD環境變量提供密碼。看到這些:
http://www.postgresql.org/docs/9.0/static/libpq-pgpass.html http://www.postgresql.org/docs/9.0/interactive/libpq-envars.html
沒有選項提供密碼作爲命令行參數,因爲這些信息往往是提供給所有用戶,因此沒有安全感。然而,在的Linux/Unix環境下,你可以爲一個命令像這樣提供一個環境變量:
PGPASSWORD = yourpass PSQL ...
我認爲PGPASSWORD已被棄用,但仍然工作,順便說一句。只是供參考 –
是的,它已被棄用(並在其中一個鏈接中註明)。自從它出現以後,可能還值得注意的是,這種棄用是激烈爭論的,因爲它對於很多人來說非常有用,但是在某些情況下可以使用而沒有嚴重的安全問題。在我看來,它並不比在NFS文件系統上存儲.pgpass更糟糕。我經常使用PGPASSWORD。 – Reece
您必須創建密碼文件:有關更多信息,請參閱http://www.postgresql.org/docs/9.0/interactive/libpq-pgpass.html。
您可以在腳本的開頭添加此命令行:
set PGPASSWORD=[your password]
在我的情況下,set命令不起作用,但'export PGPASSWORD = [password]'做了工作 –
'SET'應該在Windows上工作。 –
如果你有像我的Windows問題(我使用的是Windows 7 64位)和set PGPASSWORD=[Password]
沒有工作。
然後,Kavaklioglu在評論中一說,
export PGPASSWORD=[password]
您需要保存在這個文件的頂部,或任何使用之前被調用之前,所以它的設定。
肯定是在Windows :)
'export PGPASSWORD = [password]'根本不適用於我的命令行(cmd.exe)。你確定你沒有使用cygwin或類似的東西嗎? –
只適用於cl,你將它添加到文件的權利?現在只需輸入命令? –
可以在linux/mac環境下使用它,對於windows,我想你應該找到一種方法來導出這個環境變量。 –
鑑於有關使用PGPASSWORD環境變量中的安全問題,我認爲最好的整體解決方案如下工作:
這裏有一個值得注意的幾個百分點。第1步是爲了避免用戶的〜/ .pgpass文件可能存在。您還必須確保該文件的權限爲0600或更低。
有人建議利用慶典爲了縮短這一如下:
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
這種方法的工作示例出現在https://stackoverflow.com/a/40614592/3696363 - 對這個問題的另一個答案。 –
雖然這個用戶並沒有真正要求我尋找同樣的東西,但我會說這種方法不符合。 使用PGPASSFILE = <(whatever)語法時,您可以執行解密文件等操作,並只將其存在於創建的文件描述符中。通過編寫一個臨時文件,你並沒有從根本上解決使用憑據在磁盤上創建文件的問題。 處理這樣的任意行業規則並不好玩,但這是很多人處理的事情。 – Desidero
如果您打算在具有多個主機/數據庫連接,~/.pgpass file是要走的路。
步驟:
alias postygresy='psql --host hostname database_name -U username'
這些值應該與您輸入到〜/ .pgpass文件的值相匹配。請注意,如果您有一個導出PGPASSWORD =''變量集,它將優先於該文件。更改文件的權限也是明智的做法,以便其他用戶的內容不被遮擋。這可以用chmod 600 ~/.pgpass
大廈mightybyte's answer對於那些誰不舒服* nix中 shell腳本來實現,這裏有一個工作腳本:
#!/bin/sh
PGPASSFILE=/tmp/pgpasswd$$
echo "myserver:5432:mydb:jdoe:password" > $PGPASSFILE
chmod 600 $PGPASSFILE
export PGPASSFILE
psql mydb
rm $PGPASSFILE
雙美元符號($$
)在/tmp/pgpasswd$$
在第2行將進程ID號附加到文件名,以便該腳本可以運行多次,甚至同時運行,而不會產生副作用。
注4行使用chmod
命令的 - 就像「不是一個純文本文件」那mightybyte描述的錯誤,也有一個「權限」錯誤,如果做不到這一點。
在6號線,您就不必使用-h
MYSERVER,在-p
MyPort上,或-U
JDOE標誌,如果您使用默認值(本地主機:)和只有一個數據庫用戶。對於多個用戶,(但默認的連接)更改線路
psql mydb jdoe
不要忘了使腳本可執行與
chmod +x runpsql
(或任何你調用的腳本文件 )
您可以使用['mktemp'](https://en.wikipedia.org/wiki/Mktemp)創建臨時文件,而不必使用自己的命名機制。 它創建一個新的臨時文件(在Linux中爲'/ tmp/tmp.ITXUNYgiNh'命名,在Mac OS X上爲'/ var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4'),並將其名稱輸出到stdout。 –
使用-w在命令: PSQL -h本地主機-p 5432 -U用戶-w
我發現,即使你定義PGPASSWORD變量,psql顯示密碼提示,但是你可以指定-w選項來爲psql省略密碼提示。
它可以簡單地使用PGPASSWORD來完成。我正在使用psql 9.5.10。在你的情況下,解決辦法是
PGPASSWORD=password psql -U myuser < myscript.sql
我最終去了PGPASSWORD環境變量。這完美地裝了我的用例。腳本中簡單且獨立。 –