Rsync는 .bashrc와 호환되지 않는 것 같습니다 (“쉘이 깨끗합니까?”).


16

rsync가 .bashrc 파일이있는 원격 서버에서 작동하지 않는 것으로 나타났습니다.

로컬 클라이언트에서 rsync를 실행할 때 얻었습니다.

protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(180) [sender=3.0.7]

여기에서 제안한 것처럼 서버에서 .bashrc를 제거하면 문제가 해결되었습니다. .bashrc 파일을 제거하지 않고 해결하는 방법은 무엇입니까?


1
해당 계정에 ssh가 활성화되어 있는지 확인하십시오.
Lamy

아래 답변이 잘못되었을 수 있습니다. 내 .bashrc 파일에서 아무것도 변경되지 않았지만 정기적으로 Ubuntu 업그레이드 후이 오류가 발생하기 시작했습니다.
Cerin

아니요-.bashrc 파일을 제거하면 문제가 해결되면 (이 질문에 언급 된대로) .bashrc에서 문제가 출력됩니다. 업그레이드는 확실히 실제 프로토콜 비 호환성을 도입 할 수 있으며 이는 완전히 다른 문제입니다.
랜달

답변:


21

.bashrc원격 서버의 전원이 터미널로 출력 되면 문제가 발생할 수 있습니다 . Rsync는이를 예상하지 못할 수 있으며 결과적으로 문제가 발생할 수 있습니다.

.bashrc해당 출력 텍스트 에서 명령을 제거 하거나 출력을 / dev / null로 파이프 하여이 문제를 해결할 수 있습니다 .


3
클라이언트에서 파일 만 수정할 수있는 경우 출력을 / dev / null로 파이프하는 방법은 무엇입니까?
Computist

1
시스템 관리자가 도움을 줄 수 있다고 가정합니다. FTP 또는 scp와 같은 다른 방법으로 서버의 파일을 수정할 수도 있습니다.
Greg Hewgill

예. 내 .bashrc 파일에 echo "*** Starting ROOT Shell ***"및 echo "(가능한 경우 루트 쉘 대신 sudo를 사용하십시오!)"가 포함되어 있습니다. 그 에코를 제거하면 문제가 해결되었습니다.
Kentgrav

1
rsync 매뉴얼 페이지에서 : "프로토콜 버전 불일치-쉘이 깨끗합니까?" 이 메시지는 일반적으로 rsync가 전송에 사용하는 스트림에서 원하지 않는 가비지를 생성하는 시작 스크립트 또는 원격 쉘 기능으로 인해 발생합니다. 이 문제점을 진단하는 방법은 다음과 같이 원격 쉘을 실행하는 것입니다. ssh remotehost / bin / true> out.dat 그런 다음 out.dat 파일을보십시오. 모든 것이 올바르게 작동하면 out.dat는 길이가 0 인 파일이어야합니다.
Kentgrav

8

.bashrc는 실제로 이런 종류의 문제를 일으키는 출력을 생성하기에 올바른 장소가 아닙니다. rsync를 실행하려고 할 때까지 많은 사람들이 그것을 피합니다.

원하는 출력 (및 관련 논리 및 명령)은 .bash_profile로 이동해야합니다 (예 : 파일 간의 차이점에 대한 자세한 내용은 서버 오류 질문 ".profile vs. .bash_profile vs. .bashrc" 참조).

그렇게하면 로그인 할 때 출력을 희생하거나 rsync를 사용하려고 할 때 .bashrc를 일시적으로 변경하지 않아도됩니다.


6

나는 항상 내 사용자 계정에 .bashrc 파일을 가지고 있었고 오늘 루트 계정을 사용하여 서버에 무언가를 동기화하려고 시도 할 때 까지이 문제가 발생하지 않았습니다. 귀하의 게시물이 해결책을 찾는 데 도움이되었습니다.

내 $ user / .bashrc 파일은 이러한 종류의 문제를 방지하기 위해 항상 다음 섹션으로 시작합니다. 나는 그것을 루트의 .bashrc에 복제했고 rsync'ing은 이제 매력처럼 작동합니다!

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

카르 틴


rsync"interactive shell"로 분류 된 이유가 있기 때문에 이것은 일반적으로 작동하지 않습니다 . 그러나 출력이있는 경우 비 대화식 쉘을 망칠 수 있기 때문에 어쨌든 추가하는 것이 좋습니다.
Michael Schubert

이것이 이것이 가장 좋은 해결책이라고 생각합니다. 수락 응답은 ".bashrc에서 텍스트를 출력하는 명령을 제거"하는 것은 실용적이지 않습니다.
Qinsi

4

들어 복잡한 이유로 다른 호스트에 연결할 때 rsync를 / SCP / SFTP를 실행은 .bashrc에. .bashrc 맨 위에 다음 명령 중 하나가 있어야합니다 .

어느 한 쪽

[[ $- != *i* ]] && return

또는

[ -z "$PS1" ] && return

위의 명령은 대화식 세션에 대한 나머지 .bashrc 명령 만 실행할 수 있습니다. 내가 아는 한 다른 유형의 세션에는 필요하지 않습니다 (실제로 bashrc 에서이 기술을 사용하여 Arch 및 Debian의 기본 bashrc를 보았습니다).

그러나 비 대화식 세션에서도 bashrc 명령이 실행되도록하는 것에 대한 추가 편집증을 원한다면 대화식 세션 에서만 실행되도록 다음과 같은 출력을 생성하는 bashrc의 명령을 래핑해야합니다 ( reference ).

if shopt -q login_shell; then
    # this is an interactive session, we _can_ display output
    ...code that produces output goes here...
fi

다른 사람들은 텍스트를 출력하는 명령을 bash_profile로 옮기라고 제안하지만 이것이 항상 좋은지에 대해서는 의문의 여지가 있습니다 ( 여기에 설명 된 이유로 )

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