2011-06-29 215 views
174

如何才能撥打psql以便它不會提示輸入密碼Postgresql:使用密碼腳本執行psql

這是我有:

psql -Umyuser < myscript.sql 

但是,我找不到任何通過密碼的說法,所以psql的始終會提示它。

+3

我最終去了PGPASSWORD環境變量。這完美地裝了我的用例。腳本中簡單且獨立。 –

回答

199

有幾種方法來驗證到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 ...

+9

我認爲PGPASSWORD已被棄用,但仍然工作,順便說一句。只是供參考 –

+19

是的,它已被棄用(並在其中一個鏈接中註明)。自從它出現以後,可能還值得注意的是,這種棄用是激烈爭論的,因爲它對於很多人來說非常有用,但是在某些情況下可以使用而沒有嚴重的安全問題。在我看來,它並不比在NFS文件系統上存儲.pgpass更糟糕。我經常使用PGPASSWORD。 – Reece

54

您可以在腳本的開頭添加此命令行:

set PGPASSWORD=[your password] 
+18

在我的情況下,set命令不起作用,但'export PGPASSWORD = [password]'做了工作 –

+7

'SET'應該在Windows上工作。 –

109
PGPASSWORD=[your password] psql -Umyuser < myscript.sql 
+3

我想要這種簡單的命令語句 – pmverma

10

如果你有像我的Windows問題(我使用的是Windows 7 64位)和set PGPASSWORD=[Password]沒有工作。

然後,Kavaklioglu在評論中一說,

export PGPASSWORD=[password] 

您需要保存在這個文件的頂部,或任何使用之前被調用之前,所以它的設定。

肯定是在Windows :)

+1

'export PGPASSWORD = [password]'根本不適用於我的命令行(cmd.exe)。你確定你沒有使用cygwin或類似的東西嗎? –

+0

只適用於cl,你將它添加到文件的權利?現在只需輸入命令? –

+0

可以在linux/mac環境下使用它,對於windows,我想你應該找到一種方法來導出這個環境變量。 –

5

鑑於有關使用PGPASSWORD環境變量中的安全問題,我認爲最好的整體解決方案如下工作:

  1. 與寫您自己的臨時文件pgpass你想使用的密碼。
  2. 使用PGPASSFILE環境變量告訴psql使用該文件。
  3. 刪除臨時文件pgpass

這裏有一個值得注意的幾個百分點。第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 
+0

這種方法的工作示例出現在https://stackoverflow.com/a/40614592/3696363 - 對這個問題的另一個答案。 –

+0

雖然這個用戶並沒有真正要求我尋找同樣的東西,但我會說這種方法不符合。 使用PGPASSFILE = <(whatever)語法時,您可以執行解密文件等操作,並只將其存在於創建的文件描述符中。通過編寫一個臨時文件,你並沒有從根本上解決使用憑據在磁盤上創建文件的問題。 處理這樣的任意行業規則並不好玩,但這是很多人處理的事情。 – Desidero

29

如果您打算在具有多個主機/數據庫連接,~/.pgpass file是要走的路。

步驟:

  1. 創建〜/ .pgpass文件。輸入以下格式的信息hostname:port:database:username:password
  2. 請勿在字段值周圍添加字符串引號。您還可以使用*作爲端口/數據庫字段的通配符。
  3. 在您的bash配置文件中爲您運行psql命令創建一個別名。例如:alias postygresy='psql --host hostname database_name -U username'這些值應該與您輸入到〜/ .pgpass文件的值相匹配。
  4. 來源您的bash配置文件。
  5. 從命令行鍵入您的別名。

請注意,如果您有一個導出PGPASSWORD =''變量集,它將優先於該文件。更改文件的權限也是明智的做法,以便其他用戶的內容不被遮擋。這可以用chmod 600 ~/.pgpass

2

大廈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號線,您就不必使用-hMYSERVER,在-pMyPort上,或-UJDOE標誌,如果您使用默認值(本地主機:)和只有一個數據庫用戶。對於多個用戶,(但默認的連接)更改線路

psql mydb jdoe 

不要忘了使腳本可執行

chmod +x runpsql或任何你調用的腳本文件

+1

您可以使用['mktemp'](https://en.wikipedia.org/wiki/Mktemp)創建臨時文件,而不必使用自己的命名機制。 它創建一個新的臨時文件(在Linux中爲'/ tmp/tmp.ITXUNYgiNh'命名,在Mac OS X上爲'/ var/folders/xx/7gws2yy91vn9_t2lb8jcr2gr0000gn/T/tmp.QmbVOQk4'),並將其名稱輸出到stdout。 –

-4

使用-w在命令: PSQL -h本地主機-p 5432 -U用戶-w

-1

我發現,即使你定義PGPASSWORD變量,psql顯示密碼提示,但是你可以指定-w選項來爲psql省略密碼提示。

1

它可以簡單地使用PGPASSWORD來完成。我正在使用psql 9.5.10。在你的情況下,解決辦法是

PGPASSWORD=password psql -U myuser < myscript.sql

相關問題