シェルスクリプトの一部としてバックグラウンドでトンネルを実行する方法

シェルスクリプトの一部としてバックグラウンドでトンネルを実行する方法

私はこれらを実行します2つのコマンド常に、ファイアウォールの背後で保護されている AWS 上の RDS インスタンスに接続します (そのため、EC2 インスタンスをトンネルします)。次のようにします。

コマンド 1: トンネルを開く (バックグラウンドで実行)

ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &

コマンド 2: トンネル ポート経由で DB に接続します。

PGPASSWORD=password psql dbname -U user -h ip_address -p port;

これは素晴らしいことですが、私はこれら両方を 1 つの関数にまとめたいのですが、私の環境では何も機能しませんでした。

試行 1: バックグラウンド処理なしで実行:

function db()
{
    ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub &
    PGPASSWORD=password psql dbname -U user -h ip_address -p port;
}

単純にこう言っています:

$proddb
[1] 62924
psql: could not connect to server: Connection refused
    Is the server running on host "127.0.0.1" and accepting
    TCP/IP connections on port 6666?

最初のコマンドはバックグラウンドで実行されていますが、

ps aux | grep host
(standard input):435:abdullah         62924   0.0  0.0  4315660   5828 s006  S     3:06PM   0:00.03 ssh -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

そして、その直後に次のコマンドを実行すると、DB に正常に接続されます。

PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>

これを機能させるにはどうすればよいですか?

答え1

2 番目のコマンドが実行されたときに、最初のコマンドではトンネルを確立する時間がなかったため、「接続が拒否されました」というメッセージが表示されます。

使用せず&に代わりにオプションを使用してください-f:

-f は、
コマンド実行の直前に ssh をバックグラウンドに移動するように要求します。これは、ssh がパスワードまたはパスフレーズを要求するが、ユーザーがそれをバックグラウンドで実行したい場合に便利です。これは -n を意味します。リモート サイトで X11 プログラムを起動する推奨方法は、ssh -f host xterm などを使用することです。ExitOnForwardFailure
構成オプションが「yes」に設定されている場合、-f で起動されたクライアントは、すべてのリモート ポート転送が正常に確立されるまで待機してから、バックグラウンドに移動します。

これらをすべてまとめると、関数内の ssh 行を次のように置き換えます。

ssh -o ExitOnForwardFailure=yes -f -N -L port:host:5432 user@$ip -i ~/.ssh/key.pub

そうすれば、関数を複数回実行しても、(複数-1) の無駄な ssh が実行されたままにはなりません。

短いリモート スリープ コマンドに置き換えることもできます-N。そうすれば、強制終了する必要がある場合に検索しなければならない、長時間アイドル状態の ssh コマンドは発生しません。ssh はトンネルの使用が終了するまで待機するため、短い遅延は問題になりません。

ssh -o ExitOnForwardFailure=yes -f -L port:host:5432 user@$ip -i ~/.ssh/key.pub sleep 15

答え2

@AB によるこのソリューションは、バックエンド ホストへの SSH ポート転送トンネルを使用して、dmz (インターネットまたはエッジ エンドポイント) と mz (バックエンド) の間に「ジャンプ サーバー」を作成するためにも使用できます。次に例を示します。

(すべてのポートは、firewall-cmd を使用して開く必要があります)

desthost_ip はアクセスされるサービスのターゲット IP であり、それにバインドされた応答プロセス (tomcat、webapp など) が必要です。

DMZ エッジ:

ssh -o ExitOnForwardFailure=yes -f -L localhost_ip:port:desthost_ip:port user@dest_ip -i xyz.key sleep 15

したがって、localhost にもパブリック IP があり、desthost で https ベースのサービスが実行されていると仮定すると、次のようなものが機能します。

https://public_ip_of_localhost:port

これにより、desthost_ip:port サービスの Web ページが表示されます。

ssh -o ExitOnForwardFailure=yes -f -L 192.168.1.199:8001:192.168.2.10:8081 [email protected] -i xyz.key sleep 15

そして

https://192.168.1.199:8001 

または

https://public_ip_for_192.168.1.199:8001

のサービスページが表示されます192.168.2.10:8081

関連情報