すべての現在のトンネルで特定のSSHトンネルを効率的に探しますか?

すべての現在のトンネルで特定のSSHトンネルを効率的に探しますか?

ポート22でOpenSSHを使用してログインし、ポート3306と80度トンネルしているとします。

ポート80は、3つのポート(22、3306、80)の両方でトンネリングされる最後のポートです。

$ sudo ssh UWU@IP -L 80:localhost:80

ポート80トンネルプロセスのみを終了する方法は?

私は最善の方法は、どのような方法でポート80トンネルを自動ターゲットにすることだと思います。もう一つの方法は、3つのトンネルのうち最後のトンネルを目指すことです。

私がこれを尋ねる理由は次のとおりです。

ps aux | grep sshプロセスを見つけて具体的に終了できますが、自動的には実行されません。

答え1

問題のあるプロセスのPIDを見つけるには、構文を使用することをお勧めします$!

ステージ1:プロセスを開始しますが、今回は任意のPID値を保持する変数を使用します。

sudo ssh blah@blah 80:localhost:80 & arbpid=$!

2番目のステップ:トンネルを作成するときにのみ変数を保存する場合は、arbpidそれを使用してスクリプトの最後でプロセスを終了できます。

kill $arbpid

つまり、ここで行うことは、SSHトンネルに任意のタグ(変数とその値)をタグ付けすることです。その後、それを終了ターゲットとして指定します。


コマンドと変数の間に & 記号があります。 Unixコマンドの後の単一のアンパサンドと同様に、これはアンパサンドの前のコマンドが別のサブプロセス(バックグラウンド)で実行されるのに対し、2番目のコマンド(この場合は変数の生成)は現在のプロセス(フォアグラウンド)で実行されます。仕事。

答え2

コマンドラインで一意の文字列がわかっている場合は、次のものを使用できますpkill

pkill -f "80:localhost:80"

この-fフラグをpkill使用すると、コマンドライン全体が検索されます。フラグがない場合は、単に引数を無視し、プロセス名に基づいて一致を削除します。

答え3

トンネルを提供するプロセスはポート 80 でリッスンするプロセスなので、またはlsofまたはnetstatを使用してss検索します。

lsof -n -i TCP:80 -sTCP:LISTEN -Fp |sed 's/^p//'
netstat -ntlp | awk '$4 ~ /:80$/ {sub(/\/.*/, "", $7); print $7}'
ss -nlpt 'sport = :80' | awk 'NR>1 {split($6, a, ","); print a[2]}'

接続多重化を使用すると、同じプロセスによって提供されるすべての接続が終了します。多重化を使用している場合は、制御コマンドを使用して基本プロセスに転送を停止するように指示できますcancel

ssh UWU@IP -S … -O cancel -L 80:localhost:80

答え4

これにより、最後のSSHトンネルプロセスを終了できます。

kill $(history | grep ssh | tail -n 2 | head -n 1| cut -d' ' -f 2)

関連情報