삭제 된 SSH 세션 종료


47

내 주요 세션이 아니지만 SSH 세션이 중단되는 것 같습니다. 주요 문제는 이전 세션이 여전히 살아 있다는 것입니다 visudo.

who 연결이 끊어진 것으로 알고있는 현재 세션을 제외한 여러 세션이 모두 표시됩니다. 이전 세션을 종료하여 리소스를 해제하려면 어떻게해야합니까?


1
특정 터미널에서 모든 것을 죽이는 것이 괜찮다 fuser -k /dev/pts/0who출력 에 터미널 과 같은 것을 만들 수 있습니다. 그러나 SIGHUP을 무시한 사람들은 조금 이상합니다. 그들이 screen세션이나 무언가 에서 달리고 있었습니까 ?
Bratchley

내가 얻는 : 프로세스 1031을 죽일 수 없음 : 그런 프로세스가 없습니다. PuTTY를 사용하는 데 SSH가있는 특별한 것은 없습니다. 새로운 라우터가 비활성 연결을 끊는 데 공격적이라고 생각합니다.하지만 TCP 연결이 종료되면 다른 쪽 끝이 무언가를했을 것이라고 생각했을 것입니다. 아마도 (아직) 알지 못합니까?
markmnl

1
해당 명령이 다른 사용자 ( who더 이상 0이 아님)를 위해 작동하고 있습니다 .
markmnl

"SSH 세션이 떨어지고있는 것 같습니다 ... 가장 큰 문제는 이전 세션이 여전히 살아 있다는 것입니다." 는 모순입니다. 연결이 끊어 졌거나 여전히 연결되어 있습니다. 어쩌면 당신은 당신이 연결을 끊었다가 다시 연결하고 이전 연결이 여전히 실행되고 있음을 알 수 있도록이 결론에 도달했는지 설명해야합니다.
goldilocks

답변:


58

즉각적인 문제를 해결하기 위해 sudoers 파일이 잠겨 있으면 잠금 파일을 삭제하기 만하면됩니다. 일반적으로`/etc/sudoers.tmp "이며, 확인하려면 man 페이지에서 visudo를 확인하십시오. 잠금 파일을 삭제하면 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 세션을 종료합니다. 현재 세션이 유일한 세션이 될 때까지 계속하십시오.

당신은 또한 설정할 수 있습니다 ServerAliveInterval 15당신의 .ssh/config데이터가 전송되지 않은 경우 킵 얼라이브 메시지를 15 초마다 보내. man ssh_config자세한 내용은.


1
CentOS-루트 계정으로 SSH를 사용하는 경우이 답변이 작동하지 않으면 다음을 사용해보십시오. ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}'| xargs 죽이기
알리 Nadalizadeh

감사. 작동합니다. grep -v 12345구문의 일부가 어떤 용도로 사용되는지 확실하지 않습니다 . 포함되지 않은 모든 것을 전달 12345합니까?
주님로.

grep -v 12345"일치하는 모든 행을 제거합니다"를 의미 12345합니다. 따라서 먼저 자신의 세션의 PID를 식별하고 대신 해당 PID를 사용해야합니다 12345.
Jenny D

이러한 모든 세션을 종료하고 사임, 명령 who또는 top여전히 많은 수의 서명 된 사용자를 표시 한 후에도 1 만 표시되어야합니다. 어떻게하면 새로 고칠 수 있습니까?
Ωmega

2

ps -fprocps 와 같이 명령과 인수를 볼 수 있도록 프로세스를 나열하면 다음과 같은 sshd 프로세스가 표시됩니다.

sshd: user@pts/7

터미널 ( pts/7)은 여기서 핵심 부분입니다. 현재 터미널 ( tty) 과 비교하면 활성 세션이 어느 것인지 확인할 수 있습니다. 물론 현재 실행중인 쉘의 PID를보고 프로세스 트리에서 해당 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 일 이상 걸려있는 세션이 종료됩니다. 크론으로 넣을 수 있습니다.

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.