¿Es posible usar rsync sobre sftp (sin un shell ssh)?

60

Rsync sobre ssh, funciona muy bien cada vez.

Sin embargo, intentar rsync a un host que solo permite inicios de sesión sftp, pero no inicios de sesión ssh, proporciona el siguiente error:

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

no coinciden las versiones del protocolo: ¿está limpio su shell? (consulte la página de manual de rsync para obtener una explicación) Error de rsync: incompatibilidad de protocolo (código 2) en compat.c (171) [remitente = 3.0.6]

Aquí está la sección relevante de la página de manual de rsync:

Este mensaje generalmente es causado por sus scripts de inicio o instalación remota de shell que produce basura no deseada en la secuencia que rsync está utilizando para su transporte. La forma de diagnosticar este problema es ejecutar su shell remoto de esta manera:

          ssh remotehost /bin/true > out.dat

luego mira out.dat. Si todo funciona correctamente, out.dat debería ser un archivo de longitud cero. Si obtiene el error anterior de rsync, probablemente encontrará que out.dat contiene texto o datos. Mire el contenido e intente averiguar qué lo produce. La causa más común son los scripts de inicio de shell configurados incorrectamente (como .cshrc o .profile) que contienen sentencias de salida para inicios de sesión no interactivos.

Probar esto en mi sistema produjo lo siguiente en out.dat:

ssh-dummy-shell: comando no permitido.

Como pensaba, el host no permite inicios de sesión ssh.

El siguiente enlace muestra que es posible realizar esta tarea usando el fusible con sshfs; sin embargo, es extremadamente lento y no es apto para el uso de producción.

¿Hay alguna posibilidad de que rsync sftp funcione?

Tom Feiner
fuente
3
lftp hará el truco.
¿Sabes cómo se restringen los comandos en el servidor? Si es mediante la configuración de ForceCommand en sshd_config, vea si puede modificar el archivo al que apunta. O si está configurado por comando en autorizado_claves, ¿entonces tal vez pueda acceder a autorizado_claves a través de sshfs y cambiarlo?
ptman
Puedes probar csync : miracsync /home/csync sftp://[email protected]:2222/home/csync esta respuesta .
nachtigall
66
Finalmente, lo hice con lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall
@nachtigall, ¿sabe cómo usar lftp con múltiples archivos de entrada / una lista de archivos y directorios?
bortran

Respuestas:

39

Lamentablemente no directamente. rsyncrequiere un enlace limpio con un shell que le permita iniciar la copia remota de rsync, cuando se ejecuta de esta manera.

Si tiene alguna forma de ejecutar procesos de escucha de larga duración en el host, puede intentar iniciar rsync de forma manual para escuchar conexiones en un puerto no privilegiado, pero la mayoría de las técnicas para hacerlo requerirían un acceso de shell adecuado a través de SSH, y se basa en los arreglos de firewall de los hosts que permiten conexiones en el puerto que eligió (y el host que tiene rsync instalado en primer lugar). Sin embargo, no se recomienda ejecutar rsync como un servicio de acceso público (en lugar de indirectamente a través de SSH o similar) para datos no públicos.

Si el host permite la creación de scripts en PHP o similar y no lo tiene bloqueado para que los execscripts de usuario no puedan editar procesos adicionales , entonces puede intentar iniciar rsync en modo de escucha de esa manera. Si su extremo es conectable (está ejecutando SSH accesible para el mundo exterior), puede intentar esto a la inversa: haga que un script ejecute rsync en el servidor, pero en lugar de escuchar las conexiones entrantes, póngase en contacto con su servicio local y sincronice de esa manera. Esto todavía se basa en que rsync realmente se instala en el host, lo que no es un hecho, o que puede cargar una copia de trabajo, pero no tiene las implicaciones de seguridad de ejecutar un demonio rsync de una manera públicamente accesible y hablar con él sin cifrar canal.

Sin embargo, perder el tiempo como se describió anteriormente puede estar en contra de las políticas de los hosts, incluso si funciona, y podría hacer que te echen. Es mejor preguntar si se puede habilitar un shell completo para esa cuenta y abandonar rsync para ese host o abandonar ese host y mudarse a otro lugar si no lo hacen.

David Spillett
fuente
2
Tenga en cuenta que no tiene que ser un shell completo; solo tiene que permitir que se ejecute el comando rsync con los argumentos adecuados. scponly es útil para esto.
sciurus
19

Teóricamente sí. Puede montar el sistema de archivos remoto en su máquina local utilizando FUSE . Luego puede ejecutar una copia local de rsync entre el directorio montado y el directorio local. No lo he intentado personalmente, pero debería funcionar en teoría. Probablemente sería mucho menos eficiente que realizar el rsync sobre SSH porque necesitaría transferir al menos parte de cada archivo para realizar la comparación.

