私はこれらの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
そして、その直後に次のコマンドを実行すると、データベースに正常に接続できます。
PGPASSWORD=password psql dbname -U user -h ip_address -p port;
user=>
どうすればこれを機能させることができますか?
最初のコマンドは、2番目のコマンドが実行されたときにトンネルを確立する時間がなかったため、「接続が拒否されました」というメッセージが表示されました。
使用せず&
、代わりにオプションを使用してください-f
:
-f
コマンド実行の直前にバックグラウンドに移動するようにsshに要求します。これは、sshがパスワードまたはパスフレーズを要求するが、ユーザーがバックグラウンドでそれを望んでいる場合に役立ちます。これは-nを意味します。リモートサイトでX11プログラムを起動するための推奨される方法は、ssh -f hostxtermのようなものを使用することです。
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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加