Cuando usa SSH para conectar rsync a un servidor remoto, ¿cómo escapa de espacios y demás en la ruta remota? Una barra invertida simple escapa del espacio para la solicitud de bash local, pero en la máquina remota, el espacio se lee como una interrupción en la ruta, marcando así el final de esa ruta.
Entonces, cuando hago, rsync -avz /path/to/source/some\ dir/ [email protected]:/path/to/dest/some\ dir/
lo que sucede es que el servidor remoto está leyendo eso como justo /path/to/dest/some/
y dado que no puede encontrar ese destino de forma remota, porque el destino real es "algún directorio" en lugar de solo "algunos".
Si intento el mismo comando y escapo de la barra diagonal inversa y el espacio para pasar el indicador bash local y mantener la barra diagonal inversa para el servidor remoto (tres barras diagonales en total:) /path/to/dest/some\\\ dir/
, de hecho envía la barra diagonal inversa al servidor remoto, pero al servidor remoto luego interpreta el camino como en /path/to/dest/some\/
lugar de /path/to/dest/some\ dir/
quitar el espacio y los caracteres que siguen.
Si trato de ajustar el camino con comillas, se comporta de la misma manera, cortando efectivamente el camino en el espacio. Por lo tanto, también solo funciona para pasar el indicador de bash local.
Inicialmente, estaba usando una ruta que tenía un segmento "-" (espacio-guión-espacio), y el servidor remoto estaba devolviendo un error, rsync: on remote machine: -: unknown option
que es lo que inició todo este esfuerzo de escape del espacio en primer lugar.
Entonces, ¿qué debo hacer para que esto funcione correctamente con el servidor remoto, sin tener que eliminar los espacios u otros caracteres erróneos como guiones de la ruta remota?
-s
soluciona sin la necesidad de aplicar doble escape de forma manual.Respuestas:
En la máquina iniciadora,
rsync
crea una línea de comando que invoca el objetivo rsync en la máquina remota, luego envía esa línea de comando usando ssh .... como una sola cadena . Esa única cadena se pasa al shell para analizar, dividir en argumentos y ejecutarrsync
. No tengo idea de por qué se hace eso, en lugar de empaquetar los argumentos (ya divididos, expandidos y sin comillas) en un contenedor seguro binario para el rsync remoto.Eso significa que sus argumentos serán analizados por dos shells diferentes, cite y vuelva a cotizar en consecuencia. Por lo general, envuelvo cada argumento con comillas dobles y luego la expresión completa entre comillas simples. a veces no es suficiente, o puede ser complicado si desea que la misma expresión se use de forma local y remota.
En esos casos, generalmente establezco algunos enlaces suaves con nombres simples, sin espacios, todos ASCII, y los uso.
fuente
'[email protected]:"/path/to/dest/some\ dir/"'
eval
o mediante una llamada a una función tal vez?Estabas en el camino correcto cuando dijiste:
Aquí hay una manera que me parece más fácil de hacer:
y de esta manera funciona también.
¿Puedes publicar la salida exacta y los errores que estás viendo?
¿Se puede reemplazar
rsync
en ambos lados con un script de envoltura?Luego ejecute su rsync nuevamente, y debería probar que esta forma de escapar funciona, por ejemplo
Lado del cliente:
Lado del servidor:
En el ejemplo anterior, el hecho de que el 4to argumento en el servidor (
dir with spaces
) esté todo en una línea indica que la cita funciona correctamente.Si esto no ayuda, intente volver a ejecutar
rsync -v
, orsync -vv
, orsync -vvv
. Le dará información de depuración adicional.Otras dos sugerencias tontas:
-a
o-r
?fuente
El punto de respuesta:
Use -s (proteja los argumentos) y encierre su ruta entre comillas:
rsync -savz user@server:"/my path with spaces/another dir/" "/my destination/"
Funciona con espacios o guiones.
fuente
Simplemente puede encerrar su camino entre comillas.
fuente