연결이 끊긴 SSH 세션에 다시 연결하는 방법


156

연결이 끊긴 ssh 세션에 연결하는 방법이 있습니까? 별도로 작업중인 원격 사이트에 대한 네트워크 연결에 문제가 있습니다. 그러나 그 동안 원격 위치의 서버에 연결되어있는 동안 패킷 손실로 인해 많은 수의 연결이 끊어졌습니다. 여러 번 세션이 활성 상태로 유지되는 경우가 종종 있으며 가능한 경우 다시 시작하지 않고 다시 시작해야하는 작업 (파일 편집, 일부 프로세스 실행 등)의 중간에있을 수 있습니다.


10
나는 아무도 mosh.mit.edu
jwbensley

@javano : 들어 본 적이 없다. 답변으로 추가하십시오!
kbyrd

@kbyrd done;)
jwbensley

비슷한 질문에 질문을 받았다 unix.stackexchange.com/questions/105001/... ... 처음에 단선를 해결하는 방법에 관한 몇 가지 힌트와 함께
anarcat

답변:


135

업데이트 : 실제 답변은 아래 zero_r의 답변을 참조하십시오

이것은 대답이 아니라 해결 방법입니다. 화면을 사용하십시오 .

처음 로그인하면 화면을 실행하십시오. 다른 쉘을 얻고 그 안에 명령을 실행하십시오. 연결이 끊어지면 화면 프로세스는 터미널을 활성 상태로 유지하여 쉘과 실행중인 프로세스가 넘어지지 않도록합니다. 다시 연결하면 'screen -r'을 실행하여 다시 시작하십시오.

화면을 구성하고 사용하는 데 더 많은 것이 있지만 위의 문제를 해결해야합니다.


18
또는 '쿨러'화면 인 tmux를 사용하면 용어를 멋지게 나눌 수 있기 때문에 tmux를 많이 사용하고 훨씬 선호합니다.
존 헌트

3
screen우분투 12.x에 이미 설치되어 있다는 것을 알게 되어 기뻤습니다. 이 명령을 시도해도 확실하지 않으면 다시 연결하고 do-release-upgrade 프로세스를 다시 시작했습니다 . sudo screen -D -r
bjm88

1
@ bjm88 sudo은 원래 화면 세션이 sudo로 시작된 경우에만 사용해야합니다. 그렇지 않으면 스크린 세션이없는 것처럼 반환됩니다.There is no screen to be detached
Noam Manos

+1 이것이 실제 답변이 아니라는 것을 알고 있습니다. 그러나 내가 찾던 screen -r것이 바로 그 것입니다.
에릭 넬슨

129

서버 측 sshd.conf에서 ClientAliveInterval (예 : 60) 및 TCPKeepAlive (예 또는 아니요)를 적절한 값으로 설정하십시오.

이렇게하면 몇 분 동안 연결이 끊어 지더라도 세션이 활성 상태로 유지됩니다.


24
지금까지 해결 방법으로 화면을 제안하는 대신 실제로 질문에 대답하는 유일한 사람 인 것 같습니다.
kbyrd

2
잘 했어 우리는이 방법이 cisco ASA / PIX 방화벽을 통과 할 때 특히 유용한 데, 기본적으로 TCP 연결 시간이 초과되는 것을 좋아합니다.
Mike Pountney

