Bırakılan SSH oturumunda çalışan komutu devam ettirin


32

Bu soruyu okumak beni meraklandırdı. Kullanılmadığını varsayarsak screen. Bir Linux hedefindeki bir SSH oturumu bırakılırsa, ne sebeple olursa olsun, sunucu oturumu zaman aşımı nedeniyle öldürmeden önce yeniden bağlanırsanız, çalışan komutun denetimini, bozuk oturum nedeniyle iptal edilmeyecek şekilde yeniden elde etmek mümkün olur ?


Bu ne komutu? Sanırım genelde cevap hayır.
davr

Belirli bir komut yok, sadece genel bir kavram olarak soruyorum.
John

1
Tty seanslarının nasıl başlatıldığına dair kapsamlı bir anlayışı olan biri bize nasıl olduğunu söyleyebilir. Görünüşe göre, aynı oturumda yeni bir oturum yeniden oluşturabilir ve açıkça önceki PPID'yi atamak mümkün olabilirdi. Sadece sakallı bir nix gurusunun gelip aklımızı uçurmasını bekliyorum. Her halükarda rüya budur.
CarpeNoctem

Bağlı bir dizüstü bilgisayarla deneme yapıp ethernet kablosunu çıkarırsanız ne olur?
Paul,

@ ~ drpaulbrewer - Aynen bir masaüstü bilgisayarla yaptığınız gibi - bağlantı kopuyor. Bağlantının nasıl kesildiği sorusu ile ilgisi yoktur.
John Gardeniers

Yanıtlar:


13

Yeni bir terminalin mevcut STD * dosya tanımlayıcılarını eski bir çalışan sürece bağlamaya çalışmak sadece sorun istiyor. Bunu yapmayı başarsanız bile, terminalin iş kontrolü beklendiği gibi çalışmaz. Sonunda devralınan programdan çıkarsanız ve dosya tanımlayıcılarını yeni arkaplan işlemine teslim edilmek üzere feda eden kabuğa ne olur? Shell gittiğinde ssh açık kalacak mı? Muhtemelen değil. Bu yüzden önce başka bir yere yönlendirmeniz gerekir.

Muhtemel ya da değil, terkedilmiş sürecin "doğal olarak" öldürülmesine izin vermenin daha fazla arzu edildiğine bahse girerim. Kontrolü devam ettirmek için gereken tüm hackery'leri yapmaya çalışmayı haklı çıkaracak kadar önemli bir şey yapıyorsanız ve dengesiz bir bağlantınız varsa, muhtemelen bunu önceden bilmeli ve sadece ekranı (veya vnc'yi ya da bağlantınızı ne çekiyorsa) kullanmalısınız. kontrol botu). :)


Kabul etmek için bir cevap seçmekte zorlanıyorum, bu yüzden bunu kabul ediyorum, çünkü şu anda bir oy hakkı olan tek kişi oydu.
John Gardeniers

5

Bunun eski bir soru olduğunu biliyorum, ancak yaptığım gibi bir başkasıyla karşılaşması durumunda bulgularımı eklemenin önemli olduğunu hissettim.

Bunu yapmak için olağandışı bir sonuç görmedim, evet, ama bu kullandım ve inanılmaz çalıştı. Bazen sunucumuzda uzun süreçler çalıştırdığımızda, bazen ssh oturumunun bağlantısını keser. Tty oturumu ile birlikte süreç devam ediyor gibi görünüyor ama biz yeniden bağlanamayız. İşlemi yeni bağlanan oturuma çekmek için aşağıdaki programı buldum.

https://github.com/nelhage/reptyr

İşte daha fazla bilgi

https://blog.nelhage.com/2011/02/changing-ctty/


5
Sunucu Arızasına Hoşgeldiniz! Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya eklemek ve referans için bağlantıyı sağlamak tercih edilir.
EEAA

teşekkür ederim, @ user215086! Şaşırtıcı bir şekilde, bu işe yaradı! Bir süredir uzun bir yapılandırma dosyası düzenliyordum, bir sürü özel ayar ekledim ve dikkatlice yorum yazdım ve bağlantı koptuğunda neredeyse bitti! "Noooooo !! ..." Tavanda küfür bağırarak işim bittikten sonra reptyr et et işte! Ssh oturumunu tam olarak editörün içinde bıraktığım yerde kurtardım, birkaç şey yaptım, kurtardım, yaptım !! WooHoo! reptyr harika.
ColdCold

4

Genel olarak, bununla baş etmenin doğru yolu GNU screenveya bash nohupveya disownmekanizmaları kullanarak önceden hazırlanmaktır . Kullanıyorsanız tcsh, kabuk anormal biçimde çıktığında arka plan işlerini bırakacaktır.

Eğer kullanmıyorsanız screenama biri yoluyla çalışan sürecini tutmayı başarmış disown yöntemlerle, sizinle sürecine sahte yeniden bağlanma mümkün olabilir gdb( kaynağı ):

