rsync error: protocol incompatibility/mismatch

4403 단어

1. 문제


오늘 집단 환경을 유지할 때 작은 문제가 발생했습니다. 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(171) [sender=3.0.6]

디버그 옵션 - vv를 열어도 더 많은 유용한 정보를 얻지 못했지만, 알림을 보면 셸 환경과 관련이 있을 것입니다.
또 man rsync를 뒤져 정부가 이 문제에 대해 다음과 같은 설명을 한 것을 발견했다.
DIAGNOSTICS
rsync occasionally produces error messages that may seem a little cryptic. The one that seems to cause the most confusion is "protocol version mismatch -- is your shell clean?".
This message is usually caused by your startup scripts or remote shell facility producing unwanted garbage on the stream that rsync is using for its transport. The way to diagnose this problem is to run your remote shell like this:
ssh remotehost /bin/true > out.dat

then look at out.dat. If everything is working correctly then out.dat should be a zero length file. If you are getting the above error from rsync then you will probably find that out.dat contains some text or data. Look at the contents and try to work out what is producing it. The most common cause is incorrectly configured shell startup scripts (such as .cshrc or .profile) that contain output statements for non-interactive logins.
또한 구글이라는 문제에 대한 답도 정부의 도움말 문서에서 나온 것임을 발견할 수 있습니다. 그러면 문제는 셸 환경의 문제로 초보적으로 확정되었습니다.
알림에 따라 ssh remotehost/bin/true > out.dat가 실행된 후에 출력된 것은 바로 원격 기계에서입니다.bashrc 설정의 echo 알림 문장입니다.
주석을 떼고 다시 테스트하면 정상적으로 운행할 수 있다.

2. 원인


그럼 여기 문제가 생겼어요.rsync와.bashrc는 반 마오의 관계가 있습니까?
하하, 뒷이야기를 듣고 싶으면 천천히 내 말을 들어라~
rsync가 데이터를 전송하기 전에 원격과 ssh 로그인 인증을 먼저 하기 때문이다.bashrc 파일에 출력이 있을 때rsync 클라이언트가 되돌아오는 데이터 패키지를 분석하는 데 혼란이 발생하기 때문에 글에서 처음에 언급한 오류가 발생할 수 있습니다. 클라이언트와 원격 프로토콜 버전이 호환되지 않거나 일치하지 않습니다.
설명할 사항은 다음과 같습니다.
원격 sshd 프로세스는 "bash – c"방식으로 명령을 실행합니다. (즉 "비상호작용 비로그인 셸")
그러나 명령을 실행하기 전에 ssh의 그 로그인 자체는 "비상호작용 로그인 셸"이며, 비상호작용 로그인 셸 (bash – l xx.sh) 이 불러온 정보 목록과 순서는 다음과 같다.
/etc/profile
~/.bash_profile ( ->  ~/.bashrc  ->  /etc/bashrc)
~/.bash_login
~/.profile
$BASH_ENV

그래서 ssh에서 "~/.bash_profile"을 불러옵니다.
우리 다시 한 번 봅시다.bash_프로필 내용:
cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc  # .bashrc   /etc/bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

여기를 보니, 나는 네가 왜 그런지 대충 알 것 같다.bashrc에 출력 흐름이 있어rsync 전송에 실패할 수 있습니다.

3. 솔루션


기왕 원인을 찾았으니 어떻게 해결합니까?
동창회가 물어보는데, 내가 원래 사용자를 로그인시킬 때 로그인 알림이 있어야 하는데?지금 rsync를 위해서 금지해야 되는 거 아니에요?
그러면 여기에 또 다른 지식점이 도입되었다. 상호작용 셸과 비상호작용 셸, 로그인 셸과 비로그인 셸의 차이
무엇이 상호작용적입니까?우리가 평소에 명령행을 통해 일을 하는 것처럼 명령을 두드리고 단말기 해석이 끝난 후에 결과를 주는 상호작용적인 형식이다.그러면 평소에 우리가 접촉하는 셸은 기본적으로 상호작용적이다. 예를 들어 gnome-terminal에서 셸을 열고 Ctrl+alt+1 등을 통해 과거의 텍스트 단말기를 전환한다.대화식 셸에서 "echo $-"가 반환하는 문자열에 i가 포함되어 있지 않으면 포함되지 않습니다.bash 뒤에 - i 파라미터를 추가하여 상호작용식 셸을 열 수도 있습니다. 구체적으로 man bash를 볼 수 있습니다.bash 뒤에 -c 매개 변수를 추가하여 명령을 실행하는 비대화식 셸은 다음 명령으로 검증할 수 있습니다.
bash -c 'echo $-'  #  hBc

상호작용을 설명한 후에 이 소절 후반부의 로그인 두 글자를 계속 해석한다.로그인 셸은 사실 이해하기 쉽다. 바로 우리가 평소에 사용자 이름/비밀번호를 통해서만 로그인할 수 있는 셸이다. 가장 전형적인 것은 Ctrl+alt+1로 전환된 텍스트 단말기이다.로그인 셸과 비로그인 셸을 어떻게 구분합니까? $0의 값을 보고 로그인 셸에서 -bash로 되돌아갈 수 있습니다. 로그인 셸에서 되돌아오는 것은 bash가 아니라 -bash로 되돌아갈 수 있습니다.평소 gnome-terminal에서 여는 셸은 비로그인 셸입니다.bash 뒤에 --login 매개 변수를 추가하여 로그인 셸을 열 수도 있습니다.
이 소절에서 시작하는 문제로 돌아가면 명령이 로그인 셸인지 비로그인 셸인지 구분할 수 있습니다.
[[ $- == *i* ]] && echo 'This is interactive shell.'

여기서 $-에 i가 포함되어 있는 것은 현재 셸이 인터랙티브(interactive) 셸이라는 뜻입니다.
글에서 시작한 문제에 대해 우리가 위의 판단을 더하면 로그인할 때 힌트가 있을 뿐만 아니라rsync도 틀리지 않고 일거양득이라고 할 수 있다.
자, 오늘의 내용은 여기까지입니다. 사실 셸은 오래된 프로그래밍 언어로서 linux 버전의 다양화와 발전, 끊임없는 변화에 따라'갱'도 많지만 자세히 탐색할 가치가 있습니다~

4、Refer:


[1] 대화식 로그인 셸 [[$-!=*i*]] & & return
http://kodango.com/what-is-interactive-and-login-shell
[2] linux에서의 bash와sh 상세 설명 및 예
http://bbs.chinaunix.net/thread-1068678-1-1.html
[3] 로그인 셸, 대화식 비로그인 셸, 비대화식 셸
http://bbs.chinaunix.net/thread-2018339-1-1.html
[4] Shell 기본 옵션himBH에 대한 설명
http://kodango.com/explain-shell-default-options

좋은 웹페이지 즐겨찾기