どういうとbackgrounded/一戸建てのsshョンをクリックします。
-
10-07-2019 - |
質問
を使用していプログラムのシナジーとともにsshトンネル
で作って公開コンソール、タイプこの二つのコマンド:
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost
イlazyを作ってみましBash-スクリプトが運営する一mouseclickアイコン:
#!/bin/bash
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
synergyc localhost
のBash-スクリプト上での作品も、今までいきたいと思い殺しにおけるシナジー効果が生まれ、sshトンネル経由の一mouseclickのの、これまでに他のシナジー効果およびsshへのファイルを殺しました。
#!/bin/bash
mkdir -p /tmp/synergyPIDs || exit 1
rm -f /tmp/synergyPIDs/ssh || exit 1
rm -f /tmp/synergyPIDs/synergy || exit 1
[ ! -e /tmp/synergyPIDs/ssh ] || exit 1
[ ! -e /tmp/synergyPIDs/synergy ] || exit 1
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@OtherHost
echo $! > /tmp/synergyPIDs/ssh
synergyc localhost
echo $! > /tmp/synergyPIDs/synergy
そのファイルのこのスクリプトは空です。
どのようにして求めるのですか他のsshシナジー?
いしないようにして ps aux | grep ... | awk ... | sed ...
組み合わせが容易です。)
解決 5
&を追加したくないコマンドの最後に、コンソールのwintowが閉じられた場合に接続が切断されるため... ps-grep-awk-sed-comboになりました
ssh -f -N -L localhost:12345:otherHost:12345 otherUser@otherHost
echo `ps aux | grep -F 'ssh -f -N -L localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/ssh
synergyc localhost
echo `ps aux | grep -F 'synergyc localhost' | grep -v -F 'grep' | awk '{ print $2 }'` > /tmp/synergyPIDs/synergy
(grepをawkに統合できますが、今は怠けすぎです)
他のヒント
クイックサマリー:機能しません。
最初のアイデアは、 $!
でPIDを取得するには、バックグラウンドでプロセスを開始する必要があるということです。
次のようなパターン
some_program &
some_pid=$!
wait $some_pid
必要なことを行うかもしれません...ただし、sshがフォアグラウンドでパスフレーズを要求することはありません。
それでは、結局別の何かが必要になるかもしれません。 ssh -f
はおそらく、シェルがそれを呼び出してもわからない新しいプロセスを生成します。理想的には、ssh自体がPIDをファイルに書き込む方法を提供します。
すべての人を尊重して、ユーザーの pgrep
, pkill
, ps | awk
, などがあり 多く ております。
この場合に依存 ps -aux | grep ...
見プロセスを実行するリスクの衝突.というの利用場合は、原則として、なにがかかるものと思われます。
SSHのためのメカニズムを提供し管理の背景-プロセス。ではこのように多くのSSHもので、"先進"の特徴は、多くの人にとってのその他の回答はこちら)わからないのが存在します。
自分の利用の場合、ワークステーションでホームに任せたいトンネル接続するHTTPプロキシの内部ネットワークで私のオフィスは、別のことからもアクセスの管理インタフェースに位置します。ここからは作成の基本的なトンネル開始からホーム:
$ ssh -fNT -L8888:proxyhost:8888 -R22222:localhost:22 officefirewall
$ ssh -fNT -L4431:www1:443 -L4432:www2:443 colocatedserver
を引き起こす原因となりsshを背景そのものは、トンネルオープン。ただし、トンネルをくださる場合をしたいと考えていまとめ解析に私のプロセス一覧表示、ホームんに"右"からsshの場合私は偶然に発売となるようにしてください。に見える。
その代わり、したい場合は複数の接続、SSHの ControlMaster
configオプションの -O
コマンドラインオプションです。例えば、以下の私の ~/.ssh/config
ファイル
host officefirewall colocatedserver
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
sshコマンドが実行されず、spoorに ~/.ssh/cm_sockets/
るのを提供することができアクセスコントロールに関しては、例えば:
$ ssh -O check officefirewall
Master running (pid=23980)
$ ssh -O exit officefirewall
Exit request sent.
$ ssh -O check officefirewall
Control socket connect(/home/ghoti/.ssh/cm_socket/ghoti@192.0.2.5:22): No such file or directory
この点、トンネル(制御SSHセッション)が消えている必要はなく、利用ハンマー(kill
, killall
, pkill
, します。
この後ご使用の場合---
だ確立のトンネルに使用する syngergyc
話 syngergys
TCPポート12345.のために、どうしたらいいでしょうかいいものは下記のようになっています。
エントリを追加へ ~/.ssh/config
ファイル:
Host otherHosttunnel
HostName otherHost
User otherUser
LocalForward 12345 otherHost:12345
RequestTTY no
ExitOnForwardFailure yes
ControlMaster auto
ControlPath ~/.ssh/cm_sockets/%r@%h:%p
このコマンドライン -L
オプションの取り扱いに LocalForward
キーワードの制御{マスター、パ}ラインが含まれもって確認してください管理の後にトンネルを確立する。
その後、変更bashスクリプトのようなこと:
#!/bin/bash
if ! ssh -f -N otherHosttunnel; then
echo "ERROR: couldn't start tunnel." >&2
exit 1
else
synergyc localhost
ssh -O exit otherHosttunnel
fi
の -f
オプションの背景のトンネル、ソケットのごControlPathのトンネルです。場合にはssh失敗するかによりネットワークエラーや ExitOnForwardFailure
あな口をトンネルがなかった場合は失敗し(else
),synergyc開始し、トンネルが閉じた後で終了します。
だいどうして職探しをしているかどうかは、SSHのオプション LocalCommand
使用できる開始 synergyc
右から内でssh configファイルです。
このスレッドに出くわして、「pidof」に言及したかっただけです。 linuxユーティリティ:
$ pidof init
1
lsofを使用して、localhostのポート12345をリッスンしているプロセスのpidを表示できます。
lsof -t -i @localhost:12345 -sTCP:listen
例:
PID=$(lsof -t -i @localhost:12345 -sTCP:listen)
lsof -t -i @localhost:12345 -sTCP:listen >/dev/null && echo "Port in use"
-f
をドロップすると、バックグラウンドで実行され、 eval
で実行して、自分でバックグラウンドに強制できます。
その後、 pid
を取得できます。 eval
ステートメント内に&
を必ず配置してください。
eval "ssh -N -L localhost:12345:otherHost:12345 otherUser@OtherHost & "
tunnelpid=$!
これは、synergyc(およびそれ自体をデーモン化しようとする他のほとんどのプログラム)の特殊なケースです。 $を使用して!ただし、synergycは実行中にclone()syscallを実行し、bashが持っていると考えていたもの以外の新しいPIDを提供します。これを回避して$!を使用できるようにする場合は、synergycにフォアグラウンドに留まってからバックグラウンドにするように指示できます。
synergyc -f -n mydesktop remoteip &
synergypid=$!
synergycは、自動再起動など、管理しようとしている場合はオフにすることもできる他のいくつかのことを行います。
別のオプションは、pgrepを使用して最新のsshプロセスのPIDを見つけることです
ssh -fNTL 8073:localhost:873 otherUser@OtherHost
tunnelPID=$(pgrep -n -x ssh)
synergyc localhost
kill -HUP $tunnelPID
次の行を使用して、ローカルポートにバインドされているsshプロセスを確認できます。
netstat -tpln | grep 127\.0\.0\.1:12345 | awk '{print $7}' | sed 's#/.*##'
localhostのポート12345 / TCPを使用して、プロセスのPIDを返します。そのため、 ps
からのすべての ssh
の結果をフィルタリングする必要はありません。
チェックする必要がある場合、そのポートがバインドされている場合は 、使用します:
netstat -tln | grep 127\.0\.0\.1:12345 >/dev/null 2>&1
バインドされていない場合は 1
を返し、誰かがこのポートをリッスンしている場合は 0
を返します。
@ghotiの非常に良い答えに基づいて、追加の構成を必要とせずに SSH制御ソケットを利用する(テスト用の)より単純なスクリプトを次に示します。
#!/bin/bash
if ssh -fN -MS /tmp/mysocket -L localhost:12345:otherHost:12345 otherUser@otherHost; then
synergyc localhost
ssh -S /tmp/mysocket -O exit otherHost
fi
synergyc
は、トンネルが正常に確立された場合にのみ開始され、トンネル自体は synergyc
が戻るとすぐに閉じられます。
ソリューションには適切なエラー報告がありませんが。