このSSHトンネルを閉じる方法は?[閉まっている]


96

この投稿の説明に従って、sshトンネルを開きました。Zend_Db:SSHトンネルを介してMySQLデータベースに接続するにはどうすればよいですか?

しかし、今、私は実際に何をしたのか分かりません。このコマンドはサーバー上の何かに影響しますか?また、ローカルmysqlを適切に使用できなくなったため、このトンネルを閉じる方法を教えてください。

私はOSX Lionを使用しており、サーバーはUbuntu 11.10で稼働しています。

回答:


241

あなたがこのコマンドを実行したと仮定します:ssh -f user@mysql-server.com -L 3306:mysql-server.com:3306 -Nリンクした投稿で説明されています。

コマンドの内訳:

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

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

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

  3. user@mysql-server.com:ログインするリモートサーバー。
  4. -L 3306:mysql-server.com:3306:これは興味深いビットです。-Lman 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

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

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

はい、ポート3306でlocalhostmysql-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サーバーを使用できます。


5
私がしばらく読んだ最良の説明。これは、Rなどのローカルにインストールされた環境からリモートデータベースにアクセスする場合に非常に役立ちます。公開/秘密鍵認証でうまく機能します。パスワードを渡す方法が見つからなかったため、パスワードは使用しません。
Matt Bannert 2013

完全な説明のため、この答えを最もよく受け入れる。
ジェイコブ

素敵な答え!ちなみに、-9は必要ありません。killプロセスがまだ正常に機能していることを考えると、;-)
Lucio Paiva '27

46

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

sudo killall ssh

「一致するプロセスは見つかりませんでした」と述べています。
ジェイコブ

あるようです。Mysqlも同様に正常に機能しましたが、Apacheは不平を言い始めました。私は再起動を行い、すべてが期待どおりに動作しました。問題は解決したと思います:)
Jacob

5
まあ、それが
本番

12
実行killall sshはかなり無謀なコマンドです。ps aux | grep sshsshトンネルプロセスの特定のプロセスIDを見つけるには、プロセスリストを検索する(つまり、上記の@simontで提案されているように)ことをお勧めします。次に、具体的にそれをpidを殺すことができます。
ベン

あなたが彼ら全員を殺したくないと思うチャンスは十分あります。
wobbily_col

22

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

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


12
を使用-fすると、sshバックグラウンドにプッシュするのとは異なり、ターミナルセッションが閉じている場合でもセッションを続行できます。pid使い方をつかむのps aux | grep ssh | grep <LOCAL-PORT>はかなり簡単です。
simont 2013

1
バックグラウンドジョブから返された明示的なpidを使用する@simontは、バックグラウンドの方法に関係なく、より安全です。あなたが実行している複数のsshプロセスを持っている場合、あなたは悪い時間持っているつもりだ
アーロン

を使用-fすると、必要に応じて、ローカルユーザーにログインパスワードを要求するという利点もあります。を使用する場合&、ユーザーがプロセスをフォアグラウンドに移動しない限り(たとえばを使用してfg)、そのプロンプトはユーザーに表示されません。
Bdoserror


3
最初に<LOCAL-PORT>がテキスト「ssh」を含むプロセスのpidで最初に発生したとき(別のsshまたはsshdプロセス、または名前に「ssh」が含まれるファイルの編集など)、これに気づくでしょうアプローチは、単純なシナリオでは便利ですが、
完全
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.