SSH 연결이 끊어졌을 때 왜 콘솔이 영원히 멈추는가?


89

나는 많은 콘솔 (Linux, Mac 등)과 많은 다른 네트워크의 많은 다른 머신에서 이것을 보았습니다. 정확한 이유를 정확히 알 수는 없습니다. 그 이유는 다음과 같습니다. SSH를 통해 컴퓨터에 로그인하기 만하면됩니다. 어떤 이유로 연결이 끊어지면 (간단히 네트워크 케이블을 뽑았다 고 가정 해 보자) 때로는 콘솔이 영원히 멈추는 경우가 있습니다. 다른 경우에는 부모 쉘로 잘 빠져 나옵니다.

이런 일이 발생하면 짜증이납니다 (예 : 명령 기록을 잃어 버립니다) 강제 종료 할 수있는 비밀 키보드 단축키가 있습니까 (Ctrl-C 또는 Ctrl-D가 작동하지 않음)? 그리고 어쨌든 모든 구현에서이 임의의 "버그"가 발생하는 이유는 무엇입니까?


이 스레드는 로밍 (IP 변경) 및 기타 사항을 포함하여 연결 실패를 잘 처리하는 Mosh (Mobile Shell) 를 언급하는 데 적합합니다 .
Ciprian Tomoiagă

답변:


137

종료를 강제하는 "비밀"키보드 단축키가 있습니다. ~) 고정 된 세션에서 다음 키를 순서대로 누르 Enter~.십시오. 고객이 더 이상 고민하지 않고 사업을 종료합니다.

통신 문제에 대한 오래 걸리는 행동은 버그가 아니며 SSH 세션이 다른 쪽이 다시 오기를 바라며 끊어집니다. 네트워크가 중단되면 때로는 며칠 후에 SSH 세션을 다시받을 수 있습니다. 물론 위의 순서대로 포기하고 죽으라고 말할 수 있습니다. 클라이언트에서 연결 유지 시간 초과를 설정하여 일정 시간 동안 활성 링크가없는 경우 자체적으로 종료되도록 기본 설정과 같은 다양한 작업을 수행 할 수 있지만 기본 동작은 다음과 같습니다. 가능한 연결!

편집 : 이 인터럽트 키의 또 다른 유용한 응용 프로그램은 로컬 ssh 클라이언트의 관심을 끌고 잠깐 동안 로컬 셸로 돌아와서 (역사에서 무언가를 얻는 것과 같이) 원격으로 계속 작동하도록하는 것입니다. Enter~ Ctrl+ Zssh 클라이언트를 로컬 쉘의 백그라운드 작업 큐로 보낸 다음 fg정상적으로 돌아가십시오.

편집 : 중첩 된 SSH 세션을 처리 할 때 여러 틸드 문자를 추가하여 체인의 SSH 세션 중 하나만 분리하고 나머지는 유지 할 수 있습니다. 예를 들어, 3 단계로 중첩 된 경우 (예 : local-> Machine1-> Machine2-> Machine3에서 ssh) Enter~.로컬 세션으로 돌아가서 Enter~~.Machine1에 Enter~~~.남겨두고 Machine2에 남겨 둡니다. . 이것은 ssh 세션을 일시적으로 백그라운드로 이동하는 것과 같은 다른 이스케이프 시퀀스에서도 작동합니다. 위는 물결표를 더 추가하여 모든 수준의 중첩에서 작동합니다.

마지막으로 사용 Enter~?가능한 이스케이프 명령의 도움말 메뉴를 인쇄하는 데 사용할 수 있습니다.

TL; DR-지원되는 이스케이프 명령은 지원되는 이스케이프 시퀀스입니다.

 ~.   - terminate connection (and any multiplexed sessions)
 ~B   - send a BREAK to the remote system
 ~C   - open a command line
 ~R   - request rekey
 ~V/v - decrease/increase verbosity (LogLevel)
 ~^Z  - suspend ssh
 ~#   - list forwarded connections
 ~&   - background ssh (when waiting for connections to terminate)
 ~?   - this message
 ~~   - send the escape character by typing it twice
(Note that escapes are only recognized immediately after newline.)

11
머리에 sshd를 촬영하기위한 dodecatouple-secret-probation 암호를 알고 +1. 내가했던 것과 같은 방식으로 ( ~/.somethingorotherEnter를 치고 난 후에 엉망이 된) 그것을 알았 습니까?
voretaq7

