SSH 將 stdin 和 stout 與 postgres 客戶端直接連接
我的本地可以連接到遠端,但它無法連接到 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
)。對於互動式使用,您可以只呼叫遠端
psql
overssh
,在這種情況下,諸如\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 會話中搗亂。真的,這取決於你的優先事項是什麼。