원격 시스템에서 루트 권한으로 rsync 실행


30

컴퓨터의 폴더를 원격 컴퓨터의 폴더와 동기화하고 싶습니다. 원격 폴더는로만 조작 할 수 있습니다 root. 사용할 수있는 원격 컴퓨터에 계정이 있습니다 sudo. 원격 시스템에 대한 루트 권한을 갖도록 rsync를 어떻게 실행할 수 있습니까?

나는 다음을 시도했다.

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="sudo rsync"

그러나 (비밀번호를 입력 한 후) 다음 오류가 발생합니다.

sudo: no tty present and no askpass program specified

사용자가 쓰기 권한을 갖도록 원격 폴더에 대한 권한을 변경할 수 없습니까?
Phil

1
불행히도 그것은 옵션이 아닙니다.
피터

Unix SE unix.stackexchange.com/questions/92123/… 에서 같은 질문에 대한 답변을 확인하는 것이 훨씬 좋습니다 .
ndemou

답변:


12

이 솔루션을 사용해보십시오. sudoers 파일 ( /etc/sudoers)에서 다음과 같이 사용자를 설정하십시오.

username ALL= NOPASSWD:/usr/bin/rsync

NOPASSWD:/usr/bin/rsync말한다 sudo사용자가 실행되면 있다는 /usr/bin/rsync하거나 rsync암호가 필요하지된다.

그런 다음 원본 --rsync-path="sudo rsync"이 작동합니다.


rsync 완료 후 username ALL ...을 설정하지 않고 sudo rsync 옵션을 사용했습니다. 내가 cd 또는 ls하려고 할 때 리모컨에서. 권한이 거부되었습니다. 비록 내가 루트입니다. 난 LS에 sudo해야합니다. 그러나 cd의 경우 불가능합니다. 모든 디렉토리와 파일을 숨기려고했습니다. 여전히 작동하지 않았다. 아무도 이유와 해결 방법을 알고 있습니까?
공포의 세미콜론

2
sudoers 파일을 편집하는 방법도 설명해야합니다
Jonathan

1
이 수정의 보안 관련 내용은 unix.stackexchange.com/a/92397/128237 을 참조하십시오 .
BrainStorm.exe

11

이것이 내가 생각해 낸 해결책입니다.

rsync -R -avz -e ssh --rsync-path="echo mypassword | sudo -S  mkdir -p /remote/lovely/folder && sudo rsync" /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete

미션의 비트!


12
명령 행에 비밀번호가 표시 될 것입니다. rsync가 실행되는 시간 동안 표시되어야합니다.
BillThor

1
비밀번호는 어디에 있습니까? 커맨드 라인의 로컬 박스에 있습니까? 아니면이 접근 방식으로 인해 원격 취약점이 발생합니까? 위의 답변 과이 솔루션 사용의 결과를 이해하려고합니다. 여기에 질문을했습니다 : superuser.com/questions/398146/…
MountainX

@MountainX 프로세스 목록에 표시됩니다 (예 :) ps aux. 테스트 : rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/example을 누른 다음 원격 컴퓨터에서 터미널을 엽니 다 ps aux | grep find. find /실행 시간이 길어 처음 떠 올랐을 때만 사용됩니다.
Ivan Vučica

1
나는 이것이 오래되었다는 것을 알고 있지만, 명령에서 암호를 피하려면 ssh의 키를 사용하고 원격 컴퓨터에서 NOPASSWD : ALL 플래그를 사용하여 sudoers 파일에 사용자를 추가하십시오. 다음 링크에서 최고 순위 답변을 참조하십시오. 참고 : 정답은 아닙니다 : askubuntu.com/questions/147241/execute-sudo-without-password
Dave

10

이 블로그의 솔루션은 저에게 정말 효과적이었습니다 : http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

원래:

stty -echo; ssh myUser@REMOTE_SERVER "sudo -v"; stty echo  
rsync -avze ssh --rsync-path='sudo rsync' myUser@REMOTE_SERVER:/REMOTE_PATH/ LOCAL_PATH 

첫 번째 줄은 화면에 비밀번호를 표시하지 않고 대화식 비밀번호 입력을 허용합니다. Ubuntu 9.04에서 훌륭하게 작동합니다.


1
tty_tickets 옵션을 설정 해제해야합니다 !tty_tickets.
blueyed

2
게임하는 ssh -t [other options]대신에 stty -echo어떻습니까?
Ivan Vučica

나는 내 사건을 이미 설정하지 않았다 tty_tickets.
MountainX

1
sudo: no tty present and no askpass program specified
Michael

tty_tickets를 어떻게 설정 해제합니까? 어느 기계에서? 이 rsync 명령 중에?
Jonathan

4

에 비밀번호를 제공하는 방법이 필요합니다 sudo. askpass프로그램은 일반적인 메커니즘을 이용할 수없는 경우에 암호를 요구하도록 설계되었습니다. 사용자 ID로 sudo비밀번호를 실행할 필요가 없도록 설정하는 rsync것이 하나의 옵션입니다.

나는 일반적으로 이와 같은 경우에 적절한 제한으로 키 기반 로그인을 구성합니다. rsync루트 로만 실행되는 제한된 키를 구성하면 이런 종류의 작업이 더 쉬워집니다. 다른 대안은 rsycnd프로세스를 사용하여 원격 요청을 처리하는 것입니다. 구성은 적용 할 수있는 다양한 제한 사항을 제공합니다.

