파이프가 파손 된 후 ssh 세션에 어떻게 다시 연결할 수 있습니까?


28

그래서 apt-get upgrade라우터가 마지막으로 화가 나서 너무 오래되었다고 판단했을 때 서버 에서 실행 중이었습니다 . 모든 연결이 끊어졌습니다. 이야기 screen의 교훈은 붐 라우터에있을 때 많이 사용 하는 것입니다.

어쨌든, 나는 다시 로그인하여 프로세스가 여전히 거기에 매달려 있음을 알았으며 여전히 Y / n이 업그레이드 될 때까지 기다렸다 (아직 운이 맞지 않았다). 중단 된 세션에 다시 연결할 수있는 방법이 있습니까? 나는 패키지 관리의 중간에 없었기 때문에 그것을 죽였습니다.하지만 나중에 참조 할 수 있으면 좋을 것입니다.


1
apt-get프로세스가 여전히 실행중인 것에 놀랐습니다 . SSH까지 전체 프로세스 체인과 함께 죽었을 것입니다. 나는 / 세션 do-dist-upgrade에서 자동으로 시작 한다는 것을 알았습니다 . 어쩌면 어떤 상황에서는 동일합니까? screenbyobuapt-get
nfirvine

답변:


16

당신의 적절한 질문에 대한 대답은 : 당신은 할 수 없습니다 . 주된 문제는 인증 절차가 동기화되지 않는다는 것입니다. 그것은 그렇게 작동하지 않습니다.

당신이 알고 있듯이, 해결책은 가능한 경우 화면을 사용하는 것입니다 ( 그런데 tmux 는 화면의 대안입니다).


1
그러나 암호가없는 ssh가 있다면 어떨까요? 그럼 할 수 있습니까?
Sridhar Sarnobat가

1
byobu편안한, 쉽게로 프론트 엔드를 사용하는 것입니다 screen(또는 tmux) - 확실히 가치 모양은 (:
drevicko

Sridhar-Samobol, 인증이 여전히 수행되어야합니다. 실행중인 세션에 연결해도 초기 핸드 셰이크를 다시 수행 할 수있는 방법이 없으므로 기존 세션에 새 세션을 도입하면 변하지 않습니다. 답 : 아니요.
kevr

9

오래 지속되는 프로세스를 실행 하기 위해 더 친숙한 인터페이스를 원한다면 screen 또는 byobu를 사용합니다.

화면에는 다음을 사용할 수 있습니다.

screen [program] [args]

화면 세션 내에서 [프로그램] 및 [args]가 실행됩니다 . 프로그램이 완료되면 세션이 자동으로 닫힙니다. 프로그램이 실행 된 후 세션을 유지하려면 인수없이 화면 을 실행하기 만하면 세션 내에 새 프롬프트가 나타납니다. CTRL + A + D 는 현재 세션에서 터미널을 분리합니다.

이전 세션에 다시 연결하려면

screen -r

세션이 하나만 열려 있으면 즉시 다시 연결됩니다. 여러 세션이 진행중인 경우 연결할 세션을 묻습니다. 세션 이름을 알고 있다면이 명령 행에 인수로 추가 할 수 있습니다.

Byobu 는 훌륭한 개선입니다. 화면을 기반으로 하지만 하단에 모든 현재 세션을 탭으로 표시하고 이동하기 쉬운 단축키를 제공하는 막대를 제공합니다. 당신은 할 수 있습니다 :

  • F2 새로운 세션을 시작
  • F3 왼쪽의 다음 세션 탭으로 이동
  • F4 오른쪽의 다음 세션 탭으로 이동
  • F8 현재 세션 탭에 친숙한 이름을 지정하십시오.
  • F9는 옵션 메뉴를 엽니 다
  • Ctrl + A + D는 모든 세션을 터미널에서 분리합니다.

조언 : 사용자 root 로 세션을 열어 두지 마십시오 . 누구나 로컬 또는 원격으로 터미널에 액세스 할 수 있으면 진행중인 세션에 쉽게 다시 연결하여 시스템을 루트로 사용할 수 있습니다. 필요한 경우 일반 사용자와 sudo 개별 명령 줄을 사용하여 세션을 시작하는 것이 가장 좋습니다 .


1
OP : "이야기의 핵심은 화면 을 많이 사용 하는 것"입니다. 분명히 그것은 여기의 질문이 아니 었습니다.
12

작성해 주셔서 감사하지만 1 월은 맞습니다.

sudo screen <command>를 사용하여 화면을 루트로 설정하십시오. 다시 연결하려면 sudo 액세스 권한이 필요합니다. 화면을 정상적으로 시작한 다음 화면 내에서 루트로 변경하는 것보다 훨씬 좋습니다.
djsmiley2k-CoW

8

손상된 SSH 세션에 다시 연결할 수 없지만 SSH 내부에서 실행중인 프로세스 를 원하는대로 기능적으로 바꿀 수 있습니다.

명령

귀하의 경우 새로운 SSH 세션, 세션 등에서 apt-get제어되도록 프로세스를 인수합니다 . 내가 가장 좋아하는 명령 은 다음과 같습니다.screenreptyr

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

그런 다음 프로세스에서 찾은 pid로 :

$ sudo reptyr -T 10626

또는 그래도 작동하지 않으면 다음을 시도하십시오.

$ reptyr 10626

이 단계가 끝나면 모든 키보드 입력이 사용자가 인계 한 프로그램으로 이동합니다. 불행히도 apt-get확인을 요청 하는 출력 과 같은 SSH 세션의 이전 출력은 표시되지 않습니다 .

설명

기본적으로와 동일한 방식으로 reptyr(즉, ptrace디버그 첨부 파일을 통해 ) 작동하는 다른 여러 도구가 있습니다. 다음과 같은 질문 및 답변을 참조하십시오.

상기 지침에서 reptyr 10626사용 ptrace그동안 첨부 디버그 sudo reptyr -T 10626명령은 TTY 훔치는 사용하고 바람직한이다 ( 상세 ).

마지막으로, 당신이 있기 때문에이 방법이있는 SSH 세션을 통해 수행 할 수없는 이유 sshd프로세스가 호스트 단자에 의해 제어되지 않는 대신 그것은 제공하는 A - 터미널의 슬레이브 일부 pts장치 - 마스터 일부가에있는 제어하면서 클라이언트 시스템, 여기에 깨진 SSH 세션이 있습니다. 로 이러한 sshd프로세스 를 강제로 인수하면 reptyr -s <pid>키보드 입력이 활성 하위 프로세스가 아닌 해당 프로세스로 이동합니다. 따라서 "Ctrl + Z"는 간단하게 제거합니다 sshd.


1

나는하던 do-dist-upgrade따라서, 중단에 들어간 노트북에서 ssh를 통해 Broken pipe. 컴퓨터로 돌아 왔을 때 업그레이드 관련 프로세스가 계속 실행되는 whiptail것을 보았습니다. 그중 입력 (디스플레이 관리자가 선택)과 관련하여 루트 소유 SCREEN. 내가 할 수 있었다 sudo su -screen -r세션과 보라와 보라에 첨부 할, 내가 입력을 할 수 내 앞에있는 채찍 꼬리 대화가있다. 업그레이드를 원활하게 재개 할 수있었습니다.

참고 : 이것은 Ubuntu 14.04에서 16.04로 업그레이드되었습니다.

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