Ssh komutunu kullanarak yeniden başlatma işlemini gerçekleştirdikten sonra bağlantıyı kapatma


18

reboot -fKomutu bir Unix makinesini yeniden başlatmaya zorlamak için kullanıyorum . Sorun şu ki, ssh bağlantısının neden bilmediğim uzun süre aktif kalması? Makineyi yeniden başlattıktan hemen sonra ssh bağlantısını kapatmak ve yerel kabuğuma geri dönmek istiyorum. Bunu nasıl yapabilirim? Bayraksız yeniden başlat komutunun -fçalışmadığını unutmayın.


1
Neden uzak bağlantınızdan (Ctrl + D) çıkıp kabuk komut istemini izlemek zorunda kalmadan sunucunun yeniden başlatılmasına izin vermiyorsunuz?
gertvdijk

Bunu aynı komutta nasıl yapabilirim?
coffeMug

2
Bunun için başkaları için de yararlı olabilecek bir çözüm buldum. Ssh'ye ekli komutu başlattıktan hemen sonra bağlantıyı kapatmak için aşağıdaki komutu kullandım: ssh host "ana makinede çalıştırmak için komut> / dev / null &" Bu komutun bağlantıyı zorlama nedenini tam olarak anlamıyorum yakın yapılır ama en azından benim için yararlı oldu. Herhangi biri / dev / null komutunun çıktısının yönlendirilmesini ve ssh bağlantısını neden öldürdüğünü anlarsa, açıklayabilirse iyi olur. :-)
coffeMug

ssh host "ana makinede çalıştırma komutu> / dev / null &"
coffeMug

1
Bu sorunun cevabı değil, ama yine de bilmek yararlı: SSH istemcisi, diğer şeylerin yanı sıra, istemciyi öldürmek için kullanılabilecek bir dizi kontrol karakterine sahiptir. Kontrol karakterleri yalnızca yeni satırdan hemen sonra tanınır, bu yüzden tuşuna basarak başlayın Enter. Sonra örneğin ~.oturumu sonlandırmak için. Enter ~?başkalarının bir listesi için.
Tom

Yanıtlar:


22

Komut reboot -fasla geri dönmez (yeniden başlatmaya neden olma izniniz yoksa). Verildiği noktada, SSH istemcisi yapılması gereken bir şey bekliyor, bu da şunlar olabilir:

  • SSH sunucusu istemciye dikkat edilmesi gereken bir şey olduğunu, örneğin görüntülenecek bir çıktı olduğunu veya uzak komutun bittiğini bildiren;
  • istemci tarafında, röle sinyali gibi bazı olaylar;
  • istemcinin kalıcı bir ileti göndermesine neden olan bir zamanlayıcı tetiklenir (ve sunucu yanıt vermezse bağlantıyı kapatır).

SSH sunucusu işlemi öldüğünden, zamanlayıcı tetiklenene kadar SSH istemcisi ölmez.

Eğer ssh remotehost 'reboot -f >/dev/null &'koşarsan ne olur:

  1. Uzak kabuk, rebootkomutu arka planda başlatır .
  2. Sunucu tarafı kabuk komutu çıktığı ve standart çıktı için dosya tanımlayıcısını açık tutan bir işlem olmadığından, SSH sunucusu bağlantıyı kapatır.
  3. rebootKomut yeniden başlatma Makineyi neden olur.

Ancak, bu güvenilir değildir: zamanlamaya bağlı olarak, 3. adımdan önce 3. adım gerçekleşebilir. Bir zamanlayıcı eklemek bunu mümkün kılmaz:

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

Sunucu tarafının çalışmayı taahhüt rebootettiğinden emin olmak için, istemciye işlendiğini bildirmeden önce gerçekten yeniden başlatılmadığından emin olmak için, sunucudan istemciye gitmek için ek bir bildirime ihtiyacınız vardır. Bu SSH bağlantısı üzerinden verilebilir, ancak karmaşık hale gelir.


2
Durumda herkes uzak ana (benzer çözelti) içinden bunu yapmanın bir yolu arıyor: (sleep 1 && sudo reboot &) && exit. Parantezler, bir saniye bekleyen ve daha sonra yeniden başlatmayı başlatan bir alt işlem oluşturur. Ancak, ana bilgisayar işlemi ssh oturumunu hemen sonlandırır. Ben bir kabuk gurusu değilim, ama bu benim için şimdiye kadar işe yaradı.
Griddo

@Griddo Bu harika çalıştı ve düzgün bir küçük kesmek. Onu seviyorum. Paylaşım için teşekkürler!
Joshua Pinter

5

Bu çözümü benim için en iyisini yapmak için buldum.

Komutunuzla -o "ServerAliveInterval 2"birlikte kullanın ssh, şöyle:

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

