だから私は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)。