È possibile usare rsync su sftp (senza una shell ssh)?


60

Rsync su ssh, funziona alla grande ogni volta.

Tuttavia, il tentativo di risincronizzare con un host che consente solo accessi sftp, ma non accessi ssh, fornisce il seguente errore:

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

mancata corrispondenza della versione del protocollo: la shell è pulita? (per una spiegazione consultare la pagina man di rsync) Errore rsync: incompatibilità del protocollo (codice 2) su compat.c (171) [mittente = 3.0.6]

Ecco la sezione pertinente dalla pagina man di rsync:

Questo messaggio è in genere causato dagli script di avvio o dalla funzione di shell remota che produce immondizia indesiderata sul flusso utilizzato da rsync per il suo trasporto. Il modo per diagnosticare questo problema è eseguire la shell remota in questo modo:

          ssh remotehost /bin/true > out.dat

quindi guarda out.dat. Se tutto funziona correttamente, out.dat dovrebbe essere un file di lunghezza zero. Se ricevi l'errore sopra riportato da rsync, probabilmente scoprirai che out.dat contiene del testo o dei dati. Guarda i contenuti e prova a capire cosa lo sta producendo. La causa più comune sono gli script di avvio della shell configurati in modo errato (come .cshrc o .profile) che contengono istruzioni di output per accessi non interattivi.

Provando questo sul mio sistema, ho prodotto quanto segue in out.dat:

ssh-dummy-shell: comando non consentito.

Come pensavo, l'host non consente accessi ssh.

Il seguente collegamento mostra che è possibile eseguire questa attività utilizzando il fusibile con sshfs, tuttavia è estremamente lento e non adatto all'uso in produzione.

C'è qualche possibilità di far funzionare rsync sftp?


3
lftp farà il trucco. Sincronizzerò da locale a remoto con l'interruttore -R

Sai come i comandi sono limitati sul server? In tal caso, impostando ForceCommand in sshd_config, vedere se è possibile modificare il file a cui punta. O se è impostato dal comando in authorized_keys, allora forse è possibile accedere a authorized_keys su sshfs e cambiarlo?
ptman,

Potresti provare csync : csync /home/csync sftp://csync@krikkit.galaxy.site:2222/home/csyncvedi questa risposta .
nachtigall,

6
Alla fine l'ho fatto con lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall,

@nachtigall sai come usare lftp con più file di input / un elenco di file e directory?
Bortran,

Risposte:


39

Purtroppo non direttamente. rsyncrichiede un collegamento pulito con una shell che gli consenta di avviare la copia remota di rsync, quando eseguito in questo modo.

Se hai un modo di eseguire processi di ascolto di lunga durata sull'host, puoi provare ad avviare rsync in ascolto manuale delle connessioni su una porta non privilegiata, ma la maggior parte delle tecniche per farlo richiederebbe anche un corretto accesso alla shell tramite SSH, e si basa su le disposizioni del firewall host che consentono connessioni sulla porta scelta (e l'host con rsync installato in primo luogo). L'esecuzione di rsync come servizio indirizzabile al pubblico (piuttosto che indirettamente tramite SSH o simili) non è generalmente consigliata per i dati non pubblici.

Se il tuo host consente lo scripting in PHP o simili e non lo ha bloccato, quindi i processi extra non possono essere modificati execdagli script utente, puoi provare ad avviare rsync in modalità di ascolto in quel modo. Se la tua estremità è connessa (stai eseguendo SSH accessibile al mondo esterno) puoi provare questo al contrario - fai eseguire uno script rsync sul server ma invece di ascoltare le connessioni in entrata, contatta il tuo servizio locale e sincronizza in quel modo. Ciò si basa ancora sul fatto che rsync sia effettivamente installato sull'host che non è un dato di fatto, o che è possibile caricare una copia funzionante, ma non ha le implicazioni di sicurezza di eseguire un demone rsync in un modo indirizzabile pubblicamente e parlare con esso su un non crittografato canale.

Fare casino come descritto sopra potrebbe essere contro le politiche degli host, anche se funziona, e potrebbe farti dare il calcio d'inizio. È meglio chiedere se è possibile abilitare una shell completa per quell'account e abbandonare rsync per quell'host o abbandonare quell'host e spostarsi altrove se non lo faranno.


2
Si noti che non deve essere una shell completa; deve solo consentire l'esecuzione del comando rsync con gli argomenti appropriati. scponly è utile per questo.
sciurus,

19

Teoricamente si. Puoi montare il filesystem remoto sul tuo computer locale usando FUSE . Quindi è possibile eseguire una copia locale di rsync tra la directory montata e la directory locale. Non l'ho provato personalmente, ma dovrebbe funzionare in teoria. Probabilmente sarebbe molto meno efficiente che eseguire rsync su SSH perché avrebbe bisogno di trasferire almeno una parte di ciascun file per eseguire il confronto.


