SSH 연결에서“쓰기 실패 : 파이프 끊어짐”을 방지하는 방법은 무엇입니까?


283

Write Failed: broken pipe오류 를 방지하기 위해 클라이언트와 서버 모두에서 SSH를 구성하려면 어떻게해야 합니까? 클라이언트 컴퓨터를 잠자고 나중에 다시 시작하면 종종 발생합니다.


8
실제로는 없습니다. 세션이 중단되었고 세션의 보안이 손상되었습니다. comp를 잠자기 상태로 두지 않으면 클라이언트가 서버에 대해 살아있는 심장 박동을 촬영할 수있는 연결 유지 시간을 설정할 수 있지만 시스템이 잠자기 상태이면 수행 할 수있는 작업이 없습니다.
darkdragn

3
이 경우 깨진 ssh 연결을 다시 시작하고 (종료 코드를 기반으로 함) 다시 사용하여 복원 할 수있는 것을 찾고 있습니다 screen.
sorin

4
당신은 사람들이 틀 렸습니다 : 두 개의 데스크탑 클라이언트 컴퓨터가 SAME 서버에 연결되어 있습니다. 하나는 SSH 클라이언트가 잘 작동하고 몇 시간 동안 연결을 유지하는 Quantal의 우분투 12.10입니다. 다른 하나는 Ubuntu 14.10, Utopic이며 다른 하나는 제외하고 새로 설치합니다. 몇 분 후이 메시지로 차단됩니다. 기기의 나머지 네트워크 기능은 중단되지 않습니다. 따라서, 그것은 네트워크 문제도 아니고 서버 문제도 아니고, "darkdragan"이 감히 말하는 것과는 달리 "어떤 것도 할 수 없다"는 것과는 달리 해결할 수있는 특정 SSH CLIENT 소프트웨어 문제입니다.
David L

2
그리고 실제로 내가 말한 것처럼 : 사람들은 @darkdragn이 감히하는 것처럼 "아무것도 할 수 없다"고 말할 때 너무 많이 이야기합니다. 나는 Aram Kocharyan의 답변을 읽었으며 그것을 적용했습니다 .20 분 전 ... 나는 오래된 Quantal Ubuntu 12.10에서 2 년 전에 그 파일에 그 명령을 적용했다는 것을 깨달았습니다. 안정성의 이유. 나는 여기에서 그것을했고, 지난 20 분 동안 연결은 그 이후로 안정적이었습니다. 그러니 제발 사람들은 "아무것도 할 수 없다"고 감히 말할 때 자신을 자제하고 다른 사람들에게 그 메시지를 남기려고 할 때 더 많이 자제하십시오.
David L

11
@DavidL 당신은 실행하기 전에 질문을 더 잘 읽어야합니다. 귀하의 문제는 컴퓨터를 잠자 게하는 것을 분명히 언급하는 OP와 다릅니다. 그건 그렇고 답변 중 하나 ( "mosh")만이 문제의 2 년 후에 게시되었습니다. 그러나 다른 답변은 차선책을 수행하므로 더 쉽게 해결할 수있는 사례에 대한 솔루션을 제안합니다. 진정, 스트레스를받지 마십시오, ranting이 주변에서 좋은 일을하지 않습니다 ...
msb

답변:


266

나는 이것을 /etc/ssh/ssh_configLinux와 Mac 에서 시도했다 .

Host *
ServerAliveInterval 120

몇 초 안에 서버에 keepalive 메시지를 보내야 하는가입니다. 그래도 작동하지 않으면 작업하는 동안 2 분마다 Enter 키를 누르도록 원숭이를 훈련 시키십시오.

당신도 설정할 수 있습니다 ServerAliveInterval에서 /etc/ssh/ssh_config클라이언트 컴퓨터의 또는 ClientAliveInterval에서 /etc/ssh/sshd_config서버 컴퓨터의. 여전히 오류가 발생하면 간격을 줄이십시오.

단일 사용자에 대한 구성 ~/.ssh/config은 서버 및 클라이언트 측 모두 에서 파일로 설정할 수 있습니다 . 파일에 올바른 권한이 있는지 확인하십시오 chmod 644 ~/.ssh/config.


4
Mac에는 없지만 Ubuntu 12.04 및이 운영 체제의 파일도 ~ / .ssh / config 인 것 같습니다.
H2ONaCl

5
OS X 10.8.4에서 오류 발생Bad configuration option: ClientAliveInterval
ohho

3
Bad configuration optionOSX 10.8.4에서 동일한 오류가 발생합니다.
Nick Heiner

10
일반적으로이 두 명령을 시스템의 다른 부분에 넣습니다. OSX 클라이언트 측의 ServerAliveInterval 만 ... sshd 구성 파일의 ClientAliveInterval 만 ...
ftrotter

