この投稿の説明に従って、sshトンネルを開きました。Zend_Db:SSHトンネルを介してMySQLデータベースに接続するにはどうすればよいですか?
しかし、今、私は実際に何をしたのか分かりません。このコマンドはサーバー上の何かに影響しますか?また、ローカルmysqlを適切に使用できなくなったため、このトンネルを閉じる方法を教えてください。
私はOSX Lionを使用しており、サーバーはUbuntu 11.10で稼働しています。
この投稿の説明に従って、sshトンネルを開きました。Zend_Db:SSHトンネルを介してMySQLデータベースに接続するにはどうすればよいですか?
しかし、今、私は実際に何をしたのか分かりません。このコマンドはサーバー上の何かに影響しますか?また、ローカルmysqlを適切に使用できなくなったため、このトンネルを閉じる方法を教えてください。
私はOSX Lionを使用しており、サーバーはUbuntu 11.10で稼働しています。
回答:
あなたがこのコマンドを実行したと仮定します:ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -N
リンクした投稿で説明されています。
コマンドの内訳:
ssh
:それはかなり自明です。を呼び出しssh
ます。-f
:(man ssh
ページから)
コマンドの実行直前にバックグラウンドに移動するようにsshに要求します。これは、sshがパスワードまたはパスフレーズを要求するが、ユーザーがバックグラウンドでそれを望んでいる場合に役立ちます。
基本的に、ssh
接続を確立するためにパスワードを入力したら、バックグラウンドに送信します。にlocalhost
ログインするのではなく、シェルプロンプトをに戻しますremote-host
。
user@mysql-server.com
:ログインするリモートサーバー。 -L 3306:mysql-server.com:3306
:これは興味深いビットです。-L
(man ssh
ページから):
[bind_address:] port:host:hostportローカル(クライアント)ホスト上の特定のポートを、リモート側の特定のホストとポートに転送することを指定します。
したがって-L 3306:mysql-server.com:3306
、ローカルポート3306
をホストのリモートポート 3306
にバインドしますmysql-server.com
。
ローカルポート3306
に接続すると、接続はセキュアチャネルを介してに転送されmysql-server.com
ます。リモートホストは、mysql-server.com
その後に接続するmysql-server.com
ポートで3306
。
-N
:コマンドを実行しません。これは、「ポートを転送するだけ」(manページを引用)の場合に便利です。
このコマンドはサーバー上の何かに影響しますか?
はい、ポート3306でlocalhostとmysql-server.com間の接続を確立します。
そして、どうやってこのトンネルを閉じるか...
を使用-f
したssh
ことがある場合は、開いたプロセスがバックグラウンドになっていることがわかります。それが実行されるクローズのよりよい方法はps aux | grep 3306
、見つけるpid
のをssh -f ... -L 3306:mysql-server.com:3306 -N
、とkill <pid>
。(または多分kill -9 <pid>
;うまくいくかどうかは忘れkill
ます)。これには、他のすべての接続を殺さないというすばらしい利点がありますssh
。複数ある場合、それらを再確立することは少し苦痛になる可能性があります。
...ローカルmysqlを適切に使用できないためです。
これは、ローカル mysql
プロセスを効果的に「キャプチャ」し、それに接続しようとするすべてのトラフィックをリモート mysql
プロセスに転送したためです。非常に良くするソリューションをすることであろうローカルポート3306を使用していないポートフォワードで。33060など、使用されていないものを使用します(通常、数値が大きいほど使用頻度は低くなります。「2525-> 25」、「8080-> 80」、「33060-> 3306」などの組み合わせをポート転送することはかなり一般的です。似ています。覚えやすくなります)。
したがって、を使用ssh -f user@mysql-server.com -L 33060:mysql-server.com:3306 -N
した場合は、Zendのconnect-to-mysql関数をlocalhost
ポート33060
でポイントし、ポートで接続mysql-server.com
します3306
。明らかlocalhost
にポート3306
に接続できるため、ローカルmysql
サーバーを使用できます。
-9
は必要ありません。kill
プロセスがまだ正常に機能していることを考えると、;-)
これにより、ターミナルから開いているすべてのsshセッションが強制終了されます。
sudo killall ssh
killall ssh
はかなり無謀なコマンドです。ps aux | grep ssh
sshトンネルプロセスの特定のプロセスIDを見つけるには、プロセスリストを検索する(つまり、上記の@simontで提案されているように)ことをお勧めします。次に、具体的にそれをpidを殺すことができます。
注:コメントはコードブロックをサポートしていないため、回答として追加します。
私の意見では、使用-f
せず、代わりに通常のプロセスをでバックグラウンドで使用する方が良い&
です。それはあなたがあなたが殺す必要がある正確な 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
-f
すると、ssh
バックグラウンドにプッシュするのとは異なり、ターミナルセッションが閉じている場合でもセッションを続行できます。pid
使い方をつかむのps aux | grep ssh | grep <LOCAL-PORT>
はかなり簡単です。
-f
すると、必要に応じて、ローカルユーザーにログインパスワードを要求するという利点もあります。を使用する場合&
、ユーザーがプロセスをフォアグラウンドに移動しない限り(たとえばを使用してfg
)、そのプロンプトはユーザーに表示されません。