私はこれについて混乱しています。マニュアルページから:
-f Requests ssh to go to background just before command execution.
次のコマンドを使用してSSHを開始すると、動作中の-f
トンネルが発生しました。しかし、仕事が終わったら、それ以上のやり取りをする方法がわかりません。例えば、SSHトンネルを閉じることができません。私が終わったら。
私が知っている一般的な方法は動作しません。たとえば、jobs
何も返されません。コマンド~
が認識されません(使用方法がわかりません)。
ただし、pgrep
SSHトンネルがまだ実行中であることを示すメッセージが表示されます(ターミナルを閉じた後でも)。どのようにやり取りしますか?どうやって消すの?
答え1
master mode
特に良いスクリプトソリューションは、制御コマンド用のソケットと一緒に使用することです。
ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>
もう一度閉じるには:
ssh -S <path-to-socket> -O exit <server>
これにより、プロセスIDのグリッピングや他の方法に関連する可能性があるタイミングの問題を回避できます。
答え2
ここで解決策を見つけました。http://www.g-loaded.eu/2006/11/24/auto- looking-ssh-tunnels/
最良の方法 - 自動的に閉じるトンネル
前述したように、-f -Nスイッチの組み合わせを使用する代わりに-fのみを使用できますが、リモートシステムでコマンドを実行することもできます。しかし、トンネルを初期化するだけでよいので、どのようなコマンドを実行する必要がありますか?
この時、睡眠は最も便利なコマンドになることができます!この特別なケースでは、睡眠には2つの利点があります。
- 何もしないので、リソースを消費しません。
- ユーザーは実行期間を指定できます。
これがSSHトンネルを自動的に閉じるのにどのように役立つかを以下に説明します。
10秒間リモートシステムでsleepコマンドを実行しながら、バックグラウンドでsshセッションを開始します。秒は重要ではありません。その間、以前のようにvncviewerを実行します。
[me@local]$ ssh -f -L 25901:127.0.0.1:5901 [email protected] sleep 10; \
vncviewer 127.0.0.1:25901:1
この場合、SSHクライアントにSSHセッションをバックグラウンドでフォーク(-f)し、トンネルを作成(-L 25901:127.0.0.1:5901)してから、リモートサーバーが10秒間sleepコマンドを実行するように指示します(sleep 10)。
この方法と以前の方法(-Nスイッチ)の違いは、基本的にこの場合、SSHクライアントの主な目的はトンネルを生成するのではなく、10秒間sleepコマンドを実行することです。トンネルを作ることは一種の副作用であり副次的な目標である。 vncviewerが存在しない場合、SSHクライアントはトンネルを破壊するため、何もすることがなくなり、10秒後に終了します。
sleepコマンドの実行中に他のプロセス(この場合はvncviewer)がトンネルを使用し始め、10秒以上トンネルを占有すると、SSHクライアントはリモート操作(スリープの実行)を完了してもトンネルを使用できません。 )。トンネル。他のプロセスがトンネルを占有していたため終了しました。つまり、SSHクライアントはvncviewerも終了する必要があるため、トンネルを破壊することはできません。 vncviewer がトンネルの使用を停止すると、SSH クライアントも目標を完了したため終了します。
これにより、バックグラウンドでSSHプロセスが実行されなくなります。
答え3
トンネルを終了するには、ps -C ssh
またはps | grep ssh
その他のバリエーションを使用してトンネルを実行しているSSHプロセスを確認してください。それから殺す。
または、このポートが開いているプロセスを確認してプロセスを見つけることもできます。
netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'
コンピュータで実行されているすべてのSSHクライアントを(あなたのユーザーとして)シャットダウンするには、pkill ssh
そうします。
答え4
トンネルを開始するとき:
ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
-f
コマンドが実行される前にSSHにバックグラウンドに入るように要求します。-N
リモートコマンドを実行しないでください。これはポート転送に役立ちます。-D
ローカルの「動的」アプリケーションレベルのポート転送を指定します。-l
リモートコンピュータにログインしたユーザーを指定します。
以下を使用してこの機能をオフにできます。
ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill