ドロップされたSSHセッションを終了する


47

SSHセッションはドロップしているように見えますが、それは私の大きな問題ではありません。大きな問題は、以前のセッションがまだ生きているvisudoことです。

who 現在のセッション以外のセッションがすべて表示されますが、古いセッションを終了してリソースを解放するにはどうすればよいですか?


1
特定の端末ですべてを強制終了しても大丈夫なfuser -k /dev/pts/0場合は、who出力に表示されるような端末を使用できます。ただし、これらすべてがSIGHUPを無視したのは少し奇妙です。彼らはscreenセッションまたは何かで実行されていましたか?
ブラッチリー14年

私は得る:プロセス1031を殺すことができませんでした:そのようなプロセスはありません。PuTTYの使用に特別なものは何もありません-私の新しいルーターは非アクティブな接続のドロップに積極的だと思います-TCP接続が終了すると、もう一方の端が何かをするだろうと思っていたでしょう-おそらく(まだ)知らないでしょうか?
markmnl 14年

1
そのコマンドが他のユーザーに対して機能していることを更新します(whoもう0ではありません)、ありがとう!
markmnl 14年

「しかし、私のSSHセッションは落ちているようです...主な問題は私の以前のセッションがまだ生きていることです」は少し矛盾しています。それらは切断されているか、まだ接続されています。たぶん、あなたはこの結論に達した方法を説明する必要があります。その結果、あなたは切断されてから再び接続し、古い接続がまだ実行されていることに気付くでしょう。
goldilocks 14年

回答:


58

sudoersファイルがロックされているという差し迫った問題を解決するには、ロックファイルを削除するだけです。通常は `/etc/sudoers.tmp"になります。visudoのmanページで確認してください。ロックファイルを削除した場合は、visudoを再度実行できます。

ハングしたままになっているすべてのセッションを削除するには、まず現在のセッションのPIDを見つけます。次に、独自のPIDが12345の場合、実行します

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

| sh殺すことを計画しているPIDを確認するためだけに、最後の最初なしでそれを行うことができます。

Linuxを使用している場合は、代わりに使用できます

pkill -o -u YOURUSERNAME sshd

最も古いSSHセッションを強制終了します。現在のセッションが残り1つになるまで、これを繰り返します。

データが送信されていないときに15秒ごとにキープアライブメッセージを送信するように設定することもできServerAliveInterval 15ます.ssh/configman ssh_config詳細については。


1
CentOSで-ルートアカウントにSSHで接続している場合、この回答は機能しません。次を使用してみてください。grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargsを殺す
アリNadalizadeh

ありがとう。これは動作します。grep -v 12345構文の一部がどのような目的に役立つのか分かりませんか?含まれていないものをすべて渡します12345か?
ローLord。

grep -v 12345「一致する行の一致12345を削除する」ことを意味します。したがって、まず自分のセッションのPIDを識別し、の代わりにそのPIDを使用する必要があり12345ます。
ジェニーD

そのようなすべてのセッションを強制終了し、再署名、コマンド、whoまたはtop署名済みユーザーの古い数を表示した後でも、1だけを表示する必要があります。
オメガ

2

プロセスをリストして、それらのコマンドと引数が表示されるように(たとえばps -f、procpsから表示されるように)、sshdプロセスが表示されます(例:

sshd: user@pts/7

ここではターミナル(pts/7)が重要な部分です。現在のターミナル(tty)と比較すると、アクティブなセッションがわかります。もちろん、他の方法もあります(現在実行中のシェルのPIDを調べて、プロセスツリーでそのシェルを見つけるなど)が、これはおそらく最も簡単な方法です。その後、次の行に沿って何かを使用できます。

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

あなたは、その後に殺すためにPIDを養うことができますxargsが、常にあなたがメイン殺さない作るsshd新しい接続を処理するプロセスを

関連する注意事項として、非常に一般的な解析ps出力は(特にさまざまなシステムで)エラーが発生しやすいことに注意してください(出力形式のばらつきが大きいため-o pid= -o command=)。


1

これにより、2日以上ハングしているセッションが強制終了されます。cronとして配置できます。

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

これにより、(最後のアクティブセッション)以外のすべてが終了します。これをターミナルから実行します。

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.