この投稿で説明されているように、sshトンネルを開きました。 Zend_Db:SSHトンネル経由でMySQLデータベースに接続する方法?
しかし、今私は実際に何をしたのかわかりません。このコマンドはサーバー上の何かに影響しますか?そして、ローカルmysqlを適切に使用できないため、このトンネルをどのように閉じますか。
OSX Lionを使用しており、サーバーはUbuntu 11.10で実行されています。
次のコマンドを実行したと仮定します:リンクした投稿で説明されているssh -f [email protected] -L 3306:mysql-server.com:3306 -N
。
コマンドの内訳:
ssh
:それはかなり自明です。 ssh
を呼び出します。-f
:(man ssh
ページから)
コマンド実行の直前にバックグラウンドに移動するようにsshに要求します。これは、sshがパスワードまたはパスフレーズを要求するが、ユーザーがバックグラウンドでそれを望む場合に便利です。
基本的に、接続を確立するためのパスワードを入力したら、ssh
をバックグラウンドに送信します。 remote-Host
にログインするのではなく、localhost
でシェルプロンプトが表示されます。
[email protected]
:ログインするリモートサーバー。-L 3306:mysql-server.com:3306
:これは興味深いビットです。 -L
(man ssh
ページから):
[bind_address:] port:Host:hostportローカル(クライアント)ホスト上の指定されたポートがリモート側の指定されたホストとポートに転送されることを指定します。
したがって、-L 3306:mysql-server.com:3306
はlocalポート3306
をリモートポートにバインドします3306
mysql-server.com
。
localポート3306
に接続すると、接続はセキュアチャネルを介してmysql-server.com
に転送されます。 リモートホスト、mysql-server.com
はポートmysql-server.com
で3306
に接続します。
-N
:コマンドを実行しません。これは「ポートを転送するだけ」の場合に便利です(マニュアルページを引用)。
このコマンドはサーバー上の何かに影響しますか?
はい、localhostとmysql-server.comの間に接続を確立しますポート3306。
そして、どうすればこのトンネルを閉じますか...
-f
を使用している場合、バックグラウンドでヘッドを開いたssh
プロセスに気付くでしょう。それを閉じるより良い方法は、ps aux | grep 3306
を実行し、ssh -f ... -L 3306:mysql-server.com:3306 -N
のpid
とkill <pid>
を見つけることです。 (または、おそらくkill -9 <pid>
; kill
だけが機能するかどうか忘れます)。これには、他のすべてのssh
接続を削除するnotというすばらしい利点があります。 1つ以上持っている場合、それらを再確立することはわずかな...苦痛である場合もあります。
...ローカルmysqlを適切に使用できないためです。
これは、localmysql
プロセスを効果的に「キャプチャ」し、それに接続しようとするトラフィックを転送して、 remotemysql
プロセス。 はるかに良いソリューションは、ポートフォワードでローカルポート3306を使用しないになります。 33060など、使用されていないものを使用します(一般に、数値が大きいほど使用されません。「2525-> 25」、「8080-> 80」、「33060-> 3306」などの組み合わせをポートフォワードすることは非常に一般的です。似ています。少し覚えやすくなります)。
したがって、ssh -f [email protected] -L 33060:mysql-server.com:3306 -N
を使用した場合、Zendのconnect-to-mysql関数をポート33060
のlocalhost
にポイントすると、ポートmysql-server.com
の3306
に接続します。ポート3306
でlocalhost
に接続できることは明らかなので、ローカルmysql
サーバーを引き続き使用できます。
これにより、ターミナルから開いているすべてのsshセッションが強制終了されます。
Sudo killall ssh
注:コメントはコードブロックをサポートしないため、回答として追加します。
私の意見では、-f
を使用せず、代わりに&
を使用して通常どおりプロセスをバックグラウンドすることをお勧めします。それはあなたが殺す必要があるexact pidを与えるでしょう:
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
... do yer stuff... launch mysql workbench whatever
echo "killing ssh tunnel $pid"
kill $pid
それとも、これをラッパースクリプトとして作成するだけです。
# backend-tunnel <your cmd line, possibly 'bash'>
ssh -N -L1234:other:1234 server &
pid=$!
echo "waiting a few seconds to establish tunnel..."
sleep 5
"$@"
echo "killing ssh tunnel $pid"
kill $pid
backend-tunnel mysql-workbench
backend-tunnel bash