종료 / 재부팅시 SSH 세션이 정지됨 세션이 TCP 시간

데비안과 sshd를 실행하는 서버가 있으며 서버를 재부팅해야 할 경우 SSH 세션이 TCP 시간 초과까지 클라이언트 측에서 중단됩니다. sshd종료 될 때 호스트에 대한 열린 SSH 세션을 명시 적으로 닫지 않기 때문 입니다. sshd먼저 모든 사람의 연결을 끊고 정상적으로 종료 하려면 어떻게해야 합니까? 지금까지는 man sshd_config종료 동작과 관련된 매개 변수를 볼 수 없습니다 .



답변

시스템을 종료하거나 재부팅 할 때 systemd모든 서비스를 가능한 빨리 중지하십시오. 여기에는 네트워크를 중단하고 여전히 살아있는 모든 프로세스를 종료합니다 (보통 순서대로). 따라서 systemd가 SSH 세션을 처리하는 분기 된 SSH 프로세스를 종료하면 네트워크 연결이 이미 비활성화되어 있으며 클라이언트 연결을 정상적으로 닫을 방법이 없습니다.

첫 번째 생각은 종료하는 동안 첫 번째 단계로 모든 SSH 프로세스를 강제 종료하는 것일 수 있으며,이를 수행하는 시스템화 된 서비스 파일이 꽤 있습니다.

그러나 물론 더 깔끔한 해결책이 있습니다 ( “추천 된 방법”) systemd-logind.
systemd-logind활성 사용자 세션 (로컬 및 SSH 세션)을 추적하고 세션 내에 생성 된 모든 프로세스를 소위 “슬라이스”에 할당합니다. 이렇게하면 시스템이 종료 될 때 systemd는 사용자 슬라이스 내부의 모든 항목 (특정 세션을 처리하는 분기 된 SSH 프로세스 포함)을 SIGTERM 한 다음 서비스와 네트워크를 계속 종료 할 수 있습니다.

systemd-logind새 사용자 세션에 대한 알림을 받으려면 PAM 모듈이 필요 하며 상태를 확인하는 dbus데 사용해야 loginctl하므로 다음 두 가지를 모두 설치하십시오.

apt-get install libpam-systemd dbus

확실히 당신은 할 수 /etc/ssh/sshd_config실제로와 모듈을 사용하는 것입니다 UsePAM yes.


답변

이것은 서버 측이 아닌 클라이언트 측에서 설정해야하는 것입니다. ~/.ssh/config포함하도록 편집

ServerAliveInterval 15
ServerAliveCountMax 5

이는 15 초 동안 활동이 없으면 클라이언트가 서버에 메시지를 보냅니다. 응답이 없으면 최대 5 번 다시 시도하며 여전히 응답이 없으면 세션을 닫습니다.


답변

이 동작은이 데비안 버그 에서 보고되며 , 자동으로 기본적으로 복사되지 않기 때문에 패키지와 함께 제공되는 종료 스크립트 만 올바르게 설정하면됩니다.

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service


답변

다음과 같이 하나의 ssh 명령에 대해서만 Jenny D가 답변에서 언급 한 옵션을 지정할 수 있습니다.

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

자주 그렇게하면 스크립트를 작성할 수 있습니다.


답변

lshd와 함께 나를 위해 일합니다. 그래서 해결책은

apt install lsh-server
apt remove openssh-server


답변

슬프게도 serverfault는 몇 년 동안 스레드 원인으로 너무 적은 점수로 대답하지 못했습니다. 하지만 잠금을 해제하기 위해 다른 블로그에서 스팸을 할 필요는 없습니다.

Rfraile이 언급했듯이

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

공장. 인스턴스 / 서버를 재부팅하지 않고 사용하려면 추가 작업을 수행해야합니다.

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

따라서 서비스가 등록 및 시작되었으며 systemd는 재부팅 / 종료 목적으로 서비스를 중지해야합니다.


답변