2
내 원숭이가 나에게 말했다 : "왜"상단 [ENTER] "을 입력하지 마십시오
augusto

85

SSH 세션은 여러 가지 불가피한 이유로 인해 중단 될 수 있습니다.

이로 인해 발생하는 문제를 완화하는 데 사용할 수있는 유용한 유틸리티를이라고 screen합니다. Screen은 ssh 세션과 독립적으로 살아남을 여러 터미널을 제어 할 수있는 강력한 유틸리티입니다. 예를 들어, screenssh 세션에서 실행 하면 새 터미널이 열리고 터미널을 사용하여 작업을 실행할 수 있습니다. ssh 세션이 프로세스에서 죽었다고 가정 해 봅시다. screen -d그런 다음 실행 screen -r하면 마지막 세션이 다시 열리고 계속 진행할 수 있습니다. 사용하기 전에 일부 설명서 를 읽으 십시오.


5
이것은 아마도 가장 좋은 대답 일 것입니다. 왜 그것이 더 높은 투표를했는지 모르겠습니다. 다른 "수정"은 실제로 SSH 연결을 유지하는 데 관심이있는 특수한 경우에 도움이되지만 대부분의 사용 사례에서는 클라이언트 / 서버 연결 문제에 관계없이 의도 된 프로세스가 계속 실행된다고 생각합니다. .
Paul McMurdie 2016 년

16
또한 스크린 대신 Tmux 를 추가 할 것 입니다. 화면보다 다재다능하고 안정적입니다.
fridaymeets

2
나중에 참조 할 수 있도록 여기에 그대로 screen -d -r두십시오. 마지막 세션을 복구하기 위해 편리하게 실행할 수 있습니다 .
doplumi

2
아니면 간단하게 screen -dr. 또는 screen -x계획하고있는 것에 따라. 요점은 모든 스위치가 무엇을하는지 알아야하므로 적절한 스위치를 사용할 수 있고 인터넷 사람들의 제안을 맹목적으로 따르지 않아야합니다. 여기에 사용 가능한 간단한 요약이 있습니다. ss64.com/bash/screen.html
flith

이것은 문제에 대한 답변이 아닙니다
user3728501

46

클라이언트 구성

파일을 만들어보십시오 :

~/.ssh/config

내용을 추가하십시오 :

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

이제 서버로 ssh하고 문제가 해결되었는지 확인하십시오. ClientAliveInterval 옵션은 ssh 서버 (일명 sshd)를 구성 할 때만 유용하며 ssh 클라이언트 측에서는 변경되지 않으므로 위의 구성 파일에서 사용하지 마십시오.

이전 30 초 동안 패킷이 수신되지 않은 경우 (위에 지정된대로) hello-are-you-there 신호를 서버로 보냅니다. 그러나 연속적인 hello-are-you-the-re 신호가 ServerAliveCountMax에 도달하면 ssh가 서버와의 연결이 끊어집니다. 이 값의 기본값은 3으로 설정되어 있으므로 서버 활동없이 3 * 30 = 90 초가 필요합니다. 필요에 따라 늘리십시오. .ssh / config 파일에 더 많은 구성 옵션이 있으며 다음을 읽을 수 있습니다.

SSH 구성 파일 사용

다른 옵션에 대한 자세한 내용. 이 예제에 연결할 모든 서버에이 기능을 적용하지 않을 수 있습니다. 또는 줄 Host *을 로 바꾸어 특정 서버로만 제한하십시오 Host <IP>(IP 주소로 교체, ssh_config 매뉴얼 페이지 참조).

서버 구성

마찬가지로 서버를 클라이언트에게 부드럽게 지시 할 수 있습니다. 구성 파일은 /etc/ssh/sshd_config입니다.

ClientAliveInterval 20
ClientAliveCountMax 5

당신은 설정하여 비활성화 할 수 있습니다 ClientAliveInterval0또는 조정할 ClientAliveIntervalClientAliveCountMax프로브에 응답하지 않고 최대 SSH 클라이언트 활동을 설정할 수 있습니다. TCPKeepAlive에 비해이 설정의 한 가지 장점은 신호가 암호화 된 채널을 통해 전송되므로 스푸핑 가능성이 낮다는 것입니다.


작동하지 않습니다. 다시 같은 오류가 발생합니다.
user997704

3
ssh -o ServerAliveInterval = 5 user @ host
Matt

그것도 시도했다. 작동하지 않는다. 시스템에서 무슨 일이 일어나고 있는지 잘 모르겠습니다
user997704

2
ClientAliveCountMax가 아닌 ClientAliveCountMax입니다
David G

@DavidG 수정 한 내용으로 답을 편집하십시오.
CivMeierFan

23

