Menutup koneksi setelah menjalankan reboot menggunakan perintah ssh


18

Saya menggunakan reboot -fperintah dari jarak jauh untuk memaksa reboot mesin Unix. Masalahnya adalah koneksi ssh tetap aktif untuk waktu yang lama dan saya tidak tahu mengapa? Saya ingin menutup koneksi ssh segera setelah me-reboot mesin dan kembali ke shell lokal saya. Bagaimana saya bisa melakukan itu? Perhatikan bahwa perintah reboot tanpa -fbendera tidak berfungsi.


1
Mengapa tidak keluar saja dari koneksi jarak jauh Anda (Ctrl + D) dan biarkan server reboot tanpa Anda harus menonton prompt shell?
gertvdijk

Bagaimana saya bisa melakukan ini dalam perintah yang sama?
coffeMug

2
Saya menemukan solusi untuk ini yang mungkin bermanfaat bagi orang lain juga. Saya menggunakan perintah berikut untuk menutup koneksi setelah memulai perintah yang dilampirkan ke ssh: ssh host "perintah untuk berjalan di mesin host> / dev / null &" Saya tidak sepenuhnya mengerti alasan mengapa perintah ini memaksa koneksi ke Tutup dilakukan tetapi setidaknya itu membantu saya. Jika ada yang mengerti pengarahan output dari perintah ke / dev / null dan mengapa itu membunuh koneksi ssh, akan lebih baik jika dia bisa menjelaskannya. :-)
coffeMug

ssh host "perintah untuk dijalankan pada mesin host> / dev / null &"
coffeMug

1
Ini bukan jawaban untuk pertanyaan ini, tetapi tetap berguna untuk mengetahui: Klien SSH memiliki serangkaian karakter kontrol yang dapat digunakan, antara lain, untuk membunuh klien. Karakter kontrol hanya dikenali segera setelah baris baru, jadi mulailah dengan menekan Enter. Kemudian mis ~.untuk mengakhiri sesi. Enter ~?untuk daftar orang lain.
Tom

Jawaban:


22

Perintah reboot -ftidak pernah kembali (kecuali Anda tidak memiliki izin untuk menyebabkan reboot). Pada saat diterbitkan, klien SSH sedang menunggu sesuatu untuk dilakukan, yang bisa berupa:

  • server SSH memberitahukan klien bahwa sesuatu terjadi yang memerlukan perhatiannya, misalnya bahwa ada beberapa output untuk ditampilkan, atau bahwa perintah jarak jauh telah selesai;
  • beberapa peristiwa di sisi klien, seperti sinyal untuk menyampaikan;
  • timer menyala untuk menyebabkan klien mengirim pesan keepalive (dan menutup koneksi jika server tidak membalas).

Karena proses server SSH sudah mati, klien SSH tidak akan mati sampai timer menyala.

Jika Anda berlari ssh remotehost 'reboot -f >/dev/null &', maka yang terjadi adalah:

  1. Shell jarak jauh meluncurkan rebootperintah di latar belakang.
  2. Karena perintah shell sisi-server telah keluar dan tidak ada proses menahan deskriptor file untuk output standar terbuka, server SSH menutup koneksi.
  3. The rebootperintah menyebabkan mesin untuk reboot.

Namun, ini tidak dapat diandalkan: tergantung pada waktu, langkah 3 mungkin terjadi sebelum langkah 2. Menambahkan timer membuat ini tidak mungkin:

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

Untuk benar-benar yakin bahwa sisi server berkomitmen untuk menjalankan reboot, sambil memastikan bahwa itu tidak benar-benar reboot sebelum memberi tahu klien bahwa itu berkomitmen, Anda perlu pemberitahuan tambahan untuk pergi dari server ke klien. Ini bisa berupa output melalui koneksi SSH, tetapi menjadi rumit.


2
Dalam kasus ada orang yang mencari cara untuk melakukan ini dari dalam remote host (solusi serupa): (sleep 1 && sudo reboot &) && exit. Tanda kurung menelurkan subproses, yang menunggu satu detik dan kemudian memulai reboot. Namun proses host segera mengakhiri sesi ssh. Saya bukan guru shell, tapi sejauh ini berhasil bagi saya.
Griddo

@Griddo Itu bekerja dengan sangat baik dan merupakan hack kecil yang rapi. Aku menyukainya. Terima kasih telah berbagi!
Joshua Pinter

5

Saya menemukan solusi ini untuk melakukan yang terbaik untuk saya.

Gunakan -o "ServerAliveInterval 2"dengan sshperintah Anda , seperti:

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

Opsi tersebut membuat sisi klien menyodok server melalui saluran aman setiap 2 detik. Akhirnya ketika proses booting ulang, itu akan berhenti untuk merespons dan klien akan merobohkan koneksi.