Bahsedilen seçenek, istemci tarafının her 2 saniyede bir sunucuyu güvenli bir kanal üzerinden dürtmesini sağlar. Sonunda yeniden başlatma ilerledikçe yanıt vermeyi durdurur ve istemci bağlantıyı koparır.


Teşekkürler Roman, sihir gibi çalışıyor! :)
stdcerr

4

Bazı cevaplar yakındı, ancak doğru cevap:

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

açıklama:

  • exitson komut olarak kullanmak istersiniz, böylece son komutun durumu 0'dır (başarılı). İsterseniz uykuyu başlatabilirsiniz, ancak gerekli değildir
  • aksi takdirde sunucu bağlantıyı kapatır ve bir hata alırsınız çünkü arka planda yeniden başlatmanız gerekir. Çoğu sistemde yine de yeniden başlatılacak, ancak komut dosyası kullanıyorsanız, komut düzgün bir şekilde yürütüldüğünde bile dönüş durumu hata (0 değil) olacaktır.
  • stdinve stdoutSSH üzerinden sanal terminale bağlı olduğundan arka planda çalışmak yeterli değildir , bu nedenle bağlantı kapatılmaz. SSH oturumunun sona ermesi ve komutun arka planda çalışmasına izin vermek için iki ekstra şey yapmanız gerekir.
    • 1) Eğer yönlendirmek gerekir stdoutve stderriçin /dev/nullonlar SSH oturum düzenledi sanal terminali tarafından yönlendirilmez yüzden. Bu &>/dev/nullkısım.
    • 2) stdinokunamayan bir dosyaya aynı şekilde yönlendirmeniz gerekir . Kabuk yapısının nohupyaptığı budur.

Terminalden her şekilde algılanan arka planda çalışan bir komutla exitoturumu kapatır ve sanal terminalde hiç stdinveya hiç stdoutkalmadığı için SSH bağlantıyı hatasız olarak sonlandırır.


1

Aşağıdaki komutu kullanıyorum:

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

Bunun yaptığı şey:

  • Makineye bir sonraki anda yeniden başlamasını bildirir, ancak bu komut sırasında değil
  • SSH'den temiz bir şekilde çıkar
  • SSH TTY'yi tüm zaman boyunca korur, böylece sudo mutlu olur ve düzgün bir şekilde çalışabilir.

0

Aşağıdakileri denedin mi

# shutdown -r now

Geçişte üzerinde çalıştığım bazı sistemlerde, reboot komutunun bazı sorunları olduğunu görüyorum. Sonra tekrar kapatma man sayfasında -f bayrağı ile yeniden başlatma aynı şeyi yapacak bir şey bulamıyorum.


1
Evet, kapatma, bazı garip nedenlerle bağlanmaya çalıştığım makinede çalışmıyor. Bu yüzden bir kapatma ve yeniden başlatma zorlamak için reboot -f kullanın.
coffeMug

0

Bir sonraki komutu kullanarak ssh oturumundan çıkıp sistemi yeniden başlatmaya ne dersiniz:

ssh login@host "reboot -f"

Bundan sonra ssh sonlandırmak için Ctrl + C tuşlarına basın.


0

Bunun için başkaları için de yararlı olabilecek bir çözüm buldum. Ssh'ye ekli komutu başlattıktan hemen sonra bağlantıyı kapatmak için aşağıdaki komutu kullandım:

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

Bu komutun bağlantıyı neden kapatmaya zorladığını tam olarak anlamıyorum ama en azından benim için yararlı oldu. Herkes ssh bağlantısını neden öldürdüğünü anlarsa; lütfen açıkla.


0

Bu 1 dakikalık bir gecikme gerektirir, ancak benim için güvenilir bir şekilde çalıştı ve SSH istemcisi askıda kalma sorununu çözdü:

    $ sudo shutdown +1; logout

Bu, sistemin kapatılmasını 1 dakika sonra zamanlar ve bu da oturumu kapatma ve böylece SSH sonlandırmanın tamamlanmasını sağlar. Eğer mümkün olduğunca az zaman olarak beklemek istersen, değiştirmek olabilir +1ile HH:MMgünün hızla yaklaşan bir süre ama bu doğru zaman zor olabilir ve bir 59 saniyelik gecikmeden kadar sahip olabilir.


0

Bulduğum basit bir yol, kapatma / yeniden başlatmaya arka plan görevi olarak komut vermek ('&' kullanarak), oturum 'nohup' ile kapatıldığında anında kabuk / oturum çıkışı ile birlikte kapanmasını önlemektir:

nohup shutdown -r now & exit

Bu şekilde, SSH istemcisi oturumu hemen kapattığından, uzak sistem yeniden başlatma işlemiyle eşzamansız olarak devam eder.


Veya yeniden başlatma için sisteminizin eşdeğerini "shutdown -r now" ile değiştirin ....
MikeW

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.