Cara membunuh sesi SSH yang dimulai dengan opsi -f (dijalankan di latar belakang)

50

Saya sangat bingung dengan hal ini. Dari halaman manual:

 -f      Requests ssh to go to background just before command execution.

Setelah memulai SSH dengan -fopsi, saya memiliki terowongan yang berfungsi. Tetapi setelah saya selesai menggunakannya saya tidak tahu bagaimana berinteraksi lebih jauh dengannya. Misalnya, saya tidak bisa menutup terowongan SSH ketika saya selesai dengan itu.

Metode biasa yang saya tahu tidak berfungsi. Misalnya, jobstidak mengembalikan apa pun. The ~perintah tidak diakui (dan saya tidak tahu persis bagaimana menggunakannya, anyway).

Namun, pgrepberi tahu saya bahwa terowongan SSH masih berjalan (setelah saya menutup terminal, dll.). Bagaimana saya berinteraksi dengannya? Bagaimana saya menutupnya?

MountainX
sumber

Jawaban:

65

Solusi yang sangat bagus untuk scripting adalah menggunakan master mode, dengan soket untuk perintah kontrol:

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

Untuk menutupnya lagi:

ssh -S <path-to-socket> -O exit <server>

Ini menghindari baik untuk menangkap id proses dan masalah waktu yang mungkin terkait dengan pendekatan lain.

Brian H
sumber
10
Hanya untuk memperluas sedikit untuk yang belum tahu, <path-to-socket> adalah path ke file yang dibuat oleh master instance dari klien ssh untuk komunikasi antar-proses dengan instance klien ssh lain yang ingin berbagi koneksi instance master. File yang dibuat sebenarnya akan mewakili soket domain unix. Ini dapat diberi nama dan terletak apa pun dan di mana pun Anda inginkan, misalnya /tmp/session1(meskipun disarankan untuk menamainya menggunakan % pola - lihat deskripsi ControlPath di man ssh_config)
golem
1
Tampaknya juga bagian <server> dari ssh -S <path-to-socket> -O exit <server>perintah dapat berupa string apa pun, tetapi harus ada. Itu agak canggung.
golem
1
Jawaban dan pertanyaan ini agak lama, tetapi saya ingin mendukung ini sebagai cara yang paling elegan dan 'benar' dalam menangani masalah ini yang pernah saya lihat. Terima kasih Pak!
zentechinc
41

Saya menemukan solusinya di sini: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

Cara terbaik - Terowongan yang ditutup secara otomatis

Seperti yang telah disebutkan sebelumnya, alih-alih menggunakan kombinasi switch -f -N, kita bisa menggunakan -f saja, tetapi juga menjalankan perintah pada mesin jarak jauh. Tapi, perintah mana yang harus dijalankan, karena kita hanya perlu menginisialisasi terowongan?

Ini adalah saat tidur dapat menjadi perintah yang paling berguna dari semua! Dalam situasi khusus ini, tidur memiliki dua keuntungan:

  • tidak melakukan apa-apa, jadi tidak ada sumber daya yang dikonsumsi
  • pengguna dapat menentukan berapa lama akan dieksekusi

Bagaimana ini membantu dalam menutup terowongan ssh secara otomatis dijelaskan di bawah ini.

Kami memulai sesi ssh di latar belakang, sambil mengeksekusi perintah sleep selama 10 detik pada mesin jarak jauh. Jumlah detik tidak terlalu penting. Pada saat yang sama, kami menjalankan vncviewer persis seperti sebelumnya:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 [email protected] sleep 10; \
          vncviewer 127.0.0.1:25901:1

Dalam hal ini, klien ssh diinstruksikan untuk memotong sesi ssh ke latar belakang (-f), membuat terowongan (-L 25901: 127.0.0.1: 5901) dan menjalankan perintah sleep pada server jarak jauh selama 10 detik (sleep 10).

Perbedaan antara metode ini dan yang sebelumnya (-N switch), pada dasarnya, adalah bahwa dalam hal ini tujuan utama ssh klien bukan untuk membuat terowongan, melainkan untuk menjalankan perintah sleep selama 10 detik. Penciptaan terowongan adalah semacam efek samping, tujuan sekunder. Jika vncviewer tidak digunakan, klien ssh akan keluar setelah periode 10 detik, karena tidak ada lagi pekerjaan yang harus dilakukan, menghancurkan terowongan pada saat yang sama.

Selama pelaksanaan perintah tidur, jika proses lain, vncviewer dalam kasus ini, mulai menggunakan terowongan itu dan menjaganya tetap di luar periode 10 detik, kemudian, bahkan jika klien ssh menyelesaikan pekerjaan jarak jauhnya (pelaksanaan tidur), ia tidak bisa keluar karena proses lain menempati terowongan. Dengan kata lain, klien ssh tidak dapat menghancurkan terowongan karena harus membunuh vncviewer juga. Ketika vncviewer berhenti menggunakan terowongan, maka klien ssh juga keluar, karena ia telah mencapai tujuannya.

Dengan cara ini, tidak ada proses ssh dibiarkan berjalan di latar belakang.

MountainX
sumber
4
Sebuah komentar / koreksi singkat: Sejauh yang saya tahu Anda harus menentukan vncviewer 127.0.0.1::25091karena Anda menggunakan sintaks port dan bukan sintaks tampilan.
Christian Wolf
Ini adalah ide yang bagus, dan dengan rapi mengesampingkan masalah yang saya miliki di Windows. Versi terbaru Windows dikirimkan dengan klien ssh, dan itu mendukung opsi -S secara teori, tetapi sepertinya tidak bekerja untuk saya.
Keeely
9

Untuk membunuh terowongan, gunakan ps -C sshatau ps | grep sshatau varian lain untuk menentukan proses ssh mana yang menjalankan terowongan Anda. Kalau begitu bunuh saja.

Atau, Anda dapat mencari proses dengan menentukan port mana yang terbuka:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

Jika Anda ingin membunuh semua klien ssh yang berjalan di mesin Anda (sebagai pengguna Anda), pkill sshakan melakukannya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
6

Seperti yang dijawab oleh orang lain di sini, pkill sshbunuh saja.

Untuk membuat terowongan yang dapat dikembalikan, saya memulainya screentanpa -fopsi, dan kemudian lepaskan layar dengan Ctrl-A D. Untuk mengembalikan terowongan, hubungi screen -r.

Haotian Yang
sumber
Kekuatan
kasar
1
Waspadalah jika Anda menghubungkan dari jarak jauh. pkill ssh bahkan akan mematikan koneksi Anda saat ini.
kennyut
@kennyut Namun alasan lain untuk digunakan screen.
Haotian Yang
0

Ketika saya memulai sebuah terowongan dengan:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f Meminta ssh untuk pergi ke latar belakang sebelum eksekusi perintah.
  • -NJangan jalankan perintah jarak jauh. Ini berguna untuk hanya meneruskan porta.
  • -D Menentukan penerusan port tingkat aplikasi "dinamis" lokal.
  • -l Menentukan pengguna untuk masuk seperti pada mesin jarak jauh.

Saya bisa menutupnya dengan:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill
numediaweb
sumber
-1

Solusi terbaik yang saya temukan untuk membunuh semua terowongan dalam satu baris perintah adalah

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

untuk sesi ssh, cukup hapus opsi terowongan

ps -lef|grep ssh|awk '{print $4}'|xargs kill

Philippe Gachoud
sumber