비정상적인 ssh 연결을 자동으로 다시 시작하기위한 화면 또는 이와 유사한 기능


18

신뢰할 수없는 wifi 환경에서 ssh를 통해 서버에 연결 해야하는 경우가 종종 있습니다. 서버에서 화면을 실행하므로 연결이 끊어지면 다시 연결하고 화면 세션을 다시 시작하고 중단 한 부분을 가져올 수 있지만 연결 손실은 여전히 ​​큰 시간 싱크입니다. 연결 중에 연결이 끊어지면 서버에서 터미널 창이 멈추는 경향이 있습니다. 해당 탭을 종료하고 새 탭을 열고 서버로 다시 ssh하고 화면 세션을 다시 시작해야합니다. 서버에서 화면을 실행하고 로컬로 화면을 사용 하여이 작업을 시도했습니다. 어느 쪽이든 연결이 끊어지면 얼어 붙는 경향이 있습니다.

자동으로 다시 연결하고 세션을 계속 실행하려고하는 화면과 비슷한 화면이나 화면 자체를 가질 수있는 방법이 있습니까? 따라서 수동으로 다시 연결하지 않아도됩니까? 종종 연결이 끊어지면 아주 짧은 기간 동안 만 발생한다고 생각합니다.

Ubuntu 14.04 LTS, MATE 버전을 사용하고 있습니다. 감사


4
"쉘 윈도우가 멈추는 경향이 있습니다": 로컬 ssh가 연결이 끊 겼음을 알지 못하기 때문입니다. 연결하고 연결을 끊으라고 지시 <Enter>하고 누르 ~.십시오. 마지막 ssh 명령을 반복하여 다시 연결하면됩니다 (예 : 위쪽 화살표 또는 !!).
Alexis

@alexis 더 빠른 재 연결 방법 인 것 같습니다. 감사합니다! 그래도 자동으로 발생하고 싶습니다 ...
Max Williams

답변:


23

당신은 사용하여 볼 수 있었다 mosh: https://mosh.org/

안정적인 인터넷 연결로 '점프'서버를 설정 mosh하여 연결 한 다음 ssh관리하는 각 서버에 대한 세션을 가질 수 있습니다. 점프 서버 사용을 제안하는 이유 mosh는 관리중인 서버 에 설치하지 않을 수 있기 때문 입니다.

또 다른 장점은 moshTCP가 아닌 UDP를 기반으로하며 세션이 IP 주소 변경 (예 : WiFi에서 모바일 인터넷 연결로 변경) 후에도 지속될 수 있다는 것입니다.

명확하게하기 위해을 대신하는 것이 아니라 mosh오히려을 (를 screen) 대체하는 것 ssh입니다. 클라이언트가 어떤 이유로 죽으면 세션에 다시 연결할 수있는 방법을 제공하지 않기 screen때문에 여전히 사용하는 것이 좋습니다 mosh.


고마워, 그것은 하나의 서버 (대부분의 시간)이며 우리는 그것을 소유하고 있으므로 Mosh를 설치할 수 있어야합니다. 제가 그것을 확인해 보겠습니다.
Max Williams

