2013-04-10 118 views
2

如何驗證postgresql用戶和密碼在沒有數據庫的情況下是否有效?驗證PostgreSQL用戶和沒有數據庫的密碼

我正在創建一個自動安裝,它將創建一個數據庫並運行sql腳本來創建表。安裝需要在運行腳本之前驗證用戶和密碼。自動安裝調用Windows批處理文件。首先我設置密碼,設置爲PGPASSWORD=mypassword

設置密碼後,什麼命令可以驗證用戶和密碼並返回錯誤代碼或消息?

其他數據庫程序(如IBM和db2)有一個附加命令,它允許用戶附加到服務器或實例,而不指定數據庫名稱。我無法找到PostgreSQL的等價物。

如何在命令行上登錄到PostgreSQL而不指定數據庫名稱?

+1

的Postgres始終安裝一個名爲「Postgres的數據庫。使用那個與@Eric的答案,你會沒事的。 – mistapink 2013-04-10 14:47:28

回答

3

使用系統表pg_roles

的Postgres始終安裝一個名爲 「Postgres的」 數據庫。 postgres是當你沒有連接到數據庫時連接到的數據庫。有一張名爲pg_roles的表格。

使用此命令:

psql -U pgadmin -d postgres -c 'select * from pg_roles' 

它返回這樣的:

rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolconfig | oid 
----------+----------+------------+---------------+-------------+--------------+-------------+----------------+--------------+-------------+---------------+-----------+------- 
postgres | t  | t   | t    | t   | t   | t   | t    |   -1 | ******** |    |   | 10 
pgadmin | t  | t   | t    | t   | t   | t   | t    |   -1 | ******** |    |   | 16384 

(2行)

看到這個答案:How to check if a postgres user exists?

測試它在登錄

只要嘗試使用提供的用戶名/密碼登錄並用try/catch將其包圍,並且如果可以登錄,那麼它是有效的,否則它是無效的。

改變用戶

你也許可以,如果你改變了一個不存在用戶搭上一條錯誤消息:http://www.postgresql.org/docs/8.0/static/sql-alteruser.html

ALTER USER postgres WITH PASSWORD 'tmppassword'; 

刪除並重新添加用戶

如果您嘗試刪除並重新添加用戶,您可能會收到錯誤消息。所以如果它是無效的,那麼當你嘗試刪除一個非用戶時,它會引發錯誤。 http://www.postgresql.org/docs/8.0/static/sql-createuser.html

+0

所以你想在安裝postgresql系統表之前驗證用戶是否有效?這似乎有點奇怪,但確定。 – 2013-04-10 14:22:34

+0

自動安裝正在創建一個新的數據庫,然後運行腳本來創建表和加載數據。屏幕會提示輸入憑據,並在調用createdb命令之前需要進行身份驗證。沒有必要使用錯誤的憑據運行其他命令。這是數據庫安裝的標準做法。 – 2013-04-10 14:31:57

+0

登錄到PostgreSQL:其他db程序(如IBM db2)有一個attach命令,它允許用戶附加到服務器或實例,而不指定db名稱。我無法找到PostgreSQL的等價物。如何在命令行上登錄到PostgreSQL而不指定數據庫名稱? – 2013-04-10 14:35:13

1

這裏有一個方便的方法來檢查命令行中的用戶名/密碼組合是否有效。這是從puppetlabs,PostgreSQL的模塊拉:

su - username 
env PGPASSWORD=somepass psql -h localhost -c 'select 1' 
echo $? 

...其中「somepass」是被測試的密碼,「用戶名」是對被測試的帳戶(通常是postgres用戶本身)。

如果$?爲0時,用戶/密碼組合有效。如果$?是1,密碼錯誤或用戶不存在。無論哪種方式,都有問題。

這就是Linux/bash的方式。在Windows的方法是沿着線的東西:

(run under the user account you're interested in) 

set PGPASSWORD=somepass 
psql -h localhost -c 'select 1' 

if errorlevel 1 (
    echo Failure Reason Given is %errorlevel% 
    exit /b %errorlevel% 
) 

上PSQL的-h強制本地基於TCP的連接,默認情況下(從pg_hba.conf的)強制密碼檢查沒有可能性密碼的用戶可以旁路。

對於沒有發佈經過完全測試的Windows解決方案,我表示歉意,但上面的代碼很可能會直接運行,或者只會稍微修復。

-1

在你的終端簡單地使用這個命令:

psql postgres 
+0

這不起作用。 – 2017-11-16 05:07:10