Esegui rsync con l'autorizzazione di root sul computer remoto


32

Voglio sincronizzare una cartella dalla mia macchina con una cartella su una macchina remota. La cartella remota può essere manipolata solo da root. Ho un account sul computer remoto che può usare sudo. Come posso eseguire rsync in modo tale che abbia i permessi di root sul computer remoto?

Ho provato quanto segue:

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

Ma (dopo aver inserito la mia password) ricevo il seguente errore:

sudo: no tty present and no askpass program specified

Non è possibile modificare le autorizzazioni sulla cartella remota in modo che l'utente abbia accesso in scrittura ad essa?
Phil

1
Sfortunatamente questa non è un'opzione.
Peter,

È molto meglio controllare la risposta sulla stessa domanda su Unix SE unix.stackexchange.com/questions/92123/… .
ndemou,

Risposte:


12

Prova questa soluzione. Nel tuo file sudoers ( /etc/sudoers) imposta il tuo utente in questo modo:

username ALL= NOPASSWD:/usr/bin/rsync

la NOPASSWD:/usr/bin/rsyncracconta sudoche quando il vostro utente esegue /usr/bin/rsynco semplicemente rsyncche non è necessaria alcuna password.

Quindi l'originale --rsync-path="sudo rsync"dovrebbe funzionare.


Ho usato l'opzione sudo rsync senza impostare il nome utente ALL ... dopo aver fatto rsync. sul telecomando quando provo a cd o ls. Mi viene negata l'autorizzazione. anche se sono root. devo fare il ldo a ls. ma nel caso del cd non è nemmeno possibile. Ho provato a chown tutte le directory e i file. ancora non ha funzionato. qualcuno conosce il motivo e come risolverlo?
Temibile punto e virgola

2
dovresti anche dire come modificare il file sudoers
Jonathan,

2
Consultare unix.stackexchange.com/a/92397/128237 per le implicazioni di sicurezza di questa correzione.
BrainStorm.exe

11

Questa è la soluzione che mi è venuta in mente:

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

Un po 'una missione!


12
Spero che riconoscerai che la tua password sarà visibile nella riga di comando. Dovrebbe essere visibile per il periodo di tempo in cui rsync è in esecuzione.
BillThor

1
dove è visibile la password? Solo sulla casella locale nella riga di comando? O questo approccio crea anche vulnerabilità remote? Sto cercando di capire la risposta sopra e le conseguenze dell'utilizzo di questa soluzione. Ho fatto una domanda qui: superuser.com/questions/398146/…
MountainX

@MountainX Sarà visibile nell'elenco dei processi (ad es ps aux.). Test:, rsync -R -avz -e ssh --rsync-path="find / > /dev/null && rsync" server.example.com:/ /tmp/examplequindi aprire il terminale sulla macchina remota e ps aux | grep find. find /è usato solo perché è la prima cosa che mi è venuta in mente con una lunga durata di esecuzione.
Ivan Vučica,

1
So che questo è vecchio ma, se si desidera evitare la password nel comando, è possibile utilizzare i tasti per ssh e sulla macchina remota aggiungere l'utente al file sudoers con il flag NOPASSWD: ALL. Vedi la risposta di grado più alto al seguente link. NOTA: non è la risposta accettata: askubuntu.com/questions/147241/execute-sudo-without-password
Dave,

10

La soluzione su questo blog ha funzionato davvero bene per me: http://www.pplux.com/2009/02/07/rsync-root-and-sudo/ .

Fondamentalmente:

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

La prima riga consente l'immissione interattiva della password, senza mostrare la password sullo schermo. Funziona benissimo per me su Ubuntu 9.04.


1
Ciò richiede l'opzione tty_tickets essere disinserito: !tty_tickets.
blueyed

2
Che ne dici ssh -t [other options]invece di giocare con stty -echo?
Ivan Vučica,

Nel mio caso ho già disinserito: tty_ticketscomunque ... quindi posso provare questo approccio.
MountainX,

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

Come si disinseriscono tty_tickets? Su quale macchina? Durante questo comando rsync?
Jonathan,

4