2
@ voretaq7 : 아니, 난 그렇게 똑똑하지 않았지만 누군가 나를 실마리로 보았을 때 나는 정말로 갔다. “그러면 그 때마다 쉘이 BANG에 갔다! . 언급 한 유형의 잘못된 유형을 제외하고는 일반적인 순서는 아니지만 발생할 수 있습니다.
Caleb

14
"비밀"은 "맨 페이지"를 의미합니다.
larsks

4
많은 사람들이 이것에 대해 알지 못하지만 실제로는 분명한 비밀입니다. 섹션 man ssh아래에서 이것을 다룹니다 ESCAPE CHARACTERS. ~.(연결 끊기) 및 ~^Z(배경 ssh)는 매우 편리합니다.
Stefan Lasiewski 2018 년

9
물론 그것은 man 페이지에 있습니다 :) OP가했기 때문에 비밀 단어 만 사용했고 뺨에 혀를 사용하고있었습니다. 이 기능의 문제점은 사람들이 어디를 찾아야하는지 알지 못하고 제어 문자 및 신호가 쉘 등의 일부가 될 것으로 예상한다는 것입니다. 어디를 보거나 무엇을 물어 보면 알 수 있습니다.
Caleb

12

SSH는 연결 유지 기능을 제공합니다. 로컬에 다음을 추가하십시오 ~/.ssh/config(없는 경우 작성).

ServerAliveInterval 15
ServerAliveCount 3

이 설정은 보안 터널을 통해 15 초마다 전송 유지 신호를 설정합니다. 세 번 연속 실패하면 SSH 클라이언트가 종료됩니다.

일부 시스템 (macOS 10.14 포함)의 경우 다음과 같아야합니다.

ServerAliveInterval 15
ServerAliveCountMax 3

ask.ubuntu 의이 답변에서 가져온 것 : https://askubuntu.com/a/29967/30266


9

정지한다는 사실은 SSH가 아니라 TCP의 기능입니다. TCP가 연결을 사용하여 더 이상 연결이 없음을 응용 프로그램에 알리지 않으면 응용 프로그램은 TCP 세션 / 연결이 끊어 졌음을 알 수 없습니다. 각 호스트의 관점에서 볼 때 TCP 세션은 여전히 ​​확립 상태에 있으며, 긴 유휴 (데이터 흐름 없음) 세션이 RST 외에 유효하지 않다거나 TCP 연결 유지 패킷에 대한 응답이 없다는 것 외에는 말할 것도 없습니다. 보편적으로 구현되지 않았습니다). 그것은 SSH의 버그 인 것처럼 보이지 않습니다. 나는 그 행동을 기대합니다.


5

연결이 제대로 중단 된 경우 키를 누르기 전에 연결이 이미 중단되어 마법의 키 입력이 발생하지 않습니다. 클라이언트에게 종료하도록 지시 할 수 있지만 이것은 서버 측에 보관 된 (또는 그렇지 않은) 기록에 영향을 미치지 않습니다.

이 실제로 줄일 수있는 질문에 대답하지 않지만 연결의 효과가 중지 : 내가 원격으로 일하고 있어요 (심지어 보통 아니에요 때) 내가 통해 실행할 때 screen(함께 또는없이 byobu가용성에 따라 래퍼) 연결이 끊어지면 모든 기록과 함께 내 세션이 유지되고 다시 연결할 때 나가는 상태로 유지됩니다.


6
화면에 대한 귀하의 제안은 훌륭하지만 첫 번째 비트는 실제로 문제에 적용되지 않습니다. 원격쪽으로 키를 가져올 필요가 없으며 LOCAL ssh 클라이언트로 키를 가져와야합니다! OP는 역사를 포함하여 자신의 로컬 쉘을 원합니다. SSH는 그것을 인수하고 CTRL-C와 같은 정상적인 중단 순서에 응답하지 않습니다. 로컬 클라이언트를 통해 종료하고 종료하는 방법이 있습니다. 내 답변을 참조하십시오. 쉘 구성에 따라 다시 로그인하면 일반적으로 로컬 엔드의 히스토리가 유지됩니다.
Caleb

2
@Caleb : 질문은 구체적으로 기록 손실을 언급했으며 명령 기록은 서버 측에 저장됩니다. 서버에 히스토리와 다른 작업을하도록 지시하려면 서버에 히스토리와 다른 작업을 지시하는 메시지를 가져와야합니다. 물론 떠들썩한 파티를 만드는 방법 (그리고 다른 쉘) 레코드의 역사 라인은 사용자가 제대로와 쉘이 존재 때까지 RAM에서 그들을 수집 않고 즉시가 exit/ logout사용하지 않고 역사 문제를 해결할 것입니다 screen.
David Spillett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.