sftp를 통해 rsync를 사용할 수 있습니까 (ssh 쉘없이)?


60

ssh를 통한 Rsync는 매번 훌륭하게 작동합니다.

그러나 sftp 로그인 만 허용하고 ssh 로그인은 허용하지 않는 호스트와 rsync를 시도하면 다음 오류가 발생합니다.

rsync -av / source ssh user @ remotehost : / target /

프로토콜 버전 불일치-쉘이 깨끗합니까? rsync error : compat.c (171)의 프로토콜 비 호환성 (코드 2) [sender = 3.0.6]

rsync 매뉴얼 페이지의 관련 섹션은 다음과 같습니다.

이 메시지는 일반적으로 rsync가 전송에 사용하는 스트림에서 원하지 않는 가비지를 생성하는 시작 스크립트 또는 원격 쉘 기능으로 인해 발생합니다. 이 문제를 진단하는 방법은 다음과 같이 원격 셸을 실행하는 것입니다.

          ssh remotehost /bin/true > out.dat

그런 다음 out.dat를보십시오. 모든 것이 올바르게 작동하면 out.dat는 길이가 0 인 파일이어야합니다. rsync에서 위의 오류가 발생하면 out.dat에 일부 텍스트 또는 데이터가 포함되어있을 수 있습니다. 내용을보고 그 내용을 만들어 내기 위해 노력하십시오. 가장 일반적인 원인은 비 대화식 로그인에 대한 출력 문이 포함 된 셸 시작 스크립트 (예 : .cshrc 또는 .profile)가 잘못 구성되어 있기 때문입니다.

내 시스템에서 이것을 시도하면 out.dat에서 다음을 생성했습니다.

ssh-dummy-shell : 명령이 허용되지 않습니다.

내가 생각한 것처럼 호스트는 ssh 로그인을 허용하지 않습니다.

다음 링크 는 sshfs와 함께 fuse를 사용하여이 작업을 수행 할 수 있음을 보여줍니다. 그러나 속도가 매우 느리고 생산 용도에 맞지 않습니다.

rsync sftp가 작동 할 가능성이 있습니까?


3
lftp가 트릭을 수행합니다. -R 스위치를 사용하여 로컬과 원격을 동기화합니다

서버에서 명령이 어떻게 제한되는지 알고 있습니까? sshd_config에서 ForceCommand를 설정 한 경우 해당 파일을 수정할 수 있는지 확인하십시오. 또는 authorized_keys에서 명령으로 설정 한 경우 sshfs를 통해 authorized_keys에 액세스하여 변경할 수 있습니까?
ptman

당신은 csync를 시도 할 수 있습니다 : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csync답변을 참조하십시오 .
nachtigall

6
결국, 나는 lftp로 그것을했다 :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall

@nachtigall 여러 입력 파일 / 파일 및 디렉토리 목록과 함께 lftp를 사용하는 방법을 알고 있습니까?
bortran

답변:


39

불행히도 직접적으로는 아닙니다. 이 방법으로 실행할 때 rsync의 원격 사본을 시작할 수있는 쉘이있는 클린 링크가 필요합니다 rsync.

호스트에서 오래 지속되는 청취 프로세스를 실행하는 방법이 있다면 권한이없는 포트에서 연결을 수동으로 청취하기 위해 rsync를 시작해 볼 수 있지만 SSH를 통한 적절한 쉘 액세스가 필요합니다. 선택한 포트 (및 rsync가 설치된 호스트)에 연결을 허용하는 호스트 방화벽 배열 비공개 데이터에 대해서는 일반적으로 rsync를 공개적으로 주소 지정 가능한 서비스 (SSH 또는 이와 유사한 방식을 통하지 않고)로 실행하는 것은 권장되지 않습니다.

호스트에서 PHP 또는 이와 유사한 스크립트를 허용하고이를 잠그지 않아서 exec사용자 스크립트 가 추가 프로세스를 처리 할 수없는 경우 청취 모드에서 rsync를 시작해 볼 수 있습니다. 끝이 연결 가능하면 (외부에서 액세스 가능한 SSH를 실행중인 경우)이를 반대로 시도 할 수 있습니다. 스크립트는 서버에서 rsync를 실행하지만 들어오는 연결을 수신하는 대신 로컬 서비스에 연락하여 동기화합니다. 이것은 여전히 ​​주어진 호스트가 아닌 호스트에 rsync가 실제로 설치되어 있거나 작업 사본을 업로드 할 수 있지만 rsync 데몬을 공개적으로 주소 지정 가능한 방식으로 실행하고 암호화되지 않은 상태로 대화하는 것과 보안에 영향을 미치지 않습니다 채널.

위에서 설명한 것처럼 혼란스러운 행동은 호스트 정책에 위배 될 수 있지만 전혀 작동하지 않더라도 시작될 수 있습니다. 해당 계정에 대해 전체 셸을 활성화하고 해당 호스트에 대한 rsync를 포기하거나 해당 호스트를 포기하고 그렇게하지 않을 경우 다른 곳으로 옮길 수 있는지 묻는 것이 좋습니다.


2
전체 쉘일 필요는 없습니다. 적절한 인수를 가진 rsync 명령을 실행하기 만하면됩니다. scponly가 유용합니다.
sciurus

19

