¿Cómo usar comodines (*) al copiar con scp?

144

¿Por qué no puedo copiar con scp cuando estoy usando *caracteres en la ruta?

scp SERVERNAME:/DIR/* .

¿Qué configuración necesita SCP para permitir *la ruta?

ACTUALIZACIÓN: el problema no está en el lado del servidor; pscp está tratando de usar SCPv1, y es por eso que el mensaje de error:

línea de comando scp y mensaje de error con respecto a un archivo llamado *

LanceBaynes
fuente
Mira esto, funcionó para mí: https://superuser.com/a/1390405/445746
AmitM

Respuestas:

126

Debe pasar un escape literal scppara evitar que la máquina remota se trate *como un globo (observe que se cita doblemente):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
fuente
41
Necesitas comillas o una barra invertida antes de la estrella, no ambas. Y scp no es el que lo está expandiendo, sino el shell.
Patrick
3
¿Lo has probado? Acabo de hacerlo, funciona exactamente como lo describí (citar y escapar causa un error). El usuario 1274964 incluso confirma el comportamiento en su respuesta. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@Patrick La pregunta es sobre el uso de un asterisco literal , es decir, evitar el engorde por completo, no sobre cómo hacerlo en el control remoto.
Chris Down
2
En realidad, la pregunta es acerca pscpdel lado del cliente para permitir el bloqueo remoto.
Patrick
1
Sí, no necesitas escapar del asterisco si estás usando comillas simples
Led
52

Encontré que el consejo de Patrick era correcto, aunque la respuesta de Chris me llevó por el buen camino. Use comillas y luego no necesita la barra invertida antes del asterisco.

scp 'SERVERNAME:/tmp/file_num\*' .

scp: /tmp/file_num*.csv: No existe tal archivo o directorio

scp 'SERVERNAME:/tmp/file_num*' .

juicios_para_trabajo_171642.csv 100% 32KB 32.0KB / s 00:00
juicios_para_trabajo_172394.csv 100% 548KB 182.6KB / s 00:03

usuario1274964
fuente
44
Correcto, porque esto significa que quieres glob en el control remoto. La pregunta es acerca de cómo dejar de englobar en el control remoto (para obtener un literal *), no sobre cómo hacerlo solo en el control remoto.
Chris Down
3
@ChrisDown. No. El usuario desea que el comodín no se expanda en el host y desea que se expanda en el control remoto, para permitir que coincida con varios archivos allí. Ninguno de los archivos devueltos tiene un literal '*' en ellos. ¿Quiso decir " dejar de molestar al anfitrión "?
Tim Bird
1

NOTA: La solución ofrecida a continuación ha sido probada y se sabe que funciona correctamente.

Las comillas simples romperán la expansión variable si has alias parte de la ruta que estás bloqueando.

Aquí hay una secuencia de comandos que usa comillas DOBLES para el caso de uso del nombre de archivo global command-configure_ .tar.gz * usando una ruta alias con una variable:

#!/bin/bash

USEREXECUTINGSCRIPT='admin'
SCRIPTSDIR="myscripts"

SCPUSER='terrencehoulahan'
SCPUSERPASSWD='Change-Me'
SCPHOST='1.2.3.4'
SCPDIRECTORYREMOTE='/Users/terrencehoulahan/Downloads/Ubuntu/18.04'

## Uncomment appropriate below command for your distro to install "sshpass"
#apt-get -y sshpass
#yum -y install sshpass

sshpass -p "$SCPUSERPASSWD" scp -o StrictHostKeyChecking=no $SCPUSER@$SCPHOST:"$SCPDIRECTORYREMOTE/command-configure_*.tar.gz" $(getent passwd|grep ^$(echo $USEREXECUTINGSCRIPT)|cut -d ':' -f6)/$SCRIPTSDIR/

Después del cierre de la comilla doble, el destino del directorio local se construye simplemente extrayendo el directorio de inicio del usuario especificado de / etc / passwd .

El comando scp mismo está precedido sshpassy -o StrictHostKeyChecking=noautomatiza completamente el scpcomando sin interacción del usuario. Parece complicado pero mejor que las rutas de codificación dura que se espera que cambien de vez en cuando.

Anyhoo, un ejemplo que usa comillas dobles donde las variables en la ruta que estás buscando deben expandirse. HTH

F1Linux
fuente