Comment utiliser des caractères génériques (*) lors de la copie avec scp?

144

Pourquoi ne puis-je pas copier avec scp lorsque j'utilise des *caractères dans le chemin?

scp SERVERNAME:/DIR/* .

De quelle configuration SCP a-t-il besoin pour autoriser *le chemin?

UPDATE: le problème n'est pas côté serveur; pscp essaie d'utiliser SCPv1, et c'est pourquoi le message d'erreur suivant:

ligne de commande scp et message d'erreur concernant un fichier appelé *

LanceBaynes
la source
Vérifiez cela, cela a fonctionné pour moi: https://superuser.com/a/1390405/445746
AmitM

Réponses:

126

Vous devez passer un échappement littéral scppour éviter que la machine distante ne soit traitée *comme un glob (notez qu'elle est doublement citée):

scp 'SERVERNAME:/DIR/\*' .
Chris Down
la source
41
Vous avez besoin de guillemets ou d'une barre oblique inverse avant l'étoile, pas des deux. Et scp n'est pas celui qui l'étend, c'est le shell qui l'est.
Patrick
3
L'as tu essayé? Je viens de le faire, fonctionne exactement comme je l’ai décrit (citer et échapper provoque un échec). User1274964 confirme même le comportement dans sa réponse. touch /tmp/abcd.1234; scp 'localhost:/tmp/abcd.\*' ./:scp: /tmp/abcd.*: No such file or directory
Patrick
2
@Patrick La question concerne l'utilisation d'un astérisque littéral , c.-à-d. Qu'il faut éviter de déplacer complètement, et non pas sur la façon de déplacer la télécommande.
Chris Down
2
En réalité, la question concerne l’obtention pscpdu côté client pour autoriser le déplacement à distance.
Patrick
1
Oui, vous n'avez pas besoin d'échapper à l'astérisque si vous utilisez les guillemets simples
Led
52

J'ai trouvé le conseil de Patrick correct, bien que la réponse de Chris m'ait mis sur la bonne voie. Utilisez des guillemets et vous n'avez pas besoin de la barre oblique inverse avant l'astérisque.

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

scp: /tmp/file_num*.csv: aucun fichier ou répertoire de ce type

scp 'SERVERNAME:/tmp/file_num*' .

jugements_pour_job_171642.csv 100% 32Ko 32.0Ko / s 00:00
jugements_pour_job_172394.csv 100% 548Ko 182.6Ko / s 00:03

utilisateur1274964
la source
4
Oui, parce que cela signifie que vous voulez utiliser la télécommande. La question est de savoir comment arrêter le déplacement sur la télécommande (pour obtenir un littéral *), et non pas sur la façon de déplacer uniquement sur la télécommande.
Chris Down
3
@ChrisDown. Non. L'utilisateur souhaite que le caractère générique ne soit pas développé sur l'hôte et qu'il soit développé sur la télécommande, afin de lui permettre de faire correspondre plusieurs fichiers à cet emplacement. Aucun des fichiers retournés ne contient un '*' littéral. Voulez-vous dire " arrêter globbing sur l' hôte "?
Tim Bird
1

REMARQUE: La solution proposée ci-dessous est testée et reconnue pour fonctionner correctement.

Les guillemets simples interrompront le développement de variables si vous avez aliasé une partie du chemin que vous parcourez.

Voici un script qui utilise des guillemets DOUBLE pour le cas d'utilisation du nom de fichier globbed command-configure_ .tar.gz * en utilisant un chemin alias avec une 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/

Après le guillemet double de fermeture, la cible du répertoire local est construite en extrayant simplement le répertoire de base de l'utilisateur spécifié à partir de / etc / passwd .

La commande scp elle-même est préfacée par sshpasset -o StrictHostKeyChecking=nopour automatiser entièrement la scpcommande sans interaction de l'utilisateur. Cela semble compliqué mais meilleur que les chemins codés en dur qui devraient changer de temps en temps.

Anyhoo, exemple d'utilisation de guillemets doubles dans lesquels les variables du chemin que vous parcourez doivent être autorisées à se développer. HTH

F1Linux
la source