원격으로 Ubuntu 서버를 lucid에서 정확한 것으로 업그레이드하고 있으며 업그레이드 도중 "쓰기 실패. Brocken 파이프"메시지와 함께 ssh 연결이 끊어졌습니다. ClientAliveInterval 및 ServerAliveInterval은 아무 것도 수행하지 않았습니다. 해결책은 클라이언트 ssh에서 TCPKeepAlive 옵션을 켜는 것입니다.

TCPKeepAlive yes

...에서

/etc/ssh/ssh_config

20

클라이언트의 경우 다음과 같이 ~/.ssh/config(또는 /etc/ssh/ssh_config) 파일을 편집하십시오 .

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive- 시스템이 다른쪽에 TCP keepalive 메시지를 보낼지 여부를 지정합니다. 전송 된 경우 연결이 끊어 지거나 시스템 중 하나의 충돌이 올바르게 감지됩니다. 그러나 이것은 경로가 일시적으로 다운되면 연결이 끊어지고 일부 사람들은 성가신 것을 발견합니다 (기본값은 'yes').

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


서버의 경우 다음 /etc/ssh/sshd_config과 같이 편집하십시오 .

ClientAliveInterval 600
ClientAliveCountMax 0

10 분 (600 초) 후에 ssh 클라이언트가 자동으로 종료 (시간 초과)되도록하려는 경우.

ClientAliveCountMax – ssh 클라이언트로부터 응답을받지 않고 ssh 서버가 보낸 총 checkalive 메시지 수를 나타냅니다. 기본값은 3입니다.

ClientAliveInterval – 시간 제한 (초)을 나타냅니다. x 초 후 ssh 서버는 클라이언트에게 응답을 요청하는 메시지를 보냅니다. Deafult는 0입니다 (서버는 클라이언트에게 확인 메시지를 보내지 않습니다).


참조 : 옵션 ServerAliveIntervalClientAliveIntervalsshd_config에서 정확히 무엇을합니까?


클라이언트에서 ServerAliveCountMax를 기본값보다 높게 설정하면 연결 속도가 느려도 연결을 유지하는 데 도움이됩니다.
jonnyjandles

17

나는 절대적으로 Mosh를 좋아합니다. 나는 종종 서버에 ssh하고 노트북을 닫고 카페에 가서 그것을 열어서 아무것도 바뀌지 않은 것처럼 계속합니다.

모쉬 (모바일 쉘)

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

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

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


6

나를 위해, 나는 Write failed: Broken pipevim이나 쉘 프롬프트에서 적극적으로 입력 할 때조차도 얻고 있었습니다. 인터넷을 로컬에서 잠시 동안 탐색 할 수도 없었습니다. (터미널을 사용하여 원격으로 우분투에 연결했습니다.)

내 네트워크의 다른 사람들은 Netflix 및 다른 곳에서 많은 비디오를 스트리밍합니다. 증명할 수 없지만 ISP 나 라우터 문제가 의심됩니다. 예를 들어 Verizon과 Netflix는 고객의 네트워크 문제에 대해 서로를 지적하고 있습니다.

전화 접속 연결이 있고 동시 SSH 또는 텔넷 연결로 비디오 또는 음악을 스트리밍하는 경우 파이프 메시지가 깨지는 것을 피할 수 없습니다. ISP의 광대역 패키지를 업그레이드하면 끊어진 연결이 덜 빈번한 것으로 보입니다.



3

SSH 구성 클라이언트 또는 서버에 관계없이 원격 서버에 실패하지 않는 스크립트가 있습니다.

#!/bin/bash
while true; do date; sleep 10; done;

파일을 dummy.sh 파일에 저장하고 창을 최소화하거나 다른 곳으로 이동하기 전에 빠르게 실행하십시오. 서버에 현재 시간 소인을 계속 인쇄하고 다른 이유로 연결이 끊어지지 않는 한 연결을 활성 상태로 유지합니다. 해당 터미널로 돌아 오면 Ctrl + C를 누르고 계속 작업하십시오.


9
또는 단순히 top달리기
Eben Geer

1

ssh를 호출 할 때마다 다음 인수를 추가 할 수 있습니다. -o ServerAliveInterval=15 -o ServerAliveCountMax=3

이렇게하면 / etc / ssh / * config 파일을 편집 할 필요가 없습니다.

이를 쉽게하기 위해 bash 별명, 함수 또는 스크립트를 작성할 수 있습니다.

예를 들어 이러한 bash 기능을 사용하면 .bashrc에 추가 할 수 있으며 do_ssh는 수동으로 keepalives를 켭니다. do_ssh_pty는 스크립트 내에서 pty를 설정하고 프롬프트를 피하기 위해 사용됩니다.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

이제 do_ssh user@host사용할 수 있고 do_ssh user@host <args> <command>keepalives가 활성화됩니다.

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