簡體   English   中英

用於本地(非遠程)命令執行的ssh隧道

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM