この投稿の説明に従って、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 sshsshトンネルプロセスの特定のプロセス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)、そのプロンプトはユーザーに表示されません。