데비안과 sshd를 실행하는 서버가 있으며 서버를 재부팅해야 할 경우 SSH 세션이 TCP 시간 초과까지 클라이언트 측에서 중단됩니다. sshd
종료 될 때 호스트에 대한 열린 SSH 세션을 명시 적으로 닫지 않기 때문 입니다. sshd
먼저 모든 사람의 연결을 끊고 정상적으로 종료 하려면 어떻게해야 합니까? 지금까지는 man sshd_config
종료 동작과 관련된 매개 변수를 볼 수 없습니다 .
데비안과 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
.
reboot
하는 할 shutdown -r
SSH 세션을 닫 시간을두고, 1 분 지연되는 기본값을.
이것은 서버 측이 아닌 클라이언트 측에서 설정해야하는 것입니다. ~/.ssh/config
포함하도록 편집
ServerAliveInterval 15
ServerAliveCountMax 5
이는 15 초 동안 활동이 없으면 클라이언트가 서버에 메시지를 보냅니다. 응답이 없으면 최대 5 번 다시 시도하며 여전히 응답이 없으면 세션을 닫습니다.
슬프게도 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는 재부팅 / 종료 목적으로 서비스를 중지해야합니다.