11
Ciò dovrebbe funzionare quando è sufficiente un confronto di data e ora + dimensioni per decidere cosa deve essere inviato. Non appena è necessario un checksum, l'intero file remoto verrà letto sulla linea e gli aggiornamenti inviati, quindi assicurati di avere le opzioni di rsync impostate in modo tale che faccia tutto o niente per ogni file (non usando --ignore- volte o --checksum e avendo - il file intero specificato potrebbe essere sufficiente). È improbabile che alcune opzioni come --link-dest funzionino correttamente (o affatto) in questo modo.
David Spillett,

Grazie per aver aggiunto alcuni dettagli David. Questo è il tipo di limitazioni in termini di efficienza a cui stavo pensando, ma non le ho articolate altrettanto bene :)
Kamil Kisiel,

È una soluzione alternativa con limiti, sì, ma è abbastanza buono se non c'è modo di invocare "rsync" corretto
Valery Lourie,

10

Un'alternativa all'utilizzo di rsync è invece usare lftp (che può connettersi a sftp) e usare il comando mirror. Ad esempio uno può fare

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

1
Mentre questo post non risponde alla domanda fornisce un'alternativa utile
Dmitri Chubarov

6

un po 'in ritardo, ma ecco come lo faccio, usando 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
Come afferma @David Spillett nel suo commento su una risposta precedente ( serverfault.com/questions/135618/… ), questo funzionerà ma è un po 'inefficiente nell'uso del protocollo rsync.
Evan Anderson,

2
Jonathan, penso che la tua soluzione sia sbagliata. Se si monta un'unità remota ed si esegue rsync come se si sincronizzassero due cartelle locali, viene sempre trasferito tutto durante la sincronizzazione poiché il processo rsync sul computer locale calcola i valori hash dei file remoti. Ciò significa che l'intero file viene trasferito e i vantaggi di rsync vengono persi. Modifica: ah questa risposta è stata data più volte ... sry per la replica: D
Thekwasti

2

No. rsync funziona eseguendo rsync dall'altra parte e comunicando con esso, il che significa che è necessaria una qualche forma di accesso alla shell.


2

Un'alternativa sarebbe avviare rsync come demone e connettersi ad esso attraverso un tunnel SSH.


Questa risposta è troppo breve per essere completamente utile, ma se il lato server non può consentire l'accesso alla shell ma può consentire (1) un server rsync in ascolto locale (non disponibile dall'esterno, per sicurezza) e (2) tunnel ssh, quindi in principio si potrebbe accedere al server tramite una regola authorized_keysche consenta un tunnel specifico ed esegua ad es sleep 86400. Quindi il lato client potrebbe quindi rsynctramite il tunnel.
Stéphane Gourichon,

2

Opzione che combina meglio di tutti

Sembra avere i seguenti vantaggi che altre risposte qui non hanno:

  • beneficia pienamente di SSH (sicuro)
  • beneficia pienamente di rsync (protocollo efficiente in termini di larghezza di banda, tutte le opzioni di rsync come limitazione della larghezza di banda)
  • effettivamente efficiente (a differenza di sshfs che a volte salva i giorni ma è ancora lento nella pratica)
  • non necessita di comandi shell arbitrari lato server
  • non necessita di server per consentire i tunnel ssh
  • non necessita di server per eseguire un rsyncdemone

Non l'ho ancora testato, ma ho usato con successo tutte quelle funzionalità tranne rrsync.

Come farlo

  • crea una chiave localmente con ssh-keygen(funzione openSSH)
  • consentire l'accesso solo con quella chiave specifica, con una voce nel server ~/.ssh/authorized_keys(funzione openSSH)
  • associare questa chiave a un comando specifico, con ~/.ssh/authorized_keys(funzione openSSH) usando come comando lo script rrsyncdistribuito con rsync, qualcosa di similecommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Quindi puoi risincronizzare normalmente dal client.

Se hai bisogno di maggiori dettagli

Limitazione dell'accesso SSH a rsync | Guy Rutenberg

Un passo oltre il link sopra

Il comando alla fine di quella pagina può essere ridotto. Nel ~/.ssh/configcreare una stanza come questa:

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

quindi il comando rsync dal client

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

diventa

rsync -av user@remote: etc2/

1
Sfortunatamente questo non ha nulla a che fare con l'uso di rsync con un server SFTP, si tratta di configurare un server OpenSSH per consentire rsyncl'esecuzione, eludendo l'aspetto SFTP. Se ti viene presentato il server SFTP di qualcun altro su cui non hai alcun controllo, questa risposta non può risolvere il problema.
Malvineous,

Hai ragione. Potrei averlo effettivamente scritto per rispondere a un'altra domanda e pubblicato qui per errore. Sto pensando di rimuovere la mia risposta qui.
Stéphane Gourichon,
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.