web-dev-qa-db-ja.com

このsshトンネルを閉じる方法は?

この投稿で説明されているように、sshトンネルを開きました。 Zend_Db:SSHトンネル経由でMySQLデータベースに接続する方法?

しかし、今私は実際に何をしたのかわかりません。このコマンドはサーバー上の何かに影響しますか?そして、ローカルmysqlを適切に使用できないため、このトンネルをどのように閉じますか。

OSX Lionを使用しており、サーバーはUbuntu 11.10で実行されています。

80
Jacob

次のコマンドを実行したと仮定します:リンクした投稿で説明されているssh -f [email protected] -L 3306:mysql-server.com:3306 -N

コマンドの内訳:

  1. ssh:それはかなり自明です。 sshを呼び出します。
  2. -f:(man sshページから)

    コマンド実行の直前にバックグラウンドに移動するようにsshに要求します。これは、sshがパスワードまたはパスフレーズを要求するが、ユーザーがバックグラウンドでそれを望む場合に便利です。

    基本的に、接続を確立するためのパスワードを入力したら、sshをバックグラウンドに送信します。 remote-Hostにログインするのではなく、localhostでシェルプロンプトが表示されます。

  3. [email protected]:ログインするリモートサーバー。
  4. -L 3306:mysql-server.com:3306:これは興味深いビットです。 -Lman sshページから):

    [bind_address:] port:Host:hostportローカル(クライアント)ホスト上の指定されたポートがリモート側の指定されたホストとポートに転送されることを指定します。

    したがって、-L 3306:mysql-server.com:3306localポート3306リモートポートにバインドします3306mysql-server.com

    localポート3306に接続すると、接続はセキュアチャネルを介してmysql-server.comに転送されます。 リモートホストmysql-server.comはポートmysql-server.com3306に接続します。

  5. -N:コマンドを実行しません。これは「ポートを転送するだけ」の場合に便利です(マニュアルページを引用)。

このコマンドはサーバー上の何かに影響しますか?

はい、localhostmysql-server.comの間に接続を確立しますポート3306

そして、どうすればこのトンネルを閉じますか...

-fを使用している場合、バックグラウンドでヘッドを開いたsshプロセスに気付くでしょう。それを閉じるより良い方法は、ps aux | grep 3306を実行し、ssh -f ... -L 3306:mysql-server.com:3306 -Npidkill <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関数をポート33060localhostにポイントすると、ポートmysql-server.com3306に接続します。ポート3306localhostに接続できることは明らかなので、ローカルmysqlサーバーを引き続き使用できます。

214
simont

これにより、ターミナルから開いているすべてのsshセッションが強制終了されます。

Sudo killall ssh
39
thenetimp

注:コメントはコードブロックをサポートしないため、回答として追加します。

私の意見では、-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

18
aaron