[...] bazı kirli saldırılarda, bir işlem 'stdout / stderr / stdin' i tekrar açmak imkansız değildir. [...]

Ve sonra, sürece eklemek için gdb'yi kullanın, bir çağrı kapat (0)
çağrı kapat (1)
çağrı kapat (2)
çağrı aç ("/ dev / pts / xx", ...)
çağrı dup (0) yapın.
çağrı dup (0)
ayırmak

Şimdi, durumunuz için bu işlemi ince ayar yapmanız gerekecek. Süreci reddetmeyi başaramazsanız bunun yardımcı olacağından şüpheliyim . Eğer kullanıyorsanız bash, bu yayını göremez yapma konusunda bash otomatik disown Çıkışta arka plan işlemleri (temelde, kapatmak huponexit ile shopt ). Bir ön plan işleminde, nohup kullanmış olmanız gerekir .


1

Muhtemelen değil. Bunun imkansız olduğunu garanti edemem ama gerçekten şüpheliyim.

Bir şey, ssh bağlantısının sonlandırılmasının bir sonucu olarak çalışan kabuğun ve olası komutların öldürülmemesidir. Bu o kadar zor değil, diğer soruda belirtilen nohup ve benzeri mekanizmaları kullanabilmelisiniz.

Ama sonra başladığını ssh somehost nuhup vim /some/fileve bağlantının öldüğünü varsayalım . ssh somehostTekrar giriş yapmak için koşuyorsunuz ve vim işleminizin hala çalıştığını görebilirsiniz. Peki, bu sürece tekrar nasıl bağlanıyorsunuz? İnteraktif forground işlemlerinde kontrol tty'si var ve başladığında vim işleminiz için açılan işlem o zamandan beri kapalı olacaktı. Yeni kabuğunuzda tekrar "yeniden açmanın" bir yolu olup olmadığından emin değilim (tıpkı bir kabukta çalışan birkaç arka plan işiniz varsa, başka bir kabuktakileri ön planlayamazsınız).

Screenaçıkça bu işlevselliğe sahip olmak için yazılmıştır. Başlangıçta iki süreç, bir terminal yönetimi süreci ve bir de müşteri süreci gerektirir. Etkileşim, istemci <--> terminal yöneticisi <--> uygulamasıdır ve bağlantıyı kestikten veya kaybettiğinizde, terminal yöneticisi yaşamaya devam ederken istemci işlemi ölür. Ekranın daha sonra tekrar terminal yönetimi sürecine eklenmesi için belirli bir desteği var ve bunun genel durumda mümkün olduğunu sanmıyorum.


Teşekkürler. Beklediğim gibi. Bakalım birileri bizi yanlış kanıtlayabilir mi? ;)
John Gardeniers

Bu cevabı yazdığımdan beri "yeniden doldurma" işlemleri için bir program reptyr olduğunu öğrendim . Bu yüzden teoride yapılabilir, ancak hala genel cevabın muhtemelen olmadığını düşünüyorum.
Hlovdal


1

Eğer oturum kesilirse , bu, TTL'nin zaman aşımına uğradığı anlamına gelir, bu yüzden sizin için daha fazla tty yoktur (anladığım kadarıyla). Ancak, ağ bağlantınız koparsa, SSH oturumunuzun kapatılması gerekmeyebilir ve bağlantınıza devam edip devam edebilmeniz gerekir. İstediğiniz şey bu mu?


Genel olarak soruyordum ama bir ağ sorununun bağlantının kopmasına neden olduğu zamanlar çok ilgileniyorum. Genel olarak, çok iyi görünmediğini söyleyebilirim. Yine de buna ihtiyaçtan ziyade sadece meraktan soruldu. Cevap vermeden önce cevabı bilmek her zaman güzeldir. ;)
John Gardeniers

kesik bir bağlantı göründüğü kadar basit bir kavram değildir. Bunun birkaç farklı aşamasını yaşayabilirsiniz. Örneğin, ağ kablonuzu çıkarabilmeniz, birkaç saniye içinde yeniden takmanız ve SSH oturumunuz devam edecektir, kısa bir başlangıç ​​gecikmesi yaşayabilseniz bile, devam etmek için yeniden bağlanmak zorunda kalmayacaksınız. Kendinizi öldürülmüş bir ssh oturumu ile bulursanız, bir şeyin yanlış yapılandırılmış olduğu (veya bu tür bir kesintiyi destekleyecek şekilde yapılandırılmadığı) anlamına gelir.
monomyth

0

Bu soruda bazı hırsızlık kodlarını çalmak için bir bağlantı vardı . Teorik olarak bunu nohup işleminin kontrolünü yeniden kazanmak için kullanabilmelisiniz.


1
Bu sorunun cevabında belirtilen aşağılama komutu da daha fazla araştırmaya değer. Teşekkürler.
John Gardeniers
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.