ローカルコマンド実行中にのみトンネルを開く

ローカルコマンド実行中にのみトンネルを開く

リモートサーバーへのトンネルを必要とするスクリプトがあります。このような:

ssh -fNL 8080:localhost:80 my_server

その後、トンネルをどのように閉じることができますか?ローカルスクリプト終わる?

上記の例は、私が試した組み合わせの1つです。私はSSH呼び出しをブロックし、リモートコマンドを実行し、「sleep」を使用してトンネルを自動的に閉じる方法を見てきましたが、スクリプトの実行中にのみトンネルを提供する方法を望みます。

私の最後のアプローチは、sshをバックグラウンドにフォークしてスクリプトの終了時に終了するようにすることでしたが、上記のコマンドを使用すると、スクリプトを終了した後でもsshプロセスがまだ存在します。また、バックグラウンドSSHを手動で終了するためにPIDを取得する方法も研究中です。

答え1

ただ使用

function atexit() {
  kill $TUNNEL_PID
}
trap atexit EXIT
ssh -nNL 8080:localhost:80 my_server &
TUNNEL_PID=$!

(つまり、ssh自体をバックグラウンドで通知しないでください。通常のバックグラウンドジョブとして実行し、pidを保存してください。)

答え2

&最後に追加して、sshコマンドをバックグラウンドに設定できる必要があります。次に、次の行に追加します。

SSHPID=$!

$!最新のバックグラウンドコマンドのPIDなので、SSHセッションのPIDです。その後、スクリプトの最後にkill -SIGKILL $SSHPID

答え3

私は解決策をテストしましたが、その方法は気に入らませんが、うまくいきます。

前提条件:

  • 画面コマンドがインストールされました
  • ロック解除されたSSHキーを使用したSSH接続

ソリューションを構築する方法のガイドライン:

トンネルを開始する場所に次の行を追加します。

screen -d -m -S myTunnel ssh 0.0.0.0:123:118.218.118.218:5555 myServer # starts a screen in detached mode and create your tunnel

ジョブを実行し、スクリプトの最後に追加します。

kill `ps -A -o -pid,cmd|grep "SCREEN -d -m -S myTunnel"| grep -v grep| head -n 1| awk '{print $1}'` # kills the opened screen
screen -wipe  # clears screens list (not allways usefull, depends on the commands ran by the screen)

今トンネルは閉鎖されました。

このソリューションはうまくいきますが(テストしたばかりです)、最先端の答えではありません。

ありがとうCheppnerの回答必要に応じて常に使用してください。

編集:より良い答えがあると確信しています。

関連情報