Bagaimana cara menutup terowongan ssh ini? [Tutup]

101

Saya membuka terowongan ssh seperti yang dijelaskan dalam posting ini: Zend_Db: Bagaimana cara menyambung ke database MySQL melalui terowongan SSH?

Tapi sekarang saya tidak tahu apa yang sebenarnya saya lakukan. Apakah perintah ini memengaruhi apa pun di server? Dan bagaimana cara menutup terowongan ini, karena sekarang saya tidak dapat menggunakan mysql lokal saya dengan benar.

Saya menggunakan OSX Lion dan server berjalan di Ubuntu 11.10.

Yakub
sumber

Jawaban:

244

Dengan asumsi Anda menjalankan perintah ini: ssh -f [email protected] -L 3306:mysql-server.com:3306 -Nseperti yang dijelaskan dalam posting yang Anda tautkan.

Rincian perintah:

  1. ssh: itu cukup jelas. Memanggil ssh.
  2. -f: (Dari man sshhalaman)

    Meminta ssh untuk pergi ke latar belakang sebelum eksekusi perintah. Ini berguna jika ssh akan meminta kata sandi atau kata sandi, tetapi pengguna menginginkannya di latar belakang.

    Pada dasarnya, kirim sshke latar belakang setelah Anda memasukkan kata sandi apa pun untuk membuat koneksi; itu memberi shell prompt kembali kepada Anda localhostdaripada memasukkan Anda ke remote-host.

  3. [email protected]: server jarak jauh yang ingin Anda masuki.
  4. -L 3306:mysql-server.com:3306: Ini bagian yang menarik. -L(dari man sshhalaman):

    [bind_address:] port: host: hostport Menentukan bahwa port yang diberikan pada host lokal (klien) akan diteruskan ke host dan port yang diberikan di sisi jarak jauh.

    Jadi -L 3306:mysql-server.com:3306ikat port lokal3306 ke port jarak jauh 3306 di host mysql-server.com.

    Saat Anda terhubung ke port lokal3306 , koneksi diteruskan melalui saluran aman ke mysql-server.com. The remote host , mysql-server.comkemudian menghubungkan ke mysql-server.comport 3306.

  5. -N: jangan menjalankan perintah. Ini berguna untuk "hanya meneruskan port" (mengutip halaman manual).

Apakah perintah ini memengaruhi apa pun di server?

Ya, ini membuat koneksi antara localhost dan mysql-server.com di port 3306 .

Dan bagaimana cara menutup terowongan ini ...

Jika Anda pernah menggunakannya -f, Anda akan melihat bahwa sshproses yang Anda buka mengarah ke latar belakang. Metode yang lebih baik untuk menutupnya adalah dengan menjalankan ps aux | grep 3306, menemukan piddari ssh -f ... -L 3306:mysql-server.com:3306 -N, dan kill <pid>. (Atau mungkin kill -9 <pid>; Saya lupa jika hanya killberfungsi). Itu memiliki manfaat yang indah karena tidak membunuh semua sshkoneksi Anda yang lain ; jika Anda memiliki lebih dari satu, membangunnya kembali bisa jadi sedikit ... menyakitkan.

... karena sekarang saya tidak dapat menggunakan mysql lokal saya dengan benar.

Ini karena Anda telah secara efektif "menangkap" proses lokal mysql dan meneruskan lalu lintas apa pun yang mencoba menyambung ke sana, ke proses jarak jauh mysql . Solusi yang jauh lebih baik adalah dengan tidak menggunakan port lokal 3306 di port-forward. Gunakan sesuatu yang tidak digunakan, seperti 33060. (Angka yang lebih tinggi biasanya lebih jarang digunakan; cukup umum untuk mem-port-forward kombinasi seperti ini: "2525-> 25", "8080-> 80", "33060-> 3306" atau serupa. Membuat mengingat sedikit lebih mudah).

Jadi, jika Anda menggunakan ssh -f [email protected] -L 33060:mysql-server.com:3306 -N, Anda kemudian akan mengarahkan fungsi Zend connect-to-mysql Anda ke localhostport 33060, yang akan terhubung ke mysql-server.comport 3306. Anda jelas masih dapat terhubung ke localhostport 3306, jadi Anda masih dapat menggunakan mysqlserver lokal .

simont
sumber
5
Penjelasan terbaik saya baca beberapa saat. Ini sangat berguna saat mengakses database jarak jauh dari lingkungan yang diinstal secara lokal seperti R misalnya. Bekerja dengan baik dengan otentikasi kunci publik / pribadi. Bukan dengan kata sandi karena saya tidak menemukan cara untuk memasukkan kata sandi.
Matt Bannert
Menerima jawaban ini sebaik mungkin karena penjelasan yang lengkap.
Jacob
Jawaban bagus! Ngomong-ngomong, -9tidak diperlukan kill, mengingat prosesnya masih berfungsi dengan baik ;-)
Lucio Paiva
47

Ini akan menghentikan semua sesi ssh yang telah Anda buka dari terminal.

sudo killall ssh
laluimp
sumber
'Tidak ada proses yang cocok yang ditemukan' katanya.
Yakub
Sepertinya begitu. Mysql bekerja dengan baik juga, tapi kemudian Apache mulai mengeluh. Saya melakukan reboot dan semuanya bekerja seperti yang diharapkan. Masalah terselesaikan kurasa :)
Jacob
5
Anda tidak ingin melakukan ini jika ini adalah lingkungan yang sulit ... Anda akan menendang semua admin lain
texasbruce
12
Menjalankan killall sshadalah perintah yang agak sembrono. Saya menyarankan mencari daftar proses Anda (yaitu ps aux | grep sshseperti yang disarankan oleh @simont di atas) untuk menemukan id proses spesifik dari proses terowongan ssh Anda. Kemudian Anda dapat mematikan pid itu secara khusus.
Ben
Ada kemungkinan besar Anda tidak ingin mereka semua terbunuh.
wobbily_col
23

Catatan: menambahkan sebagai jawaban karena komentar tidak mendukung blok kode.

Menurut pendapat saya lebih baik TIDAK menggunakan -fdan sebagai gantinya hanya latar proses seperti biasa &. Itu akan memberi Anda pid tepat yang perlu Anda bunuh:

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

Atau lebih baik lagi, buat saja ini sebagai skrip pembungkus:

# 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

aaron
sumber
12
Menggunakan -fmemungkinkan sshsesi untuk melanjutkan bahkan ketika sesi terminal ditutup, tidak seperti mendorong ke latar belakang. Meraih pidpenggunaannya ps aux | grep ssh | grep <LOCAL-PORT>cukup sepele.
simont
1
@simont yang menggunakan pid eksplisit yang dikembalikan dari pekerjaan latar belakang lebih aman, terlepas dari bagaimana Anda melatarbelakanginya. jika Anda memiliki lebih dari satu proses ssh yang sedang berjalan, Anda akan mengalami waktu yang buruk
aaron
Menggunakan -fjuga memiliki keuntungan untuk meminta pengguna lokal memasukkan kata sandi login, jika diperlukan. Jika Anda menggunakan &, prompt itu tidak terlihat oleh pengguna kecuali mereka membawa proses ke latar depan (misalnya dengan menggunakan fg).
Bdoserror
4
pertama kali <LOCAL-PORT> Anda muncul di pid dari proses yang juga berisi teks 'ssh' (seperti proses ssh atau sshd lain atau mengedit file dengan 'ssh' di namanya) Anda akan menyadari bahwa ini pendekatan, sementara nyaman dalam skenario sederhana, tidak antipeluru
aaron