5
어쩌면 이것이 올바른 장소는 아니지만 포스터가 답변을 전환 할 수 있습니까? 우리는이 정보와 함께 '스크린'응답을해야합니다 (광산이 가장 좋지 않습니다. Mike Pountney 's를 좋아하지만 담당자를 얻었습니다).
kbyrd

1
Cisco VPN 연결을 통해 연결했는데 VPN 연결이 끊어지고 다시 설정되면이 기능이 작동합니까?
Brent

나를 위해 화면이 완벽하게 작동하려면 선별 된 작업에 다시 연결하고 작동 할 수 있습니다
integratorIT

64

위에서 언급했듯이, GNU Screen 은 갈 길입니다. 원격 상자에 여러 개의 '스크린 창'을 통해 여러 명령을 실행할 수있는 '스크린 세션'을 가질 수 있습니다. 부모 SSH 연결이 끊어지면 분리되어 모든 하위 프로세스가 계속 실행되도록 유지합니다.

' man screen'는 평소와 같이 친구이며 OS 패키지는 screen기본적으로 설치되지 않은 경우 ' ' 라고 합니다.

기본 사항은 다음과 같습니다.

  • 원격 호스트에서 화면 세션을 시작하십시오.

    $ screen
    
  • 화면 세션에서 연결을 끊습니다. CTRL-A,d

  • 다시 로그인 한 후 화면 세션에 다시 연결하십시오.

    $ screen -d -r
    
  • 다른 화면 '창'을여십시오 : CTRL-A,c

  • 다음 CTRL-A과 같은 화면 창을 순환합니다 : ,space

많은 당신이 화면과 함께 할 수있는 멋진 물건은. 나는 그것을 10 년 이상 사용해 왔으며 여전히 새로운 기능을 찾고 있습니다. 내가 가장 좋아하는 유닉스 유틸리티입니다.


1
예, 이것은 내 것보다 훨씬 더 나은 대답입니다.
kbyrd

화면이 실행되는 PC를 재부팅해도 여전히 연결이 끊긴 ssh 세션에 연결할 수 있습니까?
BarathVutukuri

tmux가 더 강력합니다
페가수스

46

나는 아무도 MOSH 를 언급하지 않았다는 것을 믿을 수 없다 .

Mosh는 SSH 로그인 프로세스에 연결할 수있는 별도의 프로토콜로, 연결 끊기, IP 변경, 높은 대기 시간 등으로 며칠 후에도 세션을 유지합니다. 그것은 설명 할 수있는 것보다 홈페이지에 더 잘 설명되어 있으므로 아래 설명을 복사했습니다. 내 경험과 조언은 안드로이드 모바일에서 사용한다는 것입니다. 여행 및 SSH를 할 때 생명을 구하는 것입니다. 예를 들어 기차에서 모바일과 테 더링 할 때 내 노트북에서도 마찬가지입니다. 소스에서 컴파일하여 최신 버전을 얻는 것이 좋습니다. 우분투 내부의 repo 버전은 최신 버전 (작성 당시)에서 수정 된 몇 가지 성가심을 가지고 있습니다.

모쉬 (모바일 쉘)

로밍을 허용하고 간헐적 인 연결을 지원하며 사용자 키 입력의 지능적인 로컬 에코 및 라인 편집 기능을 제공하는 원격 터미널 응용 프로그램입니다.

Mosh는 SSH를 대체합니다. 특히 Wi-Fi, 셀룰러 및 장거리 링크를 통해 더욱 강력하고 반응이 좋습니다.

Mosh는 무료 소프트웨어이며 GNU / Linux, FreeBSD, Solaris, Mac OS X 및 Android에서 사용할 수 있습니다.

웹 사이트의 기능 :

  • IP를 변경하십시오. 연결 상태 유지 : 인터넷 연결간에 이동할 때 Mosh가 자동으로 로밍됩니다. 기차에서 Wi-Fi, 호텔에서 이더넷 및 해변에서 LTE를 사용하십시오. 로그인 상태를 유지합니다. 로밍 후 SSH와 Gmail과 같은 웹 앱을 포함한 대부분의 네트워크 프로그램은 연결이 끊어집니다. 모 쉬는 다릅니다.

  • 달콤한 꿈을 꾸십시오 : Mosh를 사용하면 랩톱을 잠자기 상태로 설정하고 나중에 깨울 수 있습니다. 인터넷 연결이 끊어지면 Mosh에서 경고하지만 네트워크 서비스가 다시 연결되면 연결이 다시 시작됩니다.

  • 네트워크 지연 제거 : SSH는 사용자에게 직접 입력하기 전에 서버의 응답을 기다립니다. 그것은 사용자 인터페이스를 크게 만들 수 있습니다. Mosh는 다릅니다. 입력, 삭제 및 줄 편집에 즉각적인 응답을 제공합니다. 이 기능은 적응 적으로 수행되며 emacs 및 vim과 같은 전체 화면 프로그램에서도 작동합니다. 연결이 잘못되면 뛰어난 예측에 밑줄이 표시되므로 오해되지 않습니다.

  • 권한있는 코드가 없습니다. 데몬 없음 : Mosh를 설치하거나 실행하기 위해 수퍼 유저 일 필요는 없습니다. 클라이언트와 서버는 일반 사용자가 실행하는 실행 파일이며 연결 수명 동안 만 지속됩니다.

  • 동일한 로그인 방법 : Mosh는 네트워크 포트에서 수신 대기하거나 사용자를 인증하지 않습니다. mosh 클라이언트는 SSH를 통해 서버에 로그인하고 사용자는 이전과 동일한 자격 증명 (예 : 비밀번호, 공개 키)을 제공합니다. 그런 다음 Mosh는 mosh 서버를 원격으로 실행하고 UDP를 통해 연결합니다.

  • 터미널 내부에서 실행되지만 더 좋습니다 . Mosh는 ssh와 같은 명령 줄 프로그램입니다. xterm, gnome-terminal, urxvt, Terminal.app, iTerm, emacs, screen 또는 tmux 내에서 사용할 수 있습니다. 그러나 mosh는 처음부터 설계되었으며 UTF-8이라는 하나의 문자 세트 만 지원합니다. 다른 터미널과 SSH의 유니 코드 버그를 수정합니다.

  • Control-C는 훌륭하게 작동합니다 . SSH와 달리 mosh의 UDP 기반 프로토콜은 패킷 손실을 정상적으로 처리하고 네트워크 조건에 따라 프레임 속도를 설정합니다. Mosh는 네트워크 버퍼를 채우지 않으므로 Control-C는
    항상 런 어웨이 프로세스를 중지합니다.


8
Mosh는 ssh 래퍼가 아닙니다. 이는 ssh와 거의 관련이없는 다른 프로토콜입니다 (로그인에는 ssh 만 사용함).
jch February

+1 내 실수입니다.
jwbensley 2016

2
보안은 어떻습니까? 암호화? 키 교환?
Nasir Iqbal

슬프게도 아직 포트 포워딩을 지원하지 않지만 Mosh는 멋지게 보입니다 .
Boann

20

autossh 는 연결을 감시하고 연결이 끊어지면 다시 연결됩니다. Keepalives보다 더 안정적입니다. 스크린 세션에 연결하면 연결을 끊은 곳부터 계속 진행됩니다 ( rscreenautossh와 함께 제공됨 참조 )


1
구성 가능한 keep-alive 외부에서는 본질적으로 세션에 다시 연결할 수 없습니다 (OP가 찾고 있던 것). 그러나 autossh는 ssh 터널, 포트 매핑 등이 필요한 앱에 실제로 도움이 될 수 있습니다.
ives

예 autossh + screen이 좋은 곳입니다. rscreen이를 위해 autossh가 있습니다.
hayalci

Autossh는 mosh보다 낫습니다. 나는 둘 다 사용했다.
Sridhar Sarnobat

Jesse Keating의 블로그 게시물은 screen과 autossh 사용에 관한 것 입니다.
sampablokuper

12

tmux

이것은 고전입니다. 터미널 연결이 끊길 위험이있을 때마다 사용하십시오.

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

그런 식으로, 당신은 다시 작동합니다.


엄청 고마워! tmux를 사용 하여이 작업을 수행하는 방법을 찾고 있었기 때문에 대부분의 사람들이 더 나은 옵션으로 생각합니다.
CoolOppo

10

문제를 해결하기 위해 화면을 설치하고 시작합니다. 스크린을 사용하면 이전 스크린 세션에 다시 연결할 수 있습니다.

그 외에도 screen은 화면 분할, 콘솔보기 등의 멋진 작업을 수행 할 수 있습니다 . 여기여기에서 자세한 정보를 찾을 수 있습니다 .

우선, 연결이 끊어지면

screen -ls

세션을보고

screen -r ${session} 

연결이 끊긴 것에 다시 연결합니다.


4

다른 사람들이 지적했듯이 화면은 일반적으로 가장 적합한 솔루션이며 다른 유용한 기능도 많이 추가합니다.

원격 시스템에서 프로파일을 설정하여 로그인시 화면을 자동으로 시작 및 / 또는 다시 연결하여 연결이 끊어 지므로 필요할 때 화면을 시작하지 않아도됩니다.

http://tlug.dnho.net/?q=node/239를 참조하십시오 (또는 약간 다른 방법으로 수행 된 다른 많은 예제는 Google을 검색 하십시오 ).


3

화면에 대한보다 현대적인 대안으로, 일부 유형의 "가상화"에는 사용할 수 없습니다 (예 : cygwin에서는 "화면"은 가능하지만 설계된 방식으로 인해 "tmux"는 불가능 함)). , 하나의 화면으로 이동하는 것이 좋습니다.