È necessario un metodo per fornire la password sudo. Un askpassprogramma è progettato per richiedere password quando i normali meccanismi non sono disponibili. L'impostazione sudoper non richiedere l'esecuzione di una password rsynccome ID utente è un'opzione.

Normalmente configuro l'accesso basato su chiave con restrizioni appropriate per casi come questo. Se si configura una chiave limitata che viene eseguita solo rsynccome root, questo tipo di cose diventa più facile da fare. Un'altra alternativa è utilizzare un rsycndprocesso per gestire le richieste remote. La configurazione offre una varietà di restrizioni che possono essere applicate.

EDIT: ho incluso uno script per impostare le chiavi per i loings basati su chiavi nella sezione Creazione di userid su client del mio post su Impostazione di BackupPC su Linux . Vedi anche la documentazione per ssh_config che descrive in dettaglio alcune delle cose che puoi fare per limitare l'uso delle chiavi come mostrato nello script.


Grazie per il tuo aiuto, ma ho trovato una soluzione che funziona meglio per me.
Peter,

qualche dettaglio sull'accesso con chiave?
TheVillageIdiot


2

Sono sorpreso dalla complessità delle risposte esistenti. Configurare i sistemi (PC e host remoto) è molto più semplice e conveniente in modo da poter connettersi come root all'host remoto senza utilizzare una password. E a differenza del suo aspetto è anche sicuro .

  1. Sull'host remoto assicurarsi che / etc / ssh / sshd_config abbia questa riga "PermitRootLogin senza password" (in molte distribuzioni è presente per impostazione predefinita). Ciò consente a root di ottenere una shell ssh usando qualsiasi metodo di autenticazione tranne la richiesta di password non sicura.
  2. (Se non sai già come) segui uno dei tanti tutorial su come ottenere l'accesso senza password tramite ssh
  3. Usa rsync come faresti normalmente e senza alcuna richiesta di password.

Basta non dimenticare che fintanto che la linea in /root/.ssh/authorized_keys dell'host remoto è lì, la macchina accetta i comandi di root dal PC.


rrsync utilizza questo approccio.
CODICE REVISIONATO il

0

Ecco cosa ha funzionato per me, considerando che voglio mantenere l'autenticazione della password (quindi non voglio usare NOPASSWDné chiavi) - su Ubuntu 14.04:

  • "Apri" sudosul computer remoto disabilitando tty_ticketstramite un file temporaneo in /etc/sudoers.d/(che dovrebbe essere supportato su Debian, vedi /etc/sudoers.d/README), e "Aggiorna le credenziali memorizzate nella cache dell'utente", che "estende il timeout sudo per altri 15 minuti"
  • Esegui il rsynccon sudocome mostrato in altre risposte
  • "Chiudi" sudosul computer remoto rimuovendo il file temporaneo in /etc/sudoers.d/, che riattivatty_tickets

... oppure, con le righe di comando:

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'

Queste sono le risposte che ottengo quando eseguo questi comandi sul computer locale:

$ 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.

Si noti che sudo -vdovrebbe essere eseguito dopo ogni volta che i file /etc/sudoers.d/vengono inseriti, quindi le modifiche ivi contenute vengono accettate.


0

Un altro metodo è aggirare le restrizioni sui permessi avviando rsync sul computer remoto. Invece di:

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

Tu puoi fare:

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

Dove si y.y.y.ytrova l'indirizzo IP della macchina locale. Funziona solo se il tuo computer locale può fungere da server SSH.


1
Hm ... non stai copiando local to remote nella tua prima riga di comando - e poi nella seconda riga di comando, che dovrebbe essere equivalente alla prima, copiando remote in local (che non è equivalente alla prima)?
sdaau,

Ops! Aggiustato.
Keith il

0

La mia soluzione è aggiungere --rsync-path="echo PASSWORD | sudo -Sv && sudo rsync"

esempio:

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"

Di solito non è una buona idea mettere le password in una riga di comando a riga singola; diventano visibili nell'albero del processo, per esempio. A volte sostituisco la password effettiva in questo tipo di istruzione con $ (cat my_password.txt) che è leggermente migliore

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"


Puoi approfondire questo con un piccolo contesto e spiegazione? "aggiungi" a cosa, dove? Perché questo risolve il problema? Grazie.
fixer1234,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.