실제로 우리 서버는 꽤 오래 되었기 때문에 (또는 오래된 우분투를 실행하고 있기 때문에) 설치하기가 너무 어렵다는 것이 밝혀졌습니다. :(
Max Williams

@MaxWilliams 몇 살입니까? LTS 12.4조차도 지원에서 벗어났습니다. 그리고 왜 직접 컴파일하지 마십시오
phuclv

mosh 문서를 읽을 때 원격으로 관리하려는 각 호스트에 mosh-server가 필요합니다. 아직도, 확실히 흥미있는.
와일드 카드

1
mosh를 통해 tmux 터미널에 연결하는 것이 가장 안정적인 솔루션입니다.
Nemo

3

나는 tmux몇 년 동안 사용해 왔으며 경험상 자동으로 다시 연결됩니다. 적어도 연결이 비교적 짧은 시간 동안 만 실패하는 경우. 실제로 byobu백엔드로 tmux를 사용합니다. 이 견고성이 두 기능의 특징 tmux인지 byobu또는 그 조합의 특징인지는 모르겠지만 두 가지를 모두 시도해 보는 것이 좋습니다.

로컬 아치 설치에서 VPN을 통해 다양한 원격 우분투 서버에 연결합니다. 리모컨에 연결된 상태에서 네트워크 케이블을 뽑아서 지금 테스트했습니다. 세션이 중단되었지만 케이블을 다시 연결하자마자 원활하게 재개되었습니다.

그러나 라우터를 다시 시작하여 테스트했을 때 연결이 반환되지 않았습니다. 네트워크 중단 시간과 관련이 있다고 가정하지만 몇 초만 중단되면 다시 연결되는 것처럼 보입니다.

관련이있는 경우 terminator터미널 에뮬레이터로 사용 하여이 모든 작업을 수행합니다 .

세 가지 모두 Ubuntu 리포지토리에서 사용할 수 있습니다.

sudo apt-get install tmux terminator byobu

그러나 ssh 연결 끊기를 처리하는 것이 더 낫 tmux거나 확실하지 않습니다 byobu. 나는 단지 내 경험상 종종 짧은 연결 손실로 돌아온다는 것을 알고 있습니다. 그것은 내 구성의 다른 측면에 달려 있습니다.


1
라우터를 다시 시작하면 다른 공용 IP 주소가 제공되어 tcp연결 이 끊어졌을 수 있습니다. 내 경험상 ssh간헐적 인 네트워크 드롭 아웃에 대해 매우 탄력적 일 수 있지만, 이것이 창 tmux안에서 사용하고 있다는 사실과 관련이 있다고 생각하지 않습니다 ssh.
녹슨 섀클 포드

3
평범한 SSH를 사용하더라도 TCP 연결이 끊어지지 않는 한 짧은 연결 끊기를 처리 할 수 ​​있습니다. 어떤 당신의 인터페이스는 종료를 얻을, 또는 지나치게 라우터를 죽이면, (NAT 라우터 재부팅에 NAT 상태를 잊을 수 있으며 기존 연결을 깰), 또는 수 ClientAlive/ ServerAlive내가 무엇을 아무 생각도 없어 ... 트리거를하거나 byobu불구하고, 수행을 .
ilkkachu

예, 그러나 연결 실패로 인해 OP가 멈추고있는 것처럼 보입니다. 그러나 그렇습니다. 맞습니다. 간단한 ssh와 tmux가없는 것도 있습니다. 그럼에도 불구하고 화면이이를 처리 할 수 ​​없습니까?
terdon

2
@MaxWilliams tmux는 기본적으로보다 현대적인 대안 screen입니다. 내가 지금처럼 일을 시작하고 이런 종류의 일이 필요했을 때, 내 커서 독서는 tmux요즘 더 나은 선택 이라고 제안했습니다 . 또한 손실 된 연결을보다 잘 관리 할 수 ​​있다고 100 % 확신하지 못합니다. 경험상 짧은 중단에서 복구한다는 사실 만 알고 있습니다. 그게 아니면 tmux다른 것이 든 모르겠습니다. 그러나 시도해 볼 가치가있는 것 같습니다 :). Byobu는 기본적으로 GUI 터미널 에뮬레이터가 아닌 screen / tmux의 프론트 엔드입니다. 비록 유용합니다 : byobu.org
terdon

2
tmux는 연결 중단에 대해 아무 것도하지 않습니다. ssh에서 제공하는 터미널 장치와 작동합니다. 그것은 모두 ssh 연결과 함께 서 있습니다.
Jonas Schäfer 2016 년

2

ssh의 ServerAlive옵션을 사용 하여 연결이 실패한시기를 감지 하십시오 .

ServerAliveCountMax
ssh (1)가 서버로부터 메시지를 다시받지 않고 전송 될 수있는 서버 활성 메시지 수 (아래 참조)를 설정합니다. 서버 활성 메시지가 전송되는 동안이 임계 값에 도달하면 ssh가 서버와의 연결을 끊고 세션을 종료합니다. 서버 작동 메시지 사용은 TCPKeepAlive (아래)와 매우 다릅니다. 서버 활성 메시지는 암호화 된 채널을 통해 전송되므로 스푸핑 할 수 없습니다. TCPKeepAlive에 의해 활성화 된 TCP keepalive 옵션은 스푸핑 가능합니다. 서버 작동 메커니즘은 클라이언트 또는 서버가 연결이 비활성화 된시기를 아는 것에 의존 할 때 유용합니다.

기본값은 3입니다. 예를 들어 ServerAliveInterval (아래 참조)이 15로 설정되어 있고 ServerAliveCountMax가 기본값으로 남아 있으면 서버가 응답하지 않으면 ssh가 약 45 초 후에 연결이 끊어집니다.

ServerAliveInterval
서버에서 데이터가 수신되지 않은 경우 ssh (1)는 서버에서 응답을 요청하기 위해 암호화 된 채널을 통해 메시지를 보내는 시간 초과 간격 (초)을 설정합니다. 기본값은 0이며 이러한 메시지가 서버로 전송되지 않음을 나타냅니다.

