Bagaimana cara menghentikan / membunuh terowongan autossh?

17

Sekarang saya memiliki terowongan autossh, apa cara yang benar untuk menghentikannya?

Sepertinya tidak ada cara mudah untuk melakukan ini. Dokumentasi tidak jelas pada bagian ini.

Sepertinya cara mudah untuk reboot mesin? Apakah ini benar?

onknows
sumber

Jawaban:

21

Tidak, cara membunuh yang tepat autosshadalah dengan membunuh prosesnya autossh, tidak ada yang lain.

Alasannya adalah

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

itu autosshhanyalah skrip shell, bukan layanan . Ini memulai program baru, di baris terakhirnya,

exec /usr/lib/autossh/autossh "$@"

lagi bukan layanan. Adapun exec(Anda dapat mengeceknya di wiki peretas Bash ), ini adalah perintah shell-builtin yang menggantikan shell saat ini dengan perintah berikut ( /usr/lib/autossh/autossh "$@"dalam hal ini) tanpa memulai proses baru. Jadi, satu - satunya cara untuk berhenti autosshadalah dengan mematikan skrip panggilan, misalnya

pkill -3 autossh

(terima kasih kepada dviljoen untuk menunjukkan pentingnya menggunakan flag -3 , lihat di bawah). Kebetulan, mematikan sshkoneksi tidak akan berhasil, karena perintah panggilan ( yaitu , yang di atas) hanya akan memulai koneksi baru segera setelah menyadari bahwa yang lama telah terputus.

MariusMatutiae
sumber
1
Sebenarnya Anda harus membunuh autossh tanpa -9. Jika koneksi telah dibuat melalui terowongan, itu akan melahirkan proses sshd anak untuk menanganinya. Membunuh autossh induk dengan -9 akan meninggalkan proses sshd. Terowongan masih akan beroperasi sampai proses sshd habis. Jika Anda menggunakan sinyal default (-3) pada kill, ia akan dimatikan dengan anggun dan mengambil proses sshd spaw dengannya.
dviljoen
hai karena -3 adalah sinyal default kill, Anda sebenarnya tidak perlu melewati -3, Anda dapat menghilangkannya
Andrés Alcarraz
@ AndrésAlcarraz Anda benar-benar yakin tentang itu? SIGTERMadalah default, dan yang itu 15. SIGQUITadalah 3, lihat superuser.com/questions/352147/what-does-kill-3-mean dan en.wikipedia.org/wiki/Kill_(command) - Juga, FWIW, saya baru saja memeriksa dan -15tidak mematikannya, jadi SIGTERMtidak bisa digunakan.
Daniel F
Dan menggunakan pkilltanpa sinyal (= the default) juga tidak berakhir autossh.
Daniel F
@DanielF Anda benar, saya bingung dengan "sinyal default (-3)" dari komentar dvijoen
Andrés Alcarraz
5

jalankan ssh otomatis dengan:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

bunuh dengan:

kill pid

BTW

pkill -9 autossh itu salah

-9Memastikan proses tidak keluar dengan anggun, jadi sshprosesnya masih ada saat autosshproses tersebut terbunuh

tanpa -9itu masih buruk, jika Anda memiliki beberapa terowongan berjalan, pkillakan membunuh semuanya

cara yang benar adalah dengan mengatur AUTOSSH_PIDFILEenv var maka killpid itu saja

Erik
sumber
Selamat datang di Pengguna Super. Tampaknya paragraf terakhir Anda adalah jawaban Anda yang sebenarnya, sedangkan sisa pertanyaan Anda adalah komentar untuk jawaban lain . Mengingat sifat T&J dari situs ini, akan sangat membantu untuk menambahkan detail yang cukup untuk jawaban Anda sehingga dapat berdiri sendiri. Terima kasih telah berkontribusi dan jangan lupa untuk melihat turnya .
Saya katakan Reinstate Monica
4

Cari prosesnya:

ps aux | grep ssh

Kolom detik adalah nomor PID

Matikan proses dengan PID :)

bunuh -9 PIDnumber

Gunakan sudo jika Anda tidak memiliki hak akses root.

NIZ
sumber
1

Saya tahu ini telah dijawab, tetapi bertentangan dengan komentar di atas, menggunakan pkill -3 autosshTIDAK membunuh proses sshd child untuk saya.

Saya menggunakan fungsi ini di .bashrcfile saya .
Pada dasarnya, ini seperti menambahkan --killargumen ke autossh.

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

Anda dapat menjalankan which sshdan which autosshmemeriksa jalur di sistem Anda.

Selama argumen pertama tidak --kill, itu hanya meneruskan argumen ke autossh.

Script ini membunuh instance autossh & ssh. Ini penting jika Anda menggunakan penerusan port karena, HANYA membunuh autossh instance tidak membunuh tunnel, itu hanya mencegahnya menyambung kembali jika / ketika akhirnya terputus.

Anda juga dapat menentukan istilah pencarian (nama host) untuk membunuh hanya terowongan tertentu.

autossh --kill dbserver1membunuh hanya koneksi ke dbserver1
autossh --kill dbserverakan membunuh dbserver1, dbserver2, dll.
autossh --kill dbserverakan membunuh SEMUA koneksi autossh

Untuk memperjelas, itu HARUS membunuh hanya sesi SSH dimulai oleh autossh.

Jika Anda menjalankan ps aux | grep sshsementara Anda menjalankan sesi autossh dan ssh, Anda akan melihat bahwa sesi yang dimulai oleh autossh menggunakan path lengkap (/ usr / bin / ssh dan / usr / lib / autossh / autossh).
Script ini hanya mencocokkan hasil dengan proses yang dimulai dengan jalur speicifc. Saya melakukan ini karena saya (dan saya berasumsi kebanyakan orang) biasanya mengetik sshdan bukan path lengkap, yang mencegahnya membunuh sesi ssh normal saya.

Semoga ini bisa membantu orang lain.

KeithMcFly
sumber
ada alasan khusus $(which autossh)bukan hanya autossh?
MestreLion