Kamil Kisiel
fuente
11
Eso debería funcionar cuando la comparación de marca de tiempo + tamaño es suficiente para decidir qué debe enviarse. Tan pronto como se necesite una suma de comprobación, se leerá todo el archivo remoto a través de la línea, así como las actualizaciones enviadas, así que asegúrese de tener configuradas las opciones de rsync de modo que haga todo o nada para cada archivo (no use --ignore- veces o --checksum y tener --whole-file especificado puede ser suficiente). Es poco probable que algunas opciones como --link-dest funcionen correctamente (o no funcionen) de esta manera.
David Spillett el
Gracias por agregar algunos detalles David. Ese era el tipo de limitaciones en eficiencia en las que estaba pensando, pero no las articulaba tan bien :)
Kamil Kisiel
Es una solución alternativa con limitaciones, sí, pero es lo suficientemente bueno si no hay forma de invocar rsync "adecuado"
Valery Lourie
10

Una alternativa al uso de rsync es usar lftp (que puede conectarse a sftp) y usar el comando espejo. Por ejemplo, uno puede hacer

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
xioxox
fuente
1
Si bien esta publicación no responde a la pregunta, ofrece una alternativa útil
Dmitri Chubarov
6

un poco tarde, pero así es como lo hago, 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
Jonathan
fuente
3
Como @David Spillett dice en su comentario sobre una respuesta anterior ( serverfault.com/questions/135618/… ), esto funcionará, pero es un uso poco eficiente del protocolo rsync.
Evan Anderson
2
Jonathan, creo que tu solución está mal. Si monta una unidad remota y ejecuta rsync como si sincronizara dos carpetas locales, siempre se transfiere todo al sincronizar ya que el proceso rsync en su máquina local calcula los valores hash de los archivos remotos. Esto significa que todo el archivo se transfiere y se pierden los beneficios de rsync. Editar: ah, esta respuesta se ha dado varias veces ... sry para replicación: D
Thekwasti
2

No. rsync funciona ejecutando rsync en el otro lado y comunicándose con él, lo que significa que se requiere algún tipo de acceso de shell.

Ignacio Vazquez-Abrams
fuente
2

Una alternativa sería iniciar rsync como daemon y conectarse a él a través de un túnel SSH.

Dan Andreatta
fuente
Esta respuesta es demasiado corta para ser completamente útil, pero si el lado del servidor no puede permitir el acceso de shell pero puede permitir (1) un servidor rsync que escuche localmente (no disponible desde el exterior, por seguridad), y (2) túnel ssh, entonces en principio, uno podría iniciar sesión en el servidor a través de una regla authorized_keysque permite un túnel específico y se ejecuta, por ejemplo sleep 86400. Entonces el lado del cliente podría entonces a rsynctravés del túnel.
Stéphane Gourichon
2

Opción que combina lo mejor de todo

Parece tener las siguientes ventajas que otras respuestas aquí no tienen:

  • se beneficia plenamente de SSH (seguro)
  • se beneficia plenamente de rsync (protocolo eficiente de ancho de banda, todas las opciones de rsync como limitación de ancho de banda)
  • realmente eficiente (a diferencia de los sshfs que a veces salvan los días pero aún son lentos en la práctica)
  • no necesita comandos de shell arbitrarios del lado del servidor
  • no necesita servidor para permitir túneles ssh
  • no necesita servidor para ejecutar un rsyncdemonio

Todavía no lo he probado, pero he utilizado con éxito todas esas funciones, excepto rrsync.

Cómo hacerlo

  • crear una clave localmente con ssh-keygen(función openSSH)
  • permitir el inicio de sesión solo con esa clave específica, con una entrada en el servidor ~/.ssh/authorized_keys(función openSSH)
  • asocie esta clave a un comando específico, con ~/.ssh/authorized_keys(función openSSH) usando como comando el script rrsyncdistribuido con rsync, algo así comocommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Entonces puede rsync desde el cliente normalmente.

Si necesitas mas detalles

Restricción del acceso SSH a rsync | Guy Rutenberg

Un paso más allá del enlace de arriba

El comando al final de esa página se puede acortar. En ~/.ssh/configcrear una estrofa como esta:

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

entonces su comando rsync del cliente

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

se convierte

rsync -av user@remote: etc2/
Stéphane Gourichon
fuente
1
Desafortunadamente, esto no tiene nada que ver con el uso de rsync con un servidor SFTP, se trata de configurar un servidor OpenSSH para permitir rsyncque se ejecute, evitando el aspecto SFTP. Si se le presenta el servidor SFTP de otra persona sobre el que no tiene ningún control, esta respuesta no puede resolver el problema.
Malvineous
Tienes razón. En realidad, podría haber escrito esto para responder otra pregunta y publicado aquí por error. Estoy considerando eliminar mi respuesta aquí.
Stéphane Gourichon