프로토콜 버전 불일치 — 쉘이 깨끗합니까?


55

여기에 제공된 rsync 백업을 수행하기위한 지시 사항을 따르는 경우 : http://troy.jdmz.net/rsync/index.html

"프로토콜 버전이 일치하지 않습니다-쉘이 깨끗합니까?"라는 오류가 발생합니다.

이 문제를 해결하기 위해 프롬프트 (PS1 = "") 및 motd (.hushlogin) 디스플레이를 끄는 데 필요한 곳을 읽었습니다. 이 작업을 수행하면 프롬프트 및 로그인 배너 (MOTD)가 더 이상 나타나지 않지만 실행할 때 오류가 계속 나타납니다.

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" remoteuser@remotehost:/remote/dir /this/dir/

ssh 클라이언트와 sshd 서버 모두 프로토콜 버전 2를 사용하고 있습니다.

무엇이 문제 일 수 있습니까? 감사.

[편집] http://www.eng.cam.ac.uk/help/jpmg/ssh/authorized_keys_howto.html 에서 "-2 플래그를 사용하여 ssh 또는 slogin에 v2를 강제 실행 해야하는 경우가 있음"

 ssh -2 -i ~/.ssh/my_private_key remotemachine"

오류가 변경된 후에이 변경 사항을 적용했다고 생각하기 때문에 이것이 문제를 해결 한 것은 분명하지 않지만 실제로 오류가 다른 것으로 발전했다는 것이 사실입니다. 자세한 내용은 업데이트하겠습니다. 그리고 나는 확실히 이맥스 쉘에서 이것을 제안 할 것입니다-감사합니다.


1
로그인 스크립트가 창 제목 변경 명령과 같이 즉시 보이지 않는 것을 출력합니까? 이를 확인하는 한 가지 방법은 Emacs를 실행하고을 입력 ESC x shell하고 수행하는 것 export TERM=xterm; ssh remotehost ls입니다. 제어 문자 또는 다른 스퓨리어스 출력이 나타나면 바로 찾아야합니다.
Gilles

1
나는 같은 문제를 겪고 있었다. 필자의 경우 SSH 서버는 사용자를 chroot하고 SFTP 액세스 만 허용하도록 구성되어 있으므로 원격 쉘에서 rsync 명령을 실행할 수 없었습니다. 서버에 액세스 할 수 있으면 / etc / ssh / sshd_config에서 ForceCommand 구성 옵션을 확인하십시오. 그것이 문제인 것으로 설정되어 있다면.
devius

기록을 위해 프로토콜 불일치를 방금 포기한 상황에 처했습니다. rsync --version은 호스트에서 대화식 및 비 대화식 ssh가 완전히 자동으로 동일하게 출력되며 authorized_keys에는 아무런 영향도 미치지 않습니다 ... 작동하지 않습니다. 나는 rabbibt holing 인 다른 사람들을 위해이 의견을 남긴다. 자신에게 호의를 베풀고 --rsync-path없이 시도하십시오. 당신은 아마 당신의 문제 가이 SO와 아무 관련이 없다는 것을 알게 될 것입니다.
sheldonh

@sheldonh : 귀하의 경우 로컬 및 원격 컴퓨터의 경로가 다릅니 까? 내 경우에는 어쨌든 동일하며 ( --rsync-path)를 주거나 주지 않아도 나에게 아무런 변화가 없습니다.
0xC0000022L

1
@ 0xC0000022L 죄송합니다. 기억이 나지 않습니다.
sheldonh

답변:


62

로그인 스크립트 중 하나 (.bashrc / .cshrc / etc.)가 터미널에 데이터를 출력하고있을 수 있습니다 (필요하지 않은 경우). 연결하지 않고 예상하지 못한 추가 데이터를 받기 시작하여 복사 준비를 할 때 ssh 오류가 발생합니다. 시작 스크립트에서 생성 된 출력을 제거하십시오.

bashrc에서 다음 코드를 사용하여 터미널이 대화식이고 텍스트 만 출력하는지 확인할 수 있습니다. 다른 쉘에도 해당하는 것이 있습니다.

