texto por etc ejemplos consola comandos comando buscar basicos archivos archivo bash escaping scp

bash - por - comandos linux



¿Cómo puedo scp un archivo con dos puntos en el nombre del archivo? (1)

Estoy tratando de copiar un archivo usando scp en bash con un carácter de dos puntos (:) en el nombre del archivo fuente. La versión confusa de mi comando que estoy usando es:

scp file/:/ name.mp4 user@host:"/path/to/dest"

Me sale este error:

ssh: Could not resolve hostname Portal 2: Name or service not known

Sé que solo podría cambiar el nombre del archivo y eliminar el : pero me gustaría saber si es posible escapar de los dos puntos.


No es un problema de escape bash , es un scp trata x: como un prefijo de host [usuario @], intente:

scp ./file:/ name.mp4 user@host:"/path/to/dest"

El uso de rutas relativas ( ./ ) o completamente calificadas ( /path/to/source ) evita este comportamiento: la presencia de / antes de a : hace que OpenSSH deje de buscar un posible host: o user@host: prefijo). El scp de OpenSSH solo tiene nombres de archivos de casos especiales que comienzan con dos puntos permitiendo que funcionen sin problemas, no tiene soporte para escapar de a : en el sentido normal, y no tiene otra noción de nombres de host válidos, por lo que casi cualquier nombre de archivo con a : puede causar esto .

(Debido al análisis simplista de OpenSSH de [] direcciones IPv6 adjuntas, puede scp exitosamente archivos que contengan : que comiencen con [ , o contengan @[ antes de : y no contengan ]: pero generalmente no es útil ;-)

( El texto a continuación se escribió cuando la pregunta original era: ¿Cómo puedo escapar de un colon en bash? Se aplica a esa situación, pero no a scp ya que ninguna cantidad de shell que salga ayudará en eso).

Para responder a la pregunta sobre cómo escapar : no es necesario hacerlo, pero " /: " funciona. Lugares que a : se usa:

  1. el comando nulo : no hay necesidad de escapar, aunque puede, al igual que /e/c/h/o foo no tiene ningún efecto en el comando ("sin efecto" no es completamente cierto, si escapa de uno o más caracteres, evitará que un alias coincida)
  2. PATH (y otros, CDPATH , MAILPATH ) que escapan de los valores no tienen ningún efecto útil (no he podido ejecutar un programa en mi PATH desde un directorio que contiene un : cual es un poco inesperado)
  3. la expansión del parámetro ${name:-x} y más, el name debe ser [a-zA-Z_][a-zA-Z0-9_] , así que no hay necesidad de escapar de los nombres de las variables, y como no hay ambigüedad, no hay necesidad de escapar Posterior : en las otras variaciones de expansión de parámetros.
  4. ? : ? : trinary opera solo en variables y números, no hay necesidad de escapar
  5. == y =~ con clases en el patrón como [[:digit:]] , puedes escapar con /: pero no sé cómo podría ser útil ...
  6. dentro de los nombres de funciones o comandos, no hay necesidad de escapar, /: no tiene ningún efecto útil

(Tenga en cuenta que el comando nulo es simplemente : puede tener un comando o función llamada como " :foo " y puede invocarse sin escapar, en este sentido es diferente a # donde un comando llamado #foo tendría que escaparse. )