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


13

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


1
다른 모든 방법이 실패하면 [Enter] [~] [.]를 눌러 언제든지 SSH 클라이언트를 종료 할 수 있습니다. 실제로 문제를 해결하는 방법에 대한 설명.
n.st

답변:


32

시스템을 종료하거나 재부팅 할 때 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.


목표가 달성되었으며 설명해 주셔서 감사합니다. (종료를위한 종속성 제어 방법을 원하지만 작업을 완료하는 동안 모든 것이 가장 먼저 SIGTERM이 되려면 계층화 된 솔루션으로 수행 할 수 있습니다.)
Vesper

어떤 이유로 StackOverflow 만 방문하는 동안 답변에 대한 알림을받지 못했습니다. 기묘한.
Vesper

1
간단히 말해서, 셧다운시 몇 초만 면도하려면 연결이 제대로 종료되도록 전체 쓰레기를 설치해야합니까? 진심으로? 이것은 엉망입니다. 우린 운명이야
leucos

3
libpam-systemd 및 dbus를 설치 한 후 tjhe가 처음 재부팅하면 여전히 SSH 세션이 중단됩니다. 대신,이를 방지하기 위해 reboot하는 할 shutdown -rSSH 세션을 닫 시간을두고, 1 분 지연되는 기본값을.
mivk

9

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

ServerAliveInterval 15
ServerAliveCountMax 5

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


2
이로 인해 ssh 클라이언트가 서버 종료를보고하기 전에 75 초의 지연이 발생합니다. 권리?
Vesper

1
예. 시간 초과를 줄 이도록 매개 변수를 조정할 수 있습니다.
Tero Kilkanen

이것은 나를 위해 문제를 해결했습니다. 그런 짜증나는 문제.
Justin Andrusk 2016 년

5

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

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

1

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

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

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


0

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

apt install lsh-server
apt remove openssh-server

0

슬프게도 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는 재부팅 / 종료 목적으로 서비스를 중지해야합니다.


그래서 당신은 또 다른 대답을 반복하고 있습니까?
RalfFriedl

아니? 내가 쓴대로 아직 답장을 할 수 없기 때문에 상단 답장에 대한 참조로 두 줄만 사용했습니다. 재부팅하지 않고 사용하는 데 필요한 단계를 추가했습니다. 이것은 다른 질문 스레드에서도 주어질 수 있지만 체크 아웃하지 않았습니다.
Reiner030 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.