SSH를 통해 로그인한 상태에서 서버를 종료하거나 다시 시작하면 SSH 연결이 중단되거나 정지됩니다. 터미널이 전혀 응답하지 않게 되며 SSH 세션이 연결이 끊어졌음을 인식하는 데 최대 1분이 소요됩니다.
이 문제는 새로운 Debian 12(openssh-server 1:9.2p1-2)에서는 발생하지만 이전 Debian 10에서는 발생하지 않습니다.
Debian 10에서 서버를 다시 시작하면 SSH 연결이 다음 메시지와 함께 즉시 완전히 로그아웃됩니다.
Connection to debian10 closed by remote host.
Connection to debian10 closed.
verbose 옵션을 사용하여 두 서버에 모두 연결한 다음 다시 시작했을 때 몇 가지 차이점을 발견했습니다.
SSH 세션이 깔끔하게 종료됩니다.
$ ssh -vvv -E /tmp/a debian10
debug3: send packet: type 1
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
#0 client-session (t4 r0 i0/0 o0/0 e[write]/0 fd 6/7/8 sock -1 cc -1)
debug3: fd 1 is not O_NONBLOCK
Transferred: sent 4668, received 7428 bytes, in 34.8 seconds
Bytes per second: sent 134.3, received 213.7
debug1: Exit status -1
SSH 세션이 정지됩니다:
$ ssh -vvv -E /tmp/b debian12
debug3: send packet: type 80
debug3: receive packet: type 82
debug3: send packet: type 80
debug3: send packet: type 80
debug3: send packet: type 80
Timeout, server debian12 not responding.
비슷한 질문을 찾았지만 모든 답변은 systemd와 관련이 있다고 제안했습니다. 저는 systemd를 사용하지 않고 두 서버 모두에서 sysvinit를 사용하고 있습니다.
요약하면 두 서버 모두 동일한 SSH 클라이언트를 사용하여 다르게 동작하므로 서버 측에 약간의 차이가 있을 것으로 생각됩니다(아마도 openssh-server의 동작).
고쳐 쓰다:
이것은 내 재시작 순서입니다(런레벨 6):
/etc/rc6.d/K01cron
/etc/rc6.d/K01ssh
/etc/rc6.d/K01urandom
/etc/rc6.d/K02sendsigs
/etc/rc6.d/K03rsyslog
/etc/rc6.d/K05networking
/etc/rc6.d/K06umountfs
/etc/rc6.d/K07umountroot
/etc/rc6.d/K08reboot
데몬 ssh
이 networking
. 그러나 정상적인 종료는 sshd
기존 SSH 연결에 영향을 미치지 않으므로 아무런 영향을 미치지 않습니다.
업데이트 2:
콘솔에 표시되는 종료 순서는 다음과 같습니다.
[ ok Sending processes configured via /etc/ini[....] Stopping: cron
[ ok ] Stopping: sshd
[ ok ] Asking all remaining processes to terminate...done.
[ ok ] All processes ended within 1 seconds...done.
[ ok ] Stopping: rsyslogd
[ ok ] Deconfiguring network interfaces...done.
[ ok ] Will now unmount temporary filesystems: /tmp
[ ok ] Will now unmount local filesystems: /var
[ ok ] Mounting root filesystem read-only...done.
[info] Will now halt.
[79896.954129] reboot: Power down
답변1
근본 원인
표준 systemd 및 sysvinit의 경우, 순서대로 종료하면 데몬이 종료되고 하드웨어가 특정 순서로 구성 해제됩니다. 특히, IP가 아직 살아 있는 동안 sshd
22에서 수신 대기 중인 sshd와 이 sshd가 bash
생성하는 다양한 sshd는 종료하라는 종료 신호를 받아야 합니다. 이러한 신호를 보낸 후 IP 스택은 최소 1초 동안 상태를 유지해야 합니다. 발생한 시간 초과는 이러한 TCP 패킷에 더 이상 응답하지 않는 서버에 대한 열린 연결에서 클라이언트가 TCP 트래픽을 보내는 것과 일치합니다.
debian12 서버에서 /etc/init.d/rc를 확인하세요. 다중 사용자 런레벨 2에서 변경할 때 접두어 K75
등이 붙은 종료 스크립트를 순차적으로 실행하여 데몬을 종료합니다. 네트워크 인터페이스를 종료하기 전에 먼저 sshd
종료 하십시오. ifconfig
다른 두 자리 시퀀스 번호를 사용하도록 스크립트 이름을 바꾸면 실행 순서가 변경됩니다.
sleep
스크립트가 서로 경쟁하는 경우 임시 명령문을 삽입하면 스크립트 속도가 느려질 수 있습니다 .
고정시키다
시스템 로그에 있는 작은 초기화 스크립트의 구불구불한 미로를 살펴보는 데 어려움을 겪고 있는 경우에도 여전히 몇 가지 간단한 해결 방법이 있습니다.
간단한 shutdown -r +1
루트 액세스를 사용하면 불꽃 놀이가 시작되기 전에 CTRL-D를 눌러 ssh에서 정상적으로 연결을 끊을 수 있는 60초의 시간이 제공됩니다.
이와 같은 명령을 사용하면 (sleep 5 && reboot) &
이 작업을 더 짧은 시간에 완료할 수 있습니다. 당신은해야 할 수도 있습니다
북면
또는 disown
pty의 작업 제어에서 백그라운드 프로세스를 분리합니다. 따라서 이 명령에 대한 짧은 스크립트를 만드는 것이 편리할 수 있습니다.
우리에게 알려주세요 변경해야 할 세부 사항당신의체계.
답변2
구성을 확인 /etc/ssh/sshd_config
하고 UsePAM yes
패키지가 설치되어 있는지 확인하세요.libpam-systemd
dbus
systemd-logind는 로컬 및 원격(ssh) 활성 사용자 세션의 기록을 유지하고 생성된 프로세스를 사용자 "슬라이스"에 할당합니다. systemd가 중지되었을 때 올바르게 구성된 경우 SSH 연결을 포함해야 하는 네트워크 연결을 비활성화하기 전에 사용자 슬라이스 내의 모든 항목에 SIGTERM을 실행합니다.