따라서 ServerAliveInterval5로 설정 ssh하면 네트워크가 15 초 동안 작동하지 않으면 자동으로 연결이 끊어집니다.


SSH 세션을 강제로 중단하려면 이스케이프 문자 와 세션을 중단하는 명령 으로 구성된 ~.(또는 먼저 Enter를 누른 다음 ~.)를 누릅니다~.
imz-Ivan Zakharyaschev

@ imz--IvanZakharyaschev 연결이 끊 겼음을 알 수 있다고 가정합니다. SSH의 keepalive를 사용하면 오류가 자동으로 감지됩니다.
Barmar

정말 유용한 것 같습니다. 고마워요. 다음에 내가 "박편이 나는 구역"에있을 때는 확실히 시도 할 것입니다.
Max Williams

@Barmar 그렇습니다. 또한 연결이 실제로 끊어 졌는지 또는 실수로 무언가를 누르면이 키를 원격쪽으로 보낼 수 있는지 결정하는 문제에 대해 생각했습니다 ... 그리고 좋은 해결책을 모르겠습니다.
imz-Ivan Zakharyaschev

2

비슷한 조건에서 나는 eshellEmacs 내부에서 TRAMP (over ssh)와 함께 사용하는 경향이 있습니다 . TRAMP는 원격 쉘에 원하는 명령을 제공하는 데 많은 어려움을 겪지 않고 필요할 때 다시 연결을 관리합니다.

그러나 eshell은 터미널로 적합하지 않습니다. 즉, 터미널에서 특수한 작업을 수행하거나 무언가를 지속적으로 (증분 적으로) 인쇄하는 명령을 실행하는 데 적합하지 않습니다.

기본적으로 TRAMP와 함께 Emacs에서 사용을 시작하는 것은 매우 간단합니다.

M-x eshell
cd /user@host:

1

기권

SSH 연결이 짧은 네트워크 중단에서 살아남지 않으면ssh TCP가 정상적인 작업을 수행하지 못하게하는 다른 일이 발생합니다.

자세한 내용은 아래를 참조하십시오. 어쨌든:

가장 빠르고 독립적 인 무 종속 솔루션

다음과 같은 쉘 스크립트를 작성하십시오.

#!/bin/sh -

# Tune these numbers depending on how aggressively
# you want your SSH session to get reconnected.
timeout_options='-o ServerAliveInterval=4 -o ServerAliveCountMax=2'

# 255 is the status OpenSSH uses to signal SSH errors, which
# means we want to connect. All other exit statuses suggest
# an intentional exit.
status=255

# Keep opening the SSH connection and immediately dropping into
# `screen` until an intentional exit happens.
while [ "$status" = 255 ]
do
    ssh $timeout_options -t "$@" screen -dR
    status=$?
    # You can add a `sleep` command here or a counter or whatever
    # you might need as far as rate/retry limiting.
done
exit "$status"

이것은 연결 ssh하고 연결을 계속 시도하는 어리 석고 단순한 루프를 실행합니다 screen. 호스트 또는 일반적으로 ssh호출에 명령 행 인수로 전달할 다른 것을 전달하십시오 .

재 연결은 SSH가 연결에 오류를보고하는지 여부를 기반으로합니다. 즉, "당신은 문자 그대로 WiFI가 켜져 있지 않습니다"와 같은 SSH 이외의 오류를 감지 할 수있는 지능이 없습니다. 당신.

나는 당신이 ssh-agent암호를 입력하지 않은 SSH 키 를 가지고 있다고 가정 하고 있습니다.

^C다시 연결하는 동안 사람이 인식 할 수없는 순간의 1 초 동안 적중 ^C하면 클라이언트 터미널로 연결하는 대신 스크립트를 종료시킬 수있는 작은 경합 조건이 생길 수 있습니다. ^C너무 열심히 으 깨지 마십시오 .

가장 간단한 추가 소프트웨어 솔루션

autossh 프로그램을 사용해보십시오.이 프로그램 은 Ubuntu 패키지 저장소에서 사용할 수 있습니다.

당신은 소스 또는 감사 그것에서 구축해야하는 경우 종속 등의 추가 라이브러리없이 컴파일은, 위의 내 해킹보다 연결 생기 확인에 대한 자세한 정보를 갖고있는 것 같아요 것을 하나의 C 프로그램입니다, 그리고 그것은 또한 편리와 함께 제공 rscreen되는 자동 스크립트 명령 에 첨부합니다 screen.

세부

ssh정상적으로 복구 하는 방법

확인하기 위해, 나는 스스로 확인하지 않고 말을 좋아하지 않기 때문에 대답하기 전에 약간의 테스트를 실시했습니다.

