質問

を使用していプログラムのシナジーとともに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, します。

この後ご使用の場合---

だ確立のトンネルに使用する syngergycsyngergys 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 が戻るとすぐに閉じられます。 ソリューションには適切なエラー報告がありませんが。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top