it-swarm.com.de

Beenden Sie abgebrochene SSH-Sitzungen

Meine SSH-Sitzungen scheinen zu fallen, obwohl dies nicht mein Hauptproblem ist - das Hauptproblem ist, dass meine vorherigen Sitzungen noch am Leben sind, schlimmer noch, dass eine von ihnen ausgeführt wird visudo und mich daran hindert, darauf zuzugreifen!

who zeigt eine Reihe von Sitzungen an, mit Ausnahme meiner aktuellen Sitzung, von der ich weiß, dass sie getrennt wurde. Wie kann ich die alten beenden, damit ihre Ressourcen freigegeben werden?

52
markmnl

Um das unmittelbare Problem zu lösen, dass die sudoers-Datei gesperrt ist, können Sie die Sperrdatei einfach löschen. Normalerweise lautet es "/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 ist, tun Sie dies

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

Möglicherweise möchten Sie dies zuerst ohne den letzten | sh Tun, um nur 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.

Möglicherweise möchten Sie auch ServerAliveInterval 15 In Ihrem .ssh/config Einstellen, um alle 15 Sekunden eine Keepalive-Nachricht zu senden, wenn keine Daten gesendet wurden. man ssh_config Für weitere Informationen.

63
Jenny D

Dadurch werden Sitzungen beendet, die länger als 2 Tage hängen. Es könnte als Cron gestellt werden.

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

Dies wird alle außer Ihrer (letzte aktive Sitzung) töten. 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
2
Spooky

Wenn Sie Prozesse so auflisten, dass Sie deren Befehl und Argumente sehen (wie z. B. ps -f Von procps), sollten Sie sshd-Prozesse sehen, die z.

sshd: [email protected]/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 betrachten und diese im Prozessbaum zu finden), aber dies ist wahrscheinlich die einfachste. Sie können dann etwas in diese 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 mit xargs aber füttern - stellen Sie immer sicher, dass Sie den Hauptprozess sshd, der neue Verbindungen behandelt, nicht beenden.

Beachten Sie in diesem Zusammenhang, dass das Parsen der Ausgabe von ps aufgrund der Variabilität der Ausgabeformate (hier durch die Verwendung von -o pid= -o command=).

2
peterph