편집 : Linux에서 BackupPC 설정 에 대한 게시물의 클라이언트에서 사용자 ID 만들기 섹션에서 키 기반 검색을위한 키를 설정하는 스크립트를 포함 시켰 습니다 . 스크립트에 표시된대로 키 사용을 되풀이하여 수행 할 수있는 작업 중 일부를 자세히 설명하는 ssh_config 문서를 참조하십시오.


도와 주셔서 감사하지만 더 나은 솔루션을 찾았습니다.
피터

키 기반 로그인에 대한 자세한 내용은 무엇입니까?
TheVillageIdiot


2

기존 답변의 복잡성에 놀랐습니다. 그건 지금까지 암호를 사용하지 않고 원격 호스트에 루트로 연결 할 수 있도록 시스템 (PC와 원격 호스트)를 구성하기 쉽고 편리. 그리고 외관과 달리 안전 합니다.

  1. 원격 호스트에서 / etc / ssh / sshd_config에 "PermitRootLogin without-password"라는 행이 있는지 확인하십시오 (많은 배포판에는 기본적으로 존재 함). 이를 통해 root 는 안전하지 않은 비밀번호 프롬프트를 제외한 모든 인증 방법을 사용하여 ssh 쉘을 얻을 수 있습니다 .
  2. (아직 방법을 모르는 경우) ssh를 통해 비밀번호없는 로그인을 얻는 방법에 대한 많은 자습서 를 따르십시오.
  3. 일반적으로 비밀번호 프롬프트없이 rsync를 사용하십시오.

원격 호스트의 /root/.ssh/authorized_keys 행에 시스템이 PC의 루트 명령을 허용하는 한 잊지 마십시오.


rrsync 는이 방법을 사용합니다.
코드 리드

0

NOPASSWDUbuntu 14.04에서 암호 인증을 유지하고 싶 거나 키 를 사용하고 싶지 않다는 점을 고려할 때 나를 위해 일한 것은 다음과 같습니다 .

  • 임시 파일을 통해 sudo비활성화하여 원격 시스템에서 "열기" (데비안에서 지원되어야 함 ) 및 "사용자의 캐시 된 자격 증명 업데이트", "추가 15 분 동안 sudo 시간 초과 연장"tty_tickets/etc/sudoers.d//etc/sudoers.d/README
  • 다른 답변에 표시된대로 rsyncwith sudo를 실행하십시오.
  • "닫기 아래" sudo에 임시 파일을 제거하여 원격 컴퓨터에 /etc/sudoers.d/다시는-수 있습니다tty_tickets

... 또는 명령 행으로 :

ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'

로컬 컴퓨터에서 이러한 명령을 실행할 때 얻을 수있는 응답은 다음과 같습니다.

$ ssh -t $REMOTEPC 'echo "Defaults !tty_tickets" | sudo tee /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
[sudo] password for remoteuser: 
Defaults !tty_tickets
Connection to $REMOTEPC closed.

$ rsync -aP -e 'ssh' '--rsync-path=sudo rsync' /etc/pulse/client.conf $REMOTEPC:/etc/pulse/client-copy.conf
remoteuser@$REMOTEPC's password: 
sending incremental file list
client.conf
           1269 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/1)

$ ssh -t $REMOTEPC 'sudo rm -v /etc/sudoers.d/temp; sudo -v'
remoteuser@$REMOTEPC's password: 
removed ‘/etc/sudoers.d/temp’
[sudo] password for remoteuser: 
Connection to $REMOTEPC closed.

sudo -v파일이있을 때마다 실행되어야 /etc/sudoers.d/하므로 변경 사항이 적용됩니다.


0

또 다른 방법은 원격 시스템에서 rsync를 시작하여 권한 제한을 해결하는 것입니다. 대신에:

rsync /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder

넌 할 수있어:

ssh ubuntu@x.x.x.x 'rsync ubuntu@y.y.y.y:/home/ubuntu/my/lovely/folder /remote/lovely/folder'

y.y.y.y로컬 컴퓨터의 IP 주소는 어디에 있습니까 ? 로컬 시스템이 SSH 서버로 작동 할 수있는 경우에만 작동합니다.


1
흠 ... 첫 번째 명령 줄에서 로컬을 원격으로 복사하지 않습니까? 두 번째 명령 줄에서 첫 번째와 동일하며 원격을 로컬로 복사합니다 (첫 번째와 동일하지 않음)?
sdaau

으악! 고쳤다.
Keith

0

내 해결 방법은 추가하는 것입니다 --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

예:

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="echo <PASSWORD> | sudo -Sv && sudo rsync"

일반적으로 암호를 명령 줄 한 줄짜리에 넣는 것은 좋지 않습니다. 예를 들어 프로세스 트리에 표시됩니다. 이 유형의 명령문에서 실제 비밀번호를 $ (cat my_password.txt)로 바꾸는 경우가 있습니다.

rsync -avz -e ssh /home/ubuntu/my/lovely/folder ubuntu@x.x.x.x:/remote/lovely/folder --delete --rsync-path="cat my_password.txt | sudo -Sv && sudo rsync"


약간의 맥락과 설명으로 이것을 확장 할 수 있습니까? 무엇에 "추가"어디? 이것이 왜 문제를 해결합니까? 감사.
fixer1234
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.