Bırakılan SSH oturumlarını sonlandır


47

SSH oturumlarım bu benim asıl sorunum olmasa da düşüyor gibi görünüyor - asıl sorun önceki oturumlarım hala hayatta, daha da kötüsü ama bunlardan biri visudobenim erişimimi engelliyor!

who şu anki bağlantımın kesildiğini bildiğim hariç, birkaç oturumu gösterir, eskilerini nasıl sonlandırabilirim, böylece kaynaklarını serbest bırakabilirim?


1
Belirli bir terminaldeki herşeyi öldürmek konusunda yolunda iseniz fuser -k /dev/pts/0, whoçıkışta ne gibi bir terminalin ortaya çıktığını veya benzeri bir şeyi yapabilirsiniz . Yine de, bütün bunlar SIGHUP'ı görmezden geldi. Bir screenoturumda mı çalışıyorlardı ?
Bratchley

Anladım: Süreç öldürülemedi 1031: Böyle bir işlem yok. sadece SSH’nin PuTTY’yi kullandığı özel bir şey yok - yeni yönlendiricimin etkin olmayan bağlantıları bırakmakta agresif olduğunu düşünüyorum - diğer ucun TCP bağlantısı sona erdiğinde bir şey yapabileceğini düşünürdüm - belki de bilmiyor (henüz)?
markmnl

1
GÜNCELLEME bu komut diğer kullanıcılar için çalışıyor (0 whoartık değil), teşekkürler!
markmnl

"SSH oturumlarım geriliyor gibi görünüyor ... ... asıl sorun önceki oturumlarım hala hayatta." Biraz çelişkili. Ya bağlantısı kesildi ya da hala bağlılar. Belki bu sonuca nasıl ulaştığınızı açıklamalısınız, böylece bağlantınız koptu, sonra tekrar bağlanın ve eski bağlantınızın hala çalıştığını anlayın.
goldilock

Yanıtlar:


58

Anlık sorunu çözmek için, sudoers dosyasının kilitli olduğunu, sadece kilit dosyasını silebilirsiniz. Bu genellikle `/etc/sudoers.tmp" olacaktır; doğrulamak için visudo sayfasını kontrol ediniz. Kilit dosyasını silerseniz, visudo'yu tekrar çalıştırabilirsiniz.

Hala asılı kalan tüm oturumları silmek için, önce kendi geçerli oturumunuzun ücretini öğrenin. Öyleyse, kendi pidiniz 12345 ise,

ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh 

| shSadece öldürmeyi planladığınız PID'leri kontrol etmek için ilk olmadan final yapmak isteyebilirsiniz .

Linux kullanıyorsanız, bunun yerine kullanabilirsiniz

pkill -o -u YOURUSERNAME sshd

en eski SSH oturumunu öldürmek için. Şu anki oturumunuz geriye kalana kadar devam edin.

Ayrıca belirlemek isteyebilir ServerAliveInterval 15Gözlerinde farklı .ssh/configbir veri gönderildiğinde bir canlı tutma mesaj her 15 saniyede bir gönderme. man ssh_configdaha fazla bilgi için.


1
CentOS'ta - Eğer root hesabına bakıyorsanız, bu cevap işe yaramazsa, aşağıdakileri kullanmayı deneyin: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs öldürmek
Ali Nadalizadeh

Teşekkürler. Bu çalışıyor. grep -v 12345Sözdiziminin bir bölümünün hangi amaca hizmet ettiği konusunda net değilim. içermeyen her şeyi geçmek 12345?
Lord Loh.

grep -v 12345"Eşleştirmeden eşleşen satırları kaldır" anlamına gelir 12345. Bu nedenle, önce kendi oturumunuzun PID'sini tanımlamalı ve bunun yerine PID'yi kullanmalısınız 12345.
Jenny D,

Tüm bu oturumları ve istifaları öldürdükten sonra, komutları whoveya tophala eski sayıda imzalı kullanıcı gösterdiğini, hatta sadece 1 göstermesi gerektiğini göstermelidir.
Mega

2

İşlemleri, komutlarını ve argümanlarını görecek şekilde (örneğin ps -f, procps gibi) görüyorsanız, örneğin , sshd işlemlerini örneğin:

sshd: user@pts/7

Terminal ( pts/7) buradaki anahtar kısımdır - mevcut terminalinizle ( tty) karşılaştırırsanız, hangisinin aktif oturumunuz olduğunu görebilirsiniz. Elbette bunu yapmanın başka yolları da var (şu anda çalışan kabuğun PID'sine bakmak ve bunu işlem ağacında bulmak gibi), ancak bu muhtemelen en kolay olanı. Daha sonra şu satırlar boyunca bir şeyler kullanabilirsiniz:

# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
    | grep sshd:.*@ \
    | grep -v "@$TTY" \
    | sed "s/ sshd.*//"

Daha sonra öldürmek için PID'leri besleyebilirsiniz, xargsancak her zaman sshdyeni bağlantıları yöneten ana işlemi öldürmediğinizden emin olun .

İlgili bir notta, genel olarak psçıktıyı ayrıştırmanın , çıktı biçimlerinin değişkenliği nedeniyle (burada kullanımı büyük ölçüde azaltılarak) hataya eğilimli (özellikle çeşitli sistemler arasında -o pid= -o command=) olduğu bildirilmelidir.


1

Bu 2 + gün boyunca asılı oturumları öldürür. Bir cron olarak konabilir.

for i in `w|awk '{print $2,$5}'|grep days|cut -d' ' -f1`; do fuser -k /dev/$i; done

Bu sizin (son aktif oturumunuz) dışındaki herkesi öldürür. Bunu terminalden çalıştır.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
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.