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?
csync /home/csync sftp://[email protected]:2222/home/csync
esta respuesta .lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
Respuestas:
Lamentablemente no directamente.
rsync
requiere un enlace limpio con un shell que le permita iniciar la copia remota dersync
, 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
exec
scripts 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.
fuente
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.
fuente
Una alternativa al uso de rsync es usar lftp (que puede conectarse a sftp) y usar el comando espejo. Por ejemplo, uno puede hacer
fuente
un poco tarde, pero así es como lo hago, usando sshfs
fuente
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.
fuente
Una alternativa sería iniciar rsync como daemon y conectarse a él a través de un túnel SSH.
fuente
authorized_keys
que permite un túnel específico y se ejecuta, por ejemplosleep 86400
. Entonces el lado del cliente podría entonces arsync
través del túnel.Opción que combina lo mejor de todo
Parece tener las siguientes ventajas que otras respuestas aquí no tienen:
rsync
demonioTodavía no lo he probado, pero he utilizado con éxito todas esas funciones, excepto
rrsync
.Cómo hacerlo
ssh-keygen
(función openSSH)~/.ssh/authorized_keys
(función openSSH)~/.ssh/authorized_keys
(función openSSH) usando como comando el scriptrrsync
distribuido 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/config
crear 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
se convierte
fuente
rsync
que 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.