L'utilisation d'un nom de fichier avec des espaces avec scp et chmod dans bash

StackOverflow https://stackoverflow.com/questions/2399724

  •  25-09-2019
  •  | 
  •  

Question

Régulièrement, je tiens à mettre les fichiers dans le répertoire de mon serveur web / tmp pour partager. Ce qui est ennuyeux est que je dois définir les autorisations à chaque fois que je scp les fichiers. Suivant les conseils de une autre question j'ai écrit un script qui copie le fichier plus, définit les autorisations et imprime l'URL:

#!/bin/bash

scp "$1" SERVER:"/var/www/tmp/$1"
ssh SERVER chmod 644 "/var/www/tmp/$1"
echo "URL is: http://SERVER/tmp/$1"

Quand je remplace SERVEUR avec mon hôte réel, tout fonctionne comme prévu ... jusqu'à ce que j'exécuter le script avec un argument y compris les espaces. Bien que je soupçonne que la solution pourrait être d'utiliser $ @ pour que je l'ai pas encore pensé à la façon d'obtenir un nom de fichier espacés de façon à travailler.

Était-ce utile?

La solution

Il se trouve que ce qui est nécessaire est d'échapper à la voie qui sera envoyée au serveur distant. Bash pense que les citations dans le serveur: « / var / www / tmp / 1 $ » sont liés à la 1 $ et les retire de la sortie finale. Si je tente de lancer:

tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png

Faisant écho nous le voyons tente d'exécuter:

scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png

Si au lieu des guillemets sont échappés littéraux alors la commande scp ressemble plus que vous attendez:

scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png"

Avec l'ajout de code pour tronquer le chemin du script final devient:

#!/bin/bash

# strip path
filename=${1##*/}
fullpath="$1"

scp "$fullpath" SERVER:\"/var/www/tmp/"$filename"\"
echo SERVER:\"/var/www/tmp/"$filename"\"
ssh SERVER chmod 644 \"/var/www/tmp/"$filename"\"
echo "URL is: http://SERVER/tmp/$filename"

Autres conseils

Le script ressemble à droite. Je pense que vous devez citer le nom de fichier lorsque vous passez dans votre script:

scp-chmod.sh "filename with spaces"

Ou échapper aux espaces:

scp-chmod.sh filename\ with\ spaces

la façon plus facile sans se soucier des espaces dans les noms de fichiers (en plus de citer) est de renommer vos fichiers pour se débarrasser des espaces avant le transfert. Ou lorsque vous créez les fichiers, ne pas utiliser des espaces. Vous pouvez faire votre « meilleure pratique » chaque fois que vous nommez vos fichiers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top