L'utilisation d'un nom de fichier avec des espaces avec scp et chmod dans bash
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.
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.