if shopt -q login_shell; then
    [any code that outputs text here]
fi

또는 쉘이 대화식 일 때 특수 매개 변수에 -포함 되므로 다음과 같이 i할 수 있습니다 .

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

자세한 내용은 Linux에서 Windows 로의 SSH를 통한 rsync sbs 2003 프로토콜 불일치를 참조하십시오.

이를 진단하려면 다음을 호스트에 ssh 할 때 얻는 출력인지 확인하십시오.

USER@HOSTNAME's password: 
Last login: Mon Nov  7 22:54:30 2011 from YOURIP
[USER@HOSTNAME ~]$ 

줄 바꿈이나 다른 데이터가 있으면 추가 출력이 전송되고 있음을 알 수 있습니다. .bashrc / .cshrc / .profile / etc의 이름을 바꿀 수 있습니다. 파일을 다른 것으로 출력하여 추가 출력을 출력하지 않습니다. 물론이 문제를 일으킬 수있는 시스템 파일이 여전히 있습니다. 이 경우 시스템 파일이 데이터를 출력하지 않는지 sysadmin에 문의하십시오.


5
echo에서 ~/.bashrc, 들으. 당신은 내 일을했다
user9869932

19

ssh 연결의 경우 쉘이 깨끗한 지 테스트하는 간단한 방법이 있습니다. 대화식 쉘을 시작하는 대신 ssh 연결에서 명령을 실행하십시오. false명령은 즉시 출력을 생성하지 않고 종료됩니다, 그래서 좋은 테스트입니다 :

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash$

해당 명령 행이 출력을 생성하면 시작 스크립트 중 하나가 비난되는 것입니다.

bash$ ssh remotehost false
Enter passphrase for key '/home/user/.ssh/my_private_key': 
Welcome to RemoteHost!

This system is company property and is provided for authorized use only, 
as set forth in applicable written policies. Unauthorized use is prohibited 
and may be subject to discipline, civil suit and criminal prosecution.

Welcome back - You last logged in 16 days ago...
bash$

이 오류가 발생하는지 확인하는 또 다른 사항은 rsync가 ssh에 의해 설치되어 있는지 여부입니다.

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
bash$

rsync가 경로에 없으면 대신 다음과 같이 표시됩니다.

bash$ ssh remotehost "rsync --version"
Enter passphrase for key '/home/user/.ssh/my_private_key': 
bash: rsync: command not found
bash$

rsync를 설치하거나 설치되어 있지만 비정상적인 위치에있는 경우 rsync 명령 줄에 위치를 전달하여이 문제를 해결할 수 있습니다.

rsync -avvvz -e "ssh -i /home/thisuser/cron/thishost-rsync-key" \
    --rsync-path="/usr/local/bin/rsync" \
    remoteuser@remotehost:/remote/dir /this/dir/

7

이것은 일반적으로 비대화 형 쉘에서 출력하는 쉘의 로그인 항목으로 인해 발생합니다. 다음을 수행하여 이러한 경우인지 테스트 할 수 있습니다.

ssh username@host "/bin/true" > testfile
ls -l testfile

testfile이 0 바이트가 아닌 경우, 쉘이 무언가를 출력하고있는 것이 문제입니다. 확인 /etc/profile, .profile, .bashrc, .cshrc, 등이있는 경우, 당신은 당신의 터미널이 bashrc에 다음 코드를 사용하여 대화 형 만 출력 텍스트가 있는지 확인하기 위해 변경할 수 있습니다. 다른 쉘에도 해당하는 것이 있습니다.

if shopt -q login_shell; then
    [any code that outputs text here]
fi

또는 쉘이 대화식 일 때 특수 매개 변수에 -포함 되므로 다음과 같이 i할 수 있습니다 .

if echo "$-" | grep i > /dev/null; then
    [any code that outputs text here]
fi

그러나 테스트 파일이 실제로 0 바이트 인 경우 쉘이 작동하지만 매우 오래된 버전의 rsync가있을 수 있습니다. 이전 rysnc 서버 버전이 인식하지 못하는 높은 버전을 알리지 않도록 클라이언트 측에 최신 버전이라고 가정 할 수 있습니다. --protocol=옵션을 사용하여이 작업을 수행 할 수 있습니다 . 내 경우에는 사용 --protocol=30하여 트릭을 수행했습니다.

