6 votes

Pourquoi devez-vous échapper les espaces lorsque vous transmettez des noms de fichiers SCP ?

Quiconque a déjà fait une SCP sait que ça ne marche probablement pas :

scp foo.txt 'me@remote.net:foo bar.txt'

Pour moi, sur ce coup-là, je comprends : "cible ambiguë".

La page de manuel de SCP n'explique pas pourquoi vous devez échapper cet espace, pourtant l'argument semble correspondre aux spécifications de cet argument listées dans la page de manuel :

[[user@]host1:]file1 

Ça semble correspondre, pour moi. Donc, pourquoi est-il nécessaire de le faire :

scp foo.txt 'me@remote.net:foo\ bar.txt'

11voto

Daniel Beck Points 105590

Dans le premier cas, vous spécifiez deux fichiers comme cible de copie, tous deux résidant sur remote.net . Ceci est clairement ambigu, car le programme ne peut pas déterminer où copier le fichier.

Considérons l'exemple de travail suivant, qui spécifie deux fichiers sources et une destination (répertoire) en utilisant le même format :

scp 'me@example.org:file1 file2' .

Cela copiera ambos file1 y file2 de example.org dans le répertoire local.


Votre région scp se connecte à l'hôte distant et démarre une autre instance de scp avec un paramètre déterminant si vous transférez des fichiers de il ( -f ), ou à il ( -t ). Vous pouvez le constater lorsque vous ajoutez l'argument -v pour une sortie verbeuse. Le paramètre source/destination que vous saisissez ( host:file ) est divisé et la partie noms de fichiers est simplement ajoutée comme paramètres supplémentaires spécifiant les fichiers à utiliser.

En l'utilisant comme source :

debug1: Sending command: scp -v -f -- file1 file2

Cela fonctionne sans problème, il transfère plusieurs fichiers sources sur le réseau.

En l'utilisant comme évier :

debug1: Sending command: scp -v -t -- file1 file2

Cela échoue, car vous avez l'intention d'écrire dans plusieurs fichiers. Le moyen de contourner ce problème est d'échapper le nom du fichier. à nouveau (une fois pour le Shell local, une fois pour l'appel distant) :

$ scp foo 'me@example.org:foo\ bar'
[...]
debug1: Sending command: scp -v -t -- foo\\ bar

Et pour info, scp foo 'me@example.org:"foo bar"' fonctionne tout aussi bien.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X