#1 Le 10/08/2010, à 17:15
- boutor
[Résolu] BASH Effacer des fichiers via ssh
J'ai le code suivant qui ne veut rien faire!!!
#! /bin/bash
me=`whoami` # Qui suis-je?
NODES="node1 node2" # Ce qu'on veut atteindre par ssh
for target in $NODES ;
do
echo " NODE $target "
ssh -T $target << __END__ # On se loggue via ssh (et ça marche)
cd /scratch/$me
find /scratch/$me/ -name "Day*" # Ca en trouve plein et je veux les effacer
rm `find /scratch/$me/ -name "Day*"` # Ca refuse
find /scratch/$me/ -name "Day*" | while read file; do
echo $file
done # Ca écrit des blancs
logout
__END__
done
Des idées?
Merci
Dernière modification par boutor (Le 11/08/2010, à 08:08)
Hors ligne
#2 Le 10/08/2010, à 17:20
- sputnick
Re : [Résolu] BASH Effacer des fichiers via ssh
Oui des idées :
1) met en debug
bash -x script
ou bien met
#!/bin/bash -x
comme shebang
2) il faut ecrire
echo \$file
et non
echo $file
3) Ca refuse c'est pas assez explicite : colle les erreurs
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#3 Le 10/08/2010, à 18:27
- boutor
Re : [Résolu] BASH Effacer des fichiers via ssh
Pour le rm:
Ça me met que la liste est vide.
Même symptôme que sur la boucle (mais ça peut être dû au echo \$file).
J'essaie ça demain.
Merci pour les pistes.
Hors ligne
#4 Le 11/08/2010, à 06:50
- credenhill
Re : [Résolu] BASH Effacer des fichiers via ssh
hello
dans
rm `find /scratch/$me/ -name "Day*"`
le find est probablement exécuté localement, essayer
rm \`find /scratch/$me/ -name "Day*"\`
Hors ligne
#5 Le 11/08/2010, à 08:02
- boutor
Re : [Résolu] BASH Effacer des fichiers via ssh
Suite à vos commentaires, j'ai fait la modification suivante:
#! /bin/bash
me=`whoami` # Qui suis-je?
NODES="node1 node2" # Ce qu'on veut atteindre par ssh
for target in $NODES ;
do
echo " NODE $target "
ssh -T $target << __END__ # On se loggue via ssh (et ça marche)
cd /scratch/$me
find /scratch/$me/ -name "Day*" # Ca en trouve plein et je veux les effacer
find /scratch/$me/ -name "Day*" | while read file; do
echo \$file
rm \$file
done # Ca écrit des blancs
logout
__END__
done
Ca marche!!!
Hors ligne
#6 Le 11/08/2010, à 08:07
- boutor
Re : [Résolu] BASH Effacer des fichiers via ssh
Et avec la proposition de credenhill :
#! /bin/bash
me=`whoami` # Qui suis-je?
NODES="node1 node2" # Ce qu'on veut atteindre par ssh
for target in $NODES ;
do
echo " NODE $target "
ssh -T $target << __END__ # On se loggue via ssh (et ça marche)
cd /scratch/$me
find /scratch/$me/ -name "Day*" # Ca en trouve plein et je veux les effacer
rm \`find /scratch/$me/ -name "Day*"\`
logout
__END__
done
Ca marche aussi....
Merci à vous pour les corrections.
Quelle est la différence lorsqu'on ajoute les \ devant les commandes?
Hors ligne
#7 Le 11/08/2010, à 08:20
- Watael
Re : [Résolu] BASH Effacer des fichiers via ssh
t'es payé à la ligne ?
#! /bin/bash
me=$(whoami)
NODES="node1 node2"
for target in $NODES; do
echo " NODE $target "
ssh $target "find /scratch/$me/ -name \"Day*\" -exec rm -v {} +"
done
Dernière modification par Watael (Le 11/08/2010, à 08:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 11/08/2010, à 08:22
- credenhill
Re : [Résolu] BASH Effacer des fichiers via ssh
en utilisant des "" ou la syntaxe
cmd<< EOF
...
EOF
le shell local interprête les $, `, etc donc avec la commande ssh et que les $ ou ` doivent être interpretés sur la machine distante, il faut les protéger. On peut voir la différence avec, par exemple:
ssh node "`hostname`"
ssh node "$HOSTNAME"
# ou
ssh node "\`hostname\`"
ssh node "\$HOSTNAME"
Hors ligne
#9 Le 11/08/2010, à 08:46
- boutor
Re : [Résolu] BASH Effacer des fichiers via ssh
t'es payé à la ligne ?
Je fais ce que je peux!
Pour que ça marche chez moi:
#! /bin/bash
me=$(whoami)
NODES="node1 node2"
for target in $NODES; do
echo " NODE $target "
ssh $target "find /scratch/$me/ -name \"Day*\" -exec rm -v {} \; "
done
Hors ligne
#10 Le 11/08/2010, à 09:34
- Totor
Re : [Résolu] BASH Effacer des fichiers via ssh
Bonjour,
Suivant la version de find, il est également possible d'utiliser la forme :
#! /bin/bash
me=$(whoami)
NODES="node1 node2"
for target in $NODES; do
echo " NODE $target "
ssh $target "find /scratch/$me/ -name \"Day*\" -delete" # pour l'affichage du fichier supprimer, rajouter l'option -print
done
Sinon, je ne connais pas le reste de ton code mais conceptuellement, il serait préférable d'utiliser un tableau pour ta liste de node plutôt qu'une simple variable. A manipuler, c'est plus facile.
-- Lucid Lynx --
Hors ligne
#11 Le 11/08/2010, à 09:53
- boutor
Re : [Résolu] BASH Effacer des fichiers via ssh
Sinon, je ne connais pas le reste de ton code mais conceptuellement, il serait préférable d'utiliser un tableau pour ta liste de node plutôt qu'une simple variable. A manipuler, c'est plus facile.
Le code est à peu près là en entier (du moins sur le principe).
Peux-tu appronfondir au sujet des tableaux?
Hors ligne
#12 Le 11/08/2010, à 10:56
- Totor
Re : [Résolu] BASH Effacer des fichiers via ssh
Avec un tableau, ton code aurait été comme ceci :
#! /bin/bash
me=$(whoami)
NODES=( "node1" "node2" )
for target in ${NODES[@]}; do
echo " NODE $target "
ssh $target "find /scratch/$me/ -name \"Day*\" -exec rm -v {} \; "
done
En gros, tu peux accéder à n'importe quel élément du tableau sans avoir à manipuler la chaine de caractère, ça te permet d'avoir des éléments contenant des espaces ....
Ex:
NODES=( n1 n2 n3 n4 n5 )
pour accéder directement au 3ème élément : ${NODES[2]} (les indices commencent à 0)
alors qu'avec une variable, il faudrait faire une petite moulinette pour rechercher le Nième (ici 3ième) mots de ta chaine de caractère. (c'est plus galère)
NOTE: lorsque l'indice est @, tu références tous les éléments du tableau
sinon, ça me fait penser à un truc. Ton script aurait pu être ainsi :
#! /bin/bash
me=$(whoami)
set - node1 node2
for target; do
echo " NODE $target "
ssh $target "find /scratch/$me/ -name \"Day*\" -exec rm -v {} \; "
done
De cette façon, on valorise les paramètres de position (set - node1 node2) que l'on parcourt avec le "for" (lorsque la liste des éléments n'est pas indiqué dans le "for", les paramètres de position sont exploités par défaut)
Dernière modification par Totor (Le 11/08/2010, à 10:57)
-- Lucid Lynx --
Hors ligne