リモートサーバーへのトンネルを必要とするスクリプトがあります。このような:
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の回答必要に応じて常に使用してください。
編集:より良い答えがあると確信しています。