SSH 연결을 닫을 때 "종료"가 저장되지 않도록 하려면 어떻게 해야 합니까?

SSH 연결을 닫을 때 "종료"가 저장되지 않도록 하려면 어떻게 해야 합니까?

이를 수행하는 방법을 Google에서 검색할 때 찾을 수 있는 것은 기록을 저장하지 않고 세션을 종료하는 방법(예: kill -9 $$)뿐이었지만 정반대의 문제에 직면했습니다. 명령이 아닌 모든 기록을 저장하고 싶습니다 exit.

Comcast는 파이프를 손상시키지 않고는 SSH 터널을 5분 이상 유지할 수 없을 정도로 직장에서 우리를 학대했습니다. 다시 연결한 후 마지막 명령을 실행하러 갔는데 당연히 지금은 잊어버렸습니다 exit!

답변1

쉘은 중지하라는 명령을 받을 때까지( command 를 입력하여 exit) 또는 파일 끝(EOF)이 발생할 때까지(쉘이 스크립트를 실행할 때와 마찬가지로) 터미널(즉, 쉘의 표준 입력)에서 명령을 읽습니다.

명령이 입력 되면 exit먼저 기록에 저장된 다음 쉘이 종료됩니다. 입력 ctrl- DEOF를 생성합니다. 이는 명령이 아니라 입력 상태이므로 셸 기록에 저장할 수 없습니다.

bashEOF를 무시하도록 지시할 수 있는 방법은 두 가지가 있습니다.

  • -o 무시 설정
  • EOF 무시=n

첫 번째 방법은 실행과 동일합니다 . 즉, 쉘이 종료되기 전에 연속으로 - 10번을 IGNOREEOF=10눌러야 합니다 . 이는 예를 들어 오타 등 을 한 경우 쉘이 예기치 않게 종료되는 것을 방지하기 위한 것입니다 .ctrlDctrlC

또한 ctrl-는 줄의 첫 번째 항목으로 입력될 때만 생성됩니다(즉, 입력 후). D해당 줄에 이미 입력된 내용이 있으면 무시됩니다.EOFbash

ctrl- D쉘 외부에서도 생성됩니다. EOF예를 들어:

$ wc
foo bar
<ctrl-D>
      1       2       8

wc1줄, 2단어, 8자(줄 바꿈 포함)로 계산됩니다.

다음은 라인에 일부 입력을 제공한 후 -를 사용하는 예입니다 ctrl.D

$ wc
foo bar<ctrl-D><ctrl-D>       0       2       7

이제 wc0행( enter제공되지 않음), 2단어, 7문자를 계산했습니다. 데이터가 이미 제공되었기 때문에 두 가지 ctrl순서 가 필요합니다. 예를 들어, 데이터가 이 행에 입력되었는지 여부를 무시하고 이를 구체적으로 처리한다는 점에 유의하십시오 . 이는 .DbashEOFdashbash

답변2

@StéphaneChazelas가 추가를 제안한 경우ServerAliveInterval작동하지 않는 경우(값을 사용해 볼 수도 있음 ) 끊어진 연결을 복원할 수 있도록 GNU 300와 같은 것을 고려할 수도 있습니다 .screentmux

~/.bashrc모든 원격 시스템 상단에 다음이 있습니다.

screen -r >/dev/null 2>&1

연결이 끊긴 화면 세션이 누락된 경우(예: 두 번째 연결이거나 방금 재부팅한 경우) 아무 작업도 수행하지 않지만 화면 세션이 있는 경우(다른 곳에 연결되지 않은 경우) 자동으로 다시 연결해 보세요. 붐, 모든 이전 기록(및 활성 명령 등)이 복원됩니다. ( screen처음 로그인한 것으로 가정합니다.)

또한 이를 반복 SSH 연결과 결합했습니다. 제가 말하는 내용의 간단한 버전은 다음과 같습니다.

while sleep 1; do ssh remotehost; done

이렇게 하면 연결을 끊을 때 자동으로 다시 연결됩니다(Ssh 키가 있고 ssh-agent비밀번호 없는 키를 사용한다고 가정하면 이는 심지어 투명합니다).

관련 정보