バックグラウンドで実行されているSSHプロセスのPIDを取得します。

バックグラウンドで実行されているSSHプロセスのPIDを取得します。

だから私は2つのバックグラウンドSSHプロセスを呼び出したいと思います。

ssh -D localhost:8087 -fN aws-gateway-vpc1
ssh -D localhost:8088 -fN aws-gateway-vpc2

これらのゲートウェイではauthenticate_keysファイルを設定できないため、対話型パスワードの入力を求める必要があります。これが私が-fシェルの代わりにそのフラグを使用する理由&です。対話式に認証した後、プロセスはバックグラウンドに配置されます。

$!この場合、最新の[self]バックグラウンドプロセスのpidを取得するためにbash変数を使用できないようです。

後で中断した場合、正しいPIDを見つけるには他にどのようなオプションが必要ですか?

答え1

grepでpidを見つけるとエラーが発生する可能性があります。別のオプションはSSHControlPathオプションを使用することですControlMaster。これにより、ssh コマンドが制御ソケットでリッスンし、後続の ssh 呼び出しのコマンドを待機できるようになります。

この試み

ssh -D localhost:8087 -S /tmp/.ssh-aws-gateway-vpc1 -M -fN aws-gateway-vpc1
# (...)
# later, when you want to terminate ssh connection
ssh -S /tmp/.ssh-aws-gateway-vpc1 -O exit aws-gateway-vpc1

このexitコマンドを使用すると、PIDがわからない場合でもプロセスを終了できます。 PIDが本当に必要な場合は、次のcheckコマンドを使用して表示できます。

$ ssh -S /tmp/.ssh-aws-gateway-vpc1 -O check aws-gateway-vpc1
Master running (pid=1234)

答え2

おっしゃったように、現在は$!シェルの背景ではないので動作しません。実際、sshプロセスは起動したシェルの子プロセスでもありません。少なくとも私のArchシステムでは、PIDプロセスの子プロセスとして1実行されますinit

したがって、PIDを取得するには、次のようにしますps

$ ssh -f  localhost sleep 100
$ ps aux | grep '[s]sh.*-f'
terdon   20648  0.0  0.0  43308   680 ?        Ss   12:15   0:00 ssh -f localhost sleep 100

これはPIDが20648*であることを示します。

または、より簡単に以下を使用してくださいpgrep -f

$ pgrep -f 'ssh.*-f'
20648

そして(それらを)殺す:

pkill -f 'ssh.*-f'

*望むよりこれ[s]コマンドの内容を知りたい場合は、お問い合わせくださいgrep

答え3

50人の担当者がいないので回答する必要があります...sshに多重制御を追加する必要があるため、この例は完全ではありません。 Debian ではデフォルトでは有効になっていないため、ssh_config ファイルで有効にする必要があるか、「-o ControlMaster=yes」オプションを使用して起動する方が簡単です。この例を試してください。すべてのSSHで動作します。 example.orgで、ポート3306を介してポート3307のlocalhostに移動します。例では、-O checkコマンドにもポートオプションを提供する必要があるため、ポートオプションを追加しました。

ssh -p1234 -TqfN -L 3307:localhost:3306 [email protected] -o ControlMaster=yes -o ControlPath=/dev/shm/control:%h:%p:%r -S /dev/shm/control:%h:%p:%r

その後、確認、終了などを使用できます。このように

ssh -p1234 -o ControlPath=/dev/shm/control:%h:%p:%r -O check [email protected]

プライマリステーションが実行中です(pid = xxxx)。

関連情報