3

화면이 아닌 또 다른 솔루션이 있습니다.

퍼티 트레이를 사용하면 그렇게 할 수 있습니다. 정기 또는 퍼티가 아닌 연결 해제 옵션에 다시 연결 옵션이 있습니다

https://puttytray.goeswhere.com/

다른 옵션과 함께 퍼티의 (완전히 오픈 소스) 포크이며 연결 설정으로 이동하고 '연결 실패시 다시 연결 시도'와 '시작시 다시 연결 시도'의 두 가지 옵션이 있습니다.


1
어. 키로거와 자동 ppk 추출 유틸리티가 제공됩니까?
사슴 사냥꾼

1
나는 당신이 어떻게 든 그것을 요구하는지, 당신의 세부 사항을 훔치고, 완전히 오픈 소스이며, github.com/FauxFaux/PuTTYTray 를보고 싶다면 소스 코드를 github에서 사용할 수 있다고 가정 하고 있습니다. )
munkiepus

great cheers :)
munkiepus

2

ssh 세션이 중단되면 화면이 원격 서버에서 셸 세션을 열린 상태로 유지하지만 ssh 연결이 끊어지는 문제에 대해서는 아무 것도하지 않습니다. zero_r에서 알 수 있듯이 ssh 연결을 유지하고 긴 시간 초과를 유지하십시오.