Linux 장치로 WiFi를 사용하고 LAN의 다른 장치에 SSH로 연결하고 다른 ssh쪽 끝 으로 작업 연결이 있는지 확인한 후 (명령을 실행할 수 있음 등) 클라이언트 에서 WiFi 연결을 끊었습니다 (인터페이스를 유발 함). 구성 해제 : 더 이상 IP 주소 없음), 더 많은 문자를 ssh 세션에 입력 한 다음 (응답 없음) WiFi에 다시 연결했습니다. 나쁜 신호 및 기타 요인으로 인해 연결이 실제로 한 번 이상 실패했습니다. 그런 다음 마침내 다시 연결되었습니다. ssh세션이 복구 될 때까지 약 5 초 동안 기다렸는데 아무 일도 일어나지 않아 하나 더 많은 키를 누르고 ssh세션 중에 즉시 연결이 끊어졌습니다. 연결을 끊는 동안 입력 한 모든 키가 명령 줄에 나타납니다.

참조 ssh만 / 기록하는 OS가 뭔가 잘못을 이야기하고, TCP 실제로 때까지 TCP 네트워크 소켓에 읽고 아주 장시간 연결 방울의 허용.

기본 커널 설정을 가진 자체 장치를 남겨두고 Linux의 TCP 스택은 연결이 끊어 졌다고 선언하고 오류를보고하기 전에 몇 분 동안 완전히 침묵하는 연결을 행복하게 허용합니다. ssh결국 포기할 때까지 ~ 30 분 또는 적어도 1 분 또는 1 분 동안 지속되는 연결 딸꾹질을 견딜 수있을만큼 충분히 길어야합니다.

덮개 아래에서 Linux TCP 스택은 점점 더 길고 지연된 메시지를 점차 재 시도합니다. 즉, 연결이 다시 시작될 때 ssh세션이 다시 "작동" 하기 전에 추가 지연이 발생할 수 있습니다 .

왜 이것이 깨지는가

TCP 스택이 허용 할 수있는 양보다 비 활동 기간이 상당히 짧은 후에 연결이 닫히는 원인이 있을 수 있습니다 ssh. 그런 다음 해당 연결 상태를 클라이언트 에보고하지 않습니다 .

후보는 다음과 같습니다.

  1. 방화벽 또는 NAT 라우터는 메모리를 사용하여 각 라이브 TCP 연결을 기억해야합니다. 도스 공격에 대한 최적화 및 일부 완화 방법으로 때로는 연결을 잊어 버린 다음 후속 패킷을 자동으로 무시 합니다. 기존 연결이 기억 나지 않을 때 연결 중간에 잘못된 것으로 보입니다.

  2. 더 잘 작동하는 방화벽 / 라우터는 일반적으로 connection reset by peer오류 메시지 로 나타나는 TCP RST 패킷을 주입 하지만 재설정 패킷은 화재와 잊어 버리기 때문에 클라이언트와의 연결에 여전히 문제가있는 경우 패킷도 재설정하면 클라이언트가 연결이 여전히 유효하다고 생각합니다.

  3. 서버 자체에 예기치 않은 패킷을 자동으로 삭제하는 방화벽 정책이있을 수 있습니다. 이로 인해 서버는 연결이 닫힌 것으로 생각하지만 클라이언트는 그렇지 않을 때마다 클라이언트의 연결 재개 시도가 중단됩니다. 클라이언트는 계속 연결을 시도하지만 서버는 단지 이러한 패킷이 서버의 방화벽 상태에 속하는 라이브 연결이 없기 때문에 무시합니다.

    Linux를 실행하고 있으므로 서버의 iptables/ ip6tables(또는 nft새로운 것을 사용하는 경우) 허용하고 떨어지는 것을 정확히 확인하십시오. 그것은 수 있도록하는 것은 매우 흔한 일 / 설정 / 관련 하는 TCP SSH 포트에 패킷을하지만, 하지 "무효"사람은 - 당신이 허용되지 않습니다 자동으로 모든 것을 포기하는 경우,이 일반적인 설치는 간단한 연결 문제 후 정지 이러한 종류의 원인이 될 수 .

  4. TCP 또는 SSH 클라이언트 연결 유지 패킷에 대한 OpenSSH 옵션 중 하나를 사용하여 일정 기간 동안 활동이 없으면 연결을 닫도록 SSH 서버 자체가 구성 될 수 있습니다. 그 자체만으로도 무한 정지가 발생하지는 않지만 위에서 설명한 상태 중 하나에 놓일 수 있습니다.

  5. ssh세션이 중단 된 상태가 된 후 자체적으로 "충분한"시간을 갖지 못할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.