여전히 문제가 발생하면 rsysnc 사용자가 연결하면서 ssh를 시도 rsync --version하고 셸에서 rsync를 찾을 수 있는지 확인하십시오. 명령을 찾을 수 없다는 메시지가 표시되면 연결중인 시스템에 rsync가 설치되지 않았거나 경로에 없을 수 있습니다. Rsync에는 원격 끝의 경로를 지정하는 옵션이 있습니다. 맨 페이지를 읽으십시오.


--protocol2.5.6 서버 (프로토콜 버전 26) 및 3.1.0 클라이언트 (프로토콜 버전 31)의 문제를 해결 한 힌트 +1
MattBianco

4

이것은 다른 답글의 특별한 경우이지만 그와 크게 다르지 않습니다.

ssh를 통해 rsync를 실행하려면 원격 rsync 명령을 실행하려면 ssh에서 쉘 액세스가 필요합니다. ssh 계정에서 scp / sftp 만 허용하면 remove rsync를 시작할 수 없으며이 오류가 발생하지 않습니다.

이것은 위와 같은 명령으로 테스트 할 수 있습니다

ssh remotehost false

이 사람은 실패하고이 사람은 성공해야한다

sftp remotehost

이는 sftp 전용 액세스 권한이 있음을 증명합니다.

원하는 권한이있는 경우 /etc/ssh/sshd_config및 확인 matchforcecommand항목 을 편집하여 해당 사용자에 대한 sftp 전용 액세스를 비활성화 할 수 있습니다 .

게시물을 확인할 수도 있습니다


4

내가 가지고 protocol version mismatch -- is your shell clean?난에 rsync를 설치하지 않았기 때문에 단순히 다른 아직 끝을. sudo yum install rsync문제를 해결했다.


컨테이너로 엉망인 30 분을 보냈고 rsync가 작동하지 않는 이유를 궁금해했습니다 ... 설치되어 있지 않을 때 작동하기가 어렵습니다! 감사합니다;)
Ryan Fisher

2

명령을 직접 실행할 때 프롬프트가 전혀 표시되지 않으며 대화식이 아닙니다. 간단한 Google이 첫 번째 결과를 표시합니다. http://marc.info/?l=rsync&m=100263876212594&w=2 쉘을 잠재적으로 호출 할 수 있으므로 " bash "를 기존 프롬프트에 추가하면 새 프롬프트 만 표시됩니다.


아마도 충분히 명확하게하지 않았지만 이미 "프롬프트 (PS1 =" ") 및 motd (.hushlogin)"를 수행했습니다. 실제로 로그인에는 프롬프트가 표시되지 않습니다. 그럼에도 불구하고 프로토콜 불일치 오류가 여전히 나타납니다. 고마워-제안을 많이 주셔서 감사합니다.
rfreytag

당신은 기본적으로 이것을 이미 언급했지만 .bashrc (또는 다른 프로파일 스크립트)에 화면에 아무것도 울리는 것이 있으면 이와 같은 문제가 있습니다. 쉘에서 특정 방식으로 변경하는 특정 프로그램을 실행할 때 이런 종류의 문제가 발생했습니다 (예 : chsh로 쉘을 변경할 수 없었으므로 .cshrc를 실행하여 bash를 변경했습니다. 쉘과 ssh는 더 이상 작동하지 않습니다).
lsd

물론 그것은 흥미 롭습니다. rsync 명령을 대화식으로 실행하면 화면에 에코가 나타나지 않고 로그인이 완전히 침묵하기 때문에 어떻게 이것을 진단 할 수 있을지 궁금합니다. 흠 ... 당신이 제안한대로 껍질에 뭔가 잘못이 있는지 궁금합니다. 감사.
rfreytag

1

RSYNC가 예상하지 않은 "비밀번호가 6 일 후에 만료됩니다"와 같은 원격 호스트의 로그인 메시지로 인해 발생할 수 있습니다.

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