Beenden Sie gelöschte SSH-Sitzungen

47

Meine SSH - Sitzungen scheinen fallen zu werden , obwohl das nicht mein Hauptproblem ist , - das Hauptproblem meiner früheren Sitzungen ist noch am Leben sind, schlimmer noch einer von ihnen läuft visudomir verhindert es den Zugriff auf !

who Zeigt eine Reihe von Sitzungen an, die alle außer meiner aktuellen Sitzung getrennt haben. Wie kann ich die alten Sitzungen beenden, um die Ressourcen freizugeben?

markmnl
quelle
1
Wenn Sie in Ordnung sind, wenn Sie alles auf einem bestimmten Terminal beenden, können Sie so etwas tun fuser -k /dev/pts/0oder was auch immer in der whoAusgabe angezeigt wird. Ein bisschen komisch, dass alle SIGHUP ignoriert haben. Waren sie in einer screenSitzung oder so?
Bratchley
Ich bekomme: Konnte den Prozess nicht beenden 1031: Kein solcher Prozess. nichts besonderes, nur mit SSH in PuTTY - Ich denke, mein neuer Router ist aggressiv beim Löschen inaktiver Verbindungen - obwohl ich gedacht hätte, dass das andere Ende etwas getan hätte, sobald die TCP-Verbindung beendet ist - vielleicht weiß es (noch) nicht?
Markmnl
1
UPDATE dieser Befehl funktioniert für die anderen Benutzer (0 nicht whomehr in), danke!
Markmnl
"Meine SSH-Sitzungen scheinen jedoch abzufallen ... das Hauptproblem ist, dass meine vorherigen Sitzungen noch am Leben sind" ist ein wenig widersprüchlich. Sie wurden entweder getrennt oder sind noch verbunden. Vielleicht sollten Sie erklären, wie Sie zu dieser Schlussfolgerung gekommen sind, dass Sie getrennt wurden, und dann erneut eine Verbindung herstellen, und feststellen, dass Ihre alte Verbindung noch besteht.
Goldlöckchen

Antworten:

58

Um das unmittelbare Problem zu lösen, dass die sudoers-Datei gesperrt ist, können Sie die Sperrdatei einfach löschen. Es ist normalerweise "/etc/sudoers.tmp"; überprüfen Sie die Manpage auf Visudo, um dies zu überprüfen. Wenn Sie die Sperrdatei löschen, können Sie Visudo erneut ausführen.

Um alle Sitzungen zu löschen, die noch hängen bleiben, ermitteln Sie zunächst die PID Ihrer aktuellen Sitzung. Wenn Ihre eigene PID 12345 lautet, tun Sie dies

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

Möglicherweise möchten Sie es ohne das letzte | shMal tun, nur um die PIDs zu überprüfen, die Sie töten möchten.

Wenn Sie unter Linux arbeiten, können Sie stattdessen verwenden

pkill -o -u YOURUSERNAME sshd

um deine älteste SSH-Sitzung zu beenden. Fahren Sie damit fort, bis nur noch Ihre aktuelle Sitzung übrig ist.

Vielleicht wollen Sie auch setzen ServerAliveInterval 15in Ihrem .ssh/configeiner Leben - Nachricht alle 15 Sekunden zu senden , wenn keine Daten gesendet werden. man ssh_configfür mehr Informationen.

Jenny D
quelle
1
Unter CentOS - Wenn Sie SSH für das Root-Konto verwenden, funktioniert diese Antwort nicht. Versuchen Sie Folgendes: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh
Vielen Dank. Das funktioniert. Ich bin mir nicht sicher, welchen Zweck ein grep -v 12345Teil der Syntax erfüllt . Pass alles, was nicht enthalten ist 12345?
Lord Loh.
grep -v 12345bedeutet "alle übereinstimmenden Zeilen 12345aus dem Match entfernen ". Daher sollten Sie zuerst die PID Ihrer eigenen Sitzung identifizieren und diese PID anstelle von verwenden 12345.
Jenny D
Nachdem Sie alle diese Sitzungen beendet und zurückgetreten haben, werden Befehle whooder topimmer noch die alte Anzahl der angemeldeten Benutzer angezeigt, auch wenn nur 1 angezeigt werden sollte. Wie kann das erzwungen werden, aktualisiert zu werden?
Ωmega
2

Wenn Sie Prozesse ps -fauflisten, so dass Sie ihren Befehl und ihre Argumente sehen (wie z. B. von procps), sollten Sie sehen, dass sshd-Prozesse aufgerufen werden, z.

sshd: user@pts/7

Das Terminal ( pts/7) ist hier der Schlüsselteil - wenn Sie es mit Ihrem aktuellen Terminal ( tty) vergleichen, können Sie sehen, welches Ihre aktive Sitzung ist. Es gibt natürlich auch andere Möglichkeiten, dies zu tun (z. B. die PID der aktuell ausgeführten Shell zu überprüfen und diese im Prozessbaum zu suchen), aber dies ist wahrscheinlich die einfachste. Sie können dann etwas in dieser Richtung verwenden:

# 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.*//"

Sie können dann die zu tötenden PIDs eingeben, xargsaber stellen Sie immer sicher, dass Sie den Hauptprozess sshd, der neue Verbindungen verarbeitet, nicht beenden .

In diesem Zusammenhang sei darauf hingewiesen, dass das Parsen von psAusgaben im Allgemeinen (insbesondere systemübergreifend) aufgrund der Variabilität ihrer Ausgabeformate fehleranfällig ist (hier in hohem Maße durch die Verwendung von -o pid= -o command=).

peterph
quelle
1

Dadurch werden Sitzungen getötet, die mehr als 2 Tage lang hängen. Es könnte als cron gesetzt werden.

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

Dadurch werden alle außer Ihrer (letzten aktiven Sitzung) getötet. Führen Sie dies vom Terminal aus.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Gruslig
quelle