web-dev-qa-db-fra.com

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

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

scp SERVERNAME:/DIR/* .

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

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

scp commandline and error message regarding a file called *

153
LanceBaynes

Vous devez passer un échappement littéral à scp pour éviter que la machine distante ne traite * en tant que glob (notez qu'il est doublement cité):

scp 'SERVERNAME:/DIR/\*' .
133
Chris Down

J'ai trouvé que les conseils de Patrick étaient corrects, 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*' .

jugments_for_job_171642.csv 100% 32 Ko 32,0 Ko/s 00:00
jugements_for_job_172394.csv 100% 548 Ko 182,6 Ko/s 00:03

62
user1274964

REMARQUE: Solution proposée ci-dessous testée et connue pour fonctionner correctement.

Simple les guillemets interrompent l'expansion des variables si vous avez aliasé une partie du chemin que vous globalisez.

Voici un script qui utilise DOUBLE guillemets pour le cas d'utilisation du nom de fichier globalisé 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 personnel de l'utilisateur spécifié de /etc/passwd .

La commande scp elle-même est précédée de sshpass et -o StrictHostKeyChecking=no pour automatiser complètement la commande scp sans interaction de l'utilisateur. Semble compliqué mais meilleur que les chemins codés en dur qui devraient changer de temps en temps.

Anyhoo, un exemple utilisant des guillemets doubles où les variables du chemin que vous globalisez doivent être autorisées à développer. HTH

1
F1Linux

Pour moi, cela fonctionne différemment en bash et en c-Shell. Ne me demandez pas pourquoi j'utilise c-Shell. En bash, je n'ai pas besoin '' - en c-Shell je le fais. Il semble donc qu'ils traitent les globes différemment dans différentes versions de Linux.

0
Sammy777