Terima kasih Roman, bekerja seperti sulap! :)
stdcerr

3

Beberapa jawaban sudah dekat, tetapi jawaban yang tepat adalah:

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

penjelasan:

  • yang kamu ingin exit sebagai perintah terakhir sehingga status dari perintah terakhir adalah 0 (berhasil). Anda dapat menambahkan tidur jika diinginkan, tetapi itu tidak perlu
  • Anda harus menjalankan reboot di latar belakang, karena jika tidak server akan menutup koneksi dan Anda akan mendapatkan kesalahan. Itu masih akan reboot pada kebanyakan sistem tetapi jika Anda membuat skrip, status pengembalian akan menjadi kesalahan (bukan 0) bahkan dengan perintah yang dijalankan dengan benar
  • berjalan di latar belakang tidak cukup, karena stdindan stdoutmasih terpasang ke terminal virtual melalui SSH, sehingga koneksi tidak akan ditutup. Anda perlu melakukan dua hal tambahan untuk mengakhiri sesi SSH dan membiarkan perintah berjalan di latar belakang.
    • 1) Anda perlu untuk mengarahkan stdoutdan stderrke /dev/nullsehingga mereka tidak diarahkan oleh terminal virtual yang memegang sesi SSH. Ini &>/dev/nullbagiannya.
    • 2) Anda perlu mengarahkan ulang stdinke file yang tidak dapat dibaca dengan cara yang sama. Itulah yang dilakukan oleh shell builtin nohup.

Dengan hanya perintah yang berjalan di latar belakang terlepas dari terminal dengan segala cara, exitakan menutup sesi dan karena tidak ada stdinatau stdouttertinggal pada terminal virtual SSH akan memutuskan koneksi tanpa kesalahan.


1

Saya menggunakan perintah berikut:

ssh -t <hostname> 'sudo shutdown --reboot 0 && exit'

Inilah yang dilakukan:

  • Ini menginstruksikan mesin untuk reboot pada saat berikutnya, tetapi tidak selama perintah ini
  • Keluar dengan bersih dari SSH
  • Mempertahankan SSH TTY sepanjang waktu sehingga sudo senang dan dapat mengeksekusi dengan baik.

0

Sudahkah Anda mencoba yang berikut ini

# shutdown -r now

Saya menemukan bahwa pada beberapa sistem saya bekerja di pass, perintah reboot punya beberapa masalah. Kemudian lagi saya tidak dapat menemukan apa pun di halaman shutdown yang akan melakukan hal yang sama dengan reboot dengan flag -f.


1
Ya, shutdown tidak berfungsi di mesin yang saya coba sambungkan untuk beberapa alasan aneh. Itu sebabnya saya menggunakan reboot -f untuk memaksa shutdown dan restart.
coffeMug

0

Bagaimana keluar dari sesi ssh dan reboot sistem menggunakan perintah berikut:

ssh login@host "reboot -f"

Setelah ini cukup tekan Ctrl + C untuk mengakhiri ssh.


0

Saya menemukan solusi untuk ini yang mungkin bermanfaat bagi orang lain juga. Saya menggunakan perintah berikut untuk menutup koneksi setelah memulai perintah yang dilampirkan ke ssh:

ssh host "command to run on the host machine > /dev/null &"

Saya tidak benar-benar mengerti alasan mengapa perintah ini memaksa koneksi ditutup tetapi setidaknya itu membantu saya. Jika ada yang mengerti mengapa ini membunuh koneksi ssh; tolong jelaskan.


0

Ini membutuhkan penundaan 1 menit tetapi telah bekerja dengan andal bagi saya dan menyelesaikan masalah hang klien SSH:

    $ sudo shutdown +1; logout

Ini menjadwalkan shutdown sistem selama 1 menit kemudian yang memungkinkan waktu untuk logout, dan karenanya terminasi SSH, selesai. Jika Anda ingin menunggu sesedikit mungkin, Anda dapat mengganti +1dengan HH:MMuntuk waktu yang cepat mendekati hari tetapi itu mungkin sulit untuk waktu dengan benar dan mungkin memiliki hingga 59 detik penundaan.


0

Cara sederhana yang saya temukan, adalah memerintahkan shutdown / reboot sebagai tugas latar belakang (menggunakan '&'), melindunginya agar tidak ditutup ketika sesi ditutup dengan 'nohup', bersama dengan keluar langsung shell / sesi:

nohup shutdown -r now & exit

Dengan cara ini, klien SSH tidak hang, karena sesi segera keluar, sementara sistem jarak jauh melanjutkan dengan reboot secara tidak sinkron.


Atau gantikan sistem Anda dengan "shutdown -r now" untuk reboot ....
MikeW

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.