손실 된 패킷의 원인을 추적하여 문제를 일으키는 것이 아니라 문제를 해결하는 대신 수정하는 것이 좋습니다.


제안 해 주셔서 감사합니다. 우리는 패킷 손실의 근본 문제를 추적하기 위해 노력하고 있습니다. 간단히 알아내는 데 시간이 걸립니다 (매우 까다 롭습니다). 이 문제는 실제로 해결 방법입니다. 언제 연결이 끊어 질지 알 수 없습니다.
palehorse 2016 년

1
많은 노이즈가 발생하지만 strace를 통해 ssh를 실행하고 ssh 연결이 끊어지면 수행중인 작업 /보고를 볼 수 있습니다. 그것은 당신이 이미 알고있는 것이지만 누가 아는지를보고 할 수 있습니다.
David

1

때때로 나는 화면을 실행하는 것을 잊어 버렸고 미완성 된 작업을 잃어 버렸습니다. 이 경우 깨진 SSH 세션에 다시 연결할 수 없지만 실행중인 프로그램을 새 터미널로 다시 지정하고 수행중인 작업을 다시 시작할 수 있습니다 reptyr.

실수로 SSH 세션에서 연결을 끊은 후 가장 먼저 screen연결이 끊어지지 않도록 먼저 실행 해야합니다. 그런 다음 새 세션 ps aux | grep {The process to be resumed}에서 PID를 얻기 위해 실행 하십시오. PID를 사용하면 작업을 계속하기 위해 reptyr {PID}또는 reptyr -T {PID}(하위 프로세스가있는 경우) 시도 할 수 있습니다.

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