Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/08/2010, à 18: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, à 09:08)

Hors ligne

#2 Le 10/08/2010, à 18: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, à 19: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, à 07: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, à 09: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, à 09: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, à 09: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, à 09:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 11/08/2010, à 09: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, à 09:46

boutor

Re : [Résolu] BASH Effacer des fichiers via ssh

Watael a écrit :

t'es payé à la ligne ?

Je fais ce que je peux! smile

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, à 10: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, à 10:53

boutor

Re : [Résolu] BASH Effacer des fichiers via ssh

Totor a écrit :

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, à 11: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, à 11:57)


-- Lucid Lynx --

Hors ligne