이론적으로는 그렇습니다. FUSE를 사용 하여 로컬 파일 시스템에 원격 파일 시스템을 마운트 할 수 있습니다 . 그런 다음 마운트 된 디렉토리와 로컬 디렉토리간에 rsync의 로컬 사본을 실행할 수 있습니다. 나는 이것을 개인적으로 시도하지는 않았지만 이론적으로 작동해야합니다. 비교를 수행하려면 각 파일의 적어도 일부를 전송해야하므로 SSH를 통한 rsync를 수행하는 것이 훨씬 덜 효율적일 수 있습니다.


11
타임 스탬프 + 크기 비교가 전송해야 할 것을 결정하기에 충분할 때 작동합니다. 체크섬이 필요하면 곧 전체 원격 파일과 전송 된 업데이트를 읽습니다. 따라서 rsync 옵션을 설정하여 각 파일에 대해 전혀 또는 아무것도하지 않도록 설정하십시오 (--ignore- 시간 또는 --checksum 및 --whole-file을 지정하면 충분합니다). --link-dest와 같은 일부 옵션은이 방식으로 제대로 (또는 전혀) 작동하지 않을 가능성이 높습니다.
David Spillett

David에게 세부 정보를 추가해 주셔서 감사합니다. 즉 :) 단지 꽤뿐만 아니라 그것들을 명확하게하지 않았다, 나는 생각했다 효율성의 제한의 종류
카밀 Kisiel

제한이있는 해결 방법입니다. 그러나 "적절한"rsync를 호출 할 방법이 없다면 충분합니다
Valery Lourie

10

rsync를 사용하는 대안은 lftp (sftp에 연결할 수 있음)를 사용하고 mirror 명령을 사용하는 것입니다. 예를 들어

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit

1
이 게시물은 질문에 대답하지 않지만 유용한 대안을 제공합니다
Dmitri Chubarov

5

조금 늦었지만 여기에 sshfs를 사용하여 수행하는 방법이 있습니다.

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt

3
@David Spillett이 이전 답변 ( serverfault.com/questions/135618/… ) 에 대한 의견에서 언급했듯이 이것은 작동하지만 rsync 프로토콜을 약간 비효율적으로 사용합니다.
Evan Anderson

2
조나단, 당신의 해결책이 잘못되었다고 생각합니다. 원격 드라이브를 마운트하고 두 개의 로컬 폴더를 동기화하는 것처럼 rsync를 실행하면 로컬 시스템의 rsync 프로세스가 원격 파일의 해시 값을 계산하므로 동기화시 모든 것이 항상 전송됩니다. 이는 전체 파일이 전송되고 rsync의 이점이 손실됨을 의미합니다. 편집 : 아이 답변이 여러 번 주어졌다 ... 복제를 위해 sry : D
Thekwasti


2

대안은 rsync를 데몬으로 시작하고 SSH 터널을 통해 연결하는 것입니다.


이 답변은 너무 짧아서 완전히 도움이되지는 않지만 서버 측에서 쉘 액세스를 허용 할 수 없지만 (1) 로컬로 수신 대기하는 외부 서버 (보안을 위해 외부에서 사용할 수 없음) 및 (2) ssh 터널을 허용 할 수있는 경우 원칙적 authorized_keys으로 특정 터널을 허용하고 실행 하는 규칙을 통해 서버에 로그인 할 수 있습니다 (예 :) sleep 86400. 그런 다음 클라이언트 쪽이 rsync터널을 통과 할 수 있습니다.
Stéphane Gourichon

2

모두를 결합한 옵션

다른 답변에는없는 다음과 같은 장점이 있습니다.

  • SSH (보안)의 모든 이점
  • rsync (대역폭 효율적인 프로토콜, 대역폭 제한과 같은 모든 rsync 옵션)의 장점
  • 실제로 효율적입니다 (때로는 시간을 절약하지만 실제로는 여전히 느린 sshfs와 달리)
  • 서버 측에서 임의의 쉘 명령이 필요하지 않습니다
  • ssh 터널을 허용하기 위해 서버가 필요하지 않습니다
  • rsync데몬 을 실행하기 위해 서버가 필요하지 않습니다

아직 테스트하지는 않았지만를 제외한 모든 기능을 성공적으로 사용했습니다 rrsync.

그것을하는 방법

  • ssh-keygen(openSSH 기능)을 사용하여 로컬로 키 생성
  • 서버의 항목이있는 해당 특정 키로 만 로그인 허용 ~/.ssh/authorized_keys(openSSH 기능)
  • 이 키를 rsync와 함께 배포 ~/.ssh/authorized_keys된 스크립트를 명령으로 사용하여 (openSSH 기능) 과 특정 명령에 연결합니다.rrsynccommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

그런 다음 클라이언트에서 정상적으로 rsync 할 수 있습니다.

더 자세한 정보가 필요한 경우

rsync에 대한 SSH 액세스 제한 | 가이 루텐 버그

위의 링크를 넘어 한 단계

해당 페이지 끝의 명령을 더 짧게 만들 수 있습니다. 다음 ~/.ssh/config과 같이 스탠자를 작성하십시오.

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

그런 다음 클라이언트의 rsync 명령

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

된다

rsync -av user@remote: etc2/

1
불행히도 SFTP 서버에서 rsync를 사용하는 것과는 아무런 관련이 없지만 rsyncSFTP 측면을 회피하면서 OpenSSH 서버를 실행 하도록 설정할 수 있습니다. 제어 할 수없는 다른 SFTP 서버가 제공되면이 답변으로 문제를 해결할 수 없습니다.
Malvineous

네가 옳아. 실제로 다른 질문에 대답하기 위해 이것을 작성하고 실수로 여기에 게시했을 수 있습니다. 여기서 답변을 제거하려고합니다.
Stéphane Gourichon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.