[英]ssh tunnel for local (not remote) command execution
我想創建一個Linux shell(bash-)腳本,它創建一個SSH隧道,運行一個使用該隧道的本地命令,最后關閉隧道和周圍的SSH連接。
為了減少解釋難度,可以考慮一個名為“remoteserver”的主機的本地SSH配置,其中包含一個沒有密碼的本地私鑰,所以
ssh remoteserver -L 4444:targetserver:5555
將直接打開與遠程服務器的連接,並創建從本地端口4444到目標服務器的隧道。 並且考慮本地命令是localclient --port 4444
,腳本看起來如何打開隧道,執行本地命令並在本地客戶端應用程序完成后關閉隧道?
由於應該可以保持其他並行正在進行的SSH連接,我不想要像sudo killall ssh
這樣的東西。
你可以嘗試類似的東西
TIMEOUT=60 # seconds
ssh remoteserver -L 4444:targetserver:5555 sleep $TIMEOUT &
localclient --port 4444
$ TIMEOUT秒后隧道將自動關閉。 請注意,使用&
僅對無密碼連接有效。 否則,您需要使用SSH的-f
標志。
或者,
ssh -N remoteserver -L 4444:targetserver:5555 &
sshpid=$!
localclient --port 4444
kill $sshpid
在localclient
執行后會殺死隧道。 請注意,這不適用於-f
標志,因為進程雙叉。
ssh
-only解決方案(對我不起作用) @damienfrancois的第二個建議是適當的,但由於某種原因,我不喜歡不得不kill
一些東西的想法。
另外,我無法相信ssh
沒有內置機制。 確實如此。 事情應該如何運作:
ssh remoteserver -o "PermitLocalCommand yes" -o "LocalCommand localclient --port 4444" \
-L 4444:targetserver:5555 -N
但由於某些原因,這對我來說沒有預期的效果:我首先嘗試使用像w
這樣簡單的東西用於LocalCommand
但是-N
使命令掛起,所以我使用了sleep 0
來代替,這似乎有效。
但是當我插入我的實際網絡命令時,結果運行得非常慢。 而不是在不到一秒的時間內完成,甚至在開始消息出現之前花了40秒。 我在20分鍾后終止了命令。
經過一些實驗,這就是我現在使用的:
ssh remoteserver -L 4444:targetserver:5555 keepalive.sh \
| (sleep 0.5; localclient --port 4444)
其中遠程端的keepalive.sh
是這樣的:
while true; do
sleep 1
echo "keepalive"
done
需要sleep 0.5
才能確保在localclient
啟動之前設置隧道(對於遠程或慢速remoteserver
,您可能需要更長的等待時間)。 一旦localclient
完成,隧道就會終止,因為一旦第二個命令關閉其標准輸入,shell就會終止管道。
這比@ damienfrancois的解決方案更好嗎? 要看。
對keepalive.sh
的需求是一個明顯的缺點,但無論localclient
如何以及為何終止,隧道被清除的方式都更加清晰。
我在Makefile
上下文中需要這個,就像它適合單行一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.