Ssh

SSH 將 stdin 和 stout 與 postgres 客戶端直接連接

  • April 21, 2013

我的本地可以連接到遠端,但它無法連接到 dbserver。遠端可以連接到 dbserver(使用 psql)。

我想從我的本地對數據庫執行 sql 腳本。

我正在尋找一種在遠端打開 psql 並使用 ssh 將我的標準輸入和標準輸出定向到本地的方法。

現在在愚蠢的選項中我這樣做:

ssh remote
psql -h db report
password
run my commands

我可以以這種方式在腳本中執行此操作,但它的醜陋和不允許我與 psql 進行互動會話。

PSQL="PGPASSWORD=mypassword psql -h dbserver  -d report"
SQL="SELECT 1"
ssh remote "$PSQL --command 'COPY ($SQL) TO STDOUT WITH CSV;'"

Ps- Python 也可以。

使用帶有後台無命令 ssh 會話的 ssh 埠轉發:

$ ssh -N -f -L 5433:localhost:5432 remoteserver

然後您可以使用它:

$ psql -h localhost -p 5433

psql``\o,等命令\i將引用本地電腦上的文件。

如果您出於腳本目的嘗試執行此操作,那麼您可能希望使用 ssh 的-n選項和設置了選項的無密碼 ssh 密鑰authorized_keys以防止生成 shell,因此您能做的就是埠轉發給定埠。使用無密碼密鑰時,這對於安全性非常重要。ssh-agent提供了一種更安全的替代方案,但對於腳本編寫來說更笨拙。請記住,您的腳本將需要記錄它產生的後台 ssh 會話的程序 ID,並在任務結束時將其終止。有時使用 shell 作業控制比使用 ssh 自己的守護模式更容易;這樣,shell 會跟踪後台程序,&並且可以使用kill %jobid. 請參閱bash 作業控制. (您需要後台埠轉發 ssh 會話,以便腳本的執行可以繼續並執行psql)。

對於互動式使用,您可以只呼叫遠端psqlover ssh,在這種情況下,諸如\o, \i,\copy等命令將引用您 ssh 到的伺服器的本地文件,而不是您的本地電腦:

$ ssh remoteserver psql

這也適用於腳本目的,但不如埠轉發安全,因為psql它是一個非常強大的程序,可讓您讀取和寫入任意文件,生成 shell 等。您無法真正限制無密碼 ssh 密鑰的功能如果允許遠端呼叫psql. 另一方面,編寫起來要簡單得多:

ssh remoteserver psql <<'__END__'
BEGIN;
INSERT INTO blah(a,b,c) VALUES (1,2,3);
UPDATE otherblah SET x = 99, y = 912;
COMMIT;
__END__

而不是在後台 ssh 會話中搗亂。真的,這取決於你的優先事項是什麼。

引用自:https://serverfault.com/questions/501312