OVH Cloud OVH Cloud

option -i de sed [ETAIT: vsftpd, ip dynamique, routeur et mode passif]

5 réponses
Avatar
erion
Bonjour,

merci, le script de TiChou marche bien sauf que l'option -i de sed est
inconnue sur ma woody. J'ai modifié le script à l'aide d'une proposition
arrivée sur la liste debian-user-french de ascii :
cat $CONF | sed -e"s/pasv_address=.*/pasv_address=$IP/" > $CONF

Et ça marche.
D'autre part, j'ai pas paramétré mon mail mais tt de même l'option "-n"
n'est pas reconnue :
# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IP\nRésultat : $RESULT" \
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

Sinon, tout le reste fonctionne bien :-)
Merci encore.

5 réponses

Avatar
TiChou
Dans le message <news:40bc6d9d$0$17508$,
*erion* tapota sur f.c.o.l.configuration :

Bonjour,


Bonjour,

merci, le script de TiChou marche bien sauf que l'option -i de sed est
inconnue sur ma woody.


Il faut utiliser une version suffisement récente de sed pour disposer de
cette option ou bien utiliser perl.

J'ai modifié le script à l'aide d'une proposition arrivée sur la liste
debian-user-french de ascii :
cat $CONF | sed -e"s/pasv_address=.*/pasv_address=$IP/" > $CONF


Je ne sais pas qui vous a conseillé ça, mais il devrait arreter de scripter
et surtout de conseiller de telles choses pour ne pas dire des « horreurs ».
:-)
Sans parler du UUOC...

Et ça marche.


Coup de bol ! Car ce que vous risquez c'est de perdre tout le contenu de
votre fichier $CONF !

Le pipe '|' a pour effet de lancer les deux commandes 'cat' et 'sed' en même
temps et il redirige la sortie standard (stdout) de la commande 'cat' sur
l'entrée standard (stdin) de la commande 'sed'.
La commande 'cat' ouvre le fichier $CONF, lit son contenu au fur et à mesure
et le renvoie sur sa sortie standard. Seulement au même moment, la commande
'sed' qui renvoie ce qu'elle reçoit sur son entrée standard vers sa sortie
standard, voit sa sortie standard être redirigée par l'intermédiaire du '>'
vers le fichier $CONF dont le contenu d'origine est immédiatement écrasé au
lancement de la commande.
Donc, si le système met un certain temps à lire le fichier $CONF et à le
bufferiser par rapport au temps qu'il met pour écraser le fichier $CONF, on
va alors se retrouver avec un fichier vide ou partiellement vide qui sera
renvoyé par la commande 'cat' et donc au final se retrouver avec un fichier
$CONF vide ou corrompu.
Pour vous en convaincre, je vous invite à faire des essais sur différents
fichiers, des fichiers de différentes tailles, plus ou moins gros, sur des
supports plus ou moins rapide.

Il faut donc toujours passer par un fichier intermédiaire pour éviter de se
retrouver avec un fichier dont son contenu serait vidé :

sed -e "s/pasv_address=.*/pasv_address=$IP/" < $CONF > $CONF.tmp
mv $CONF.tmp $CONF

D'autre part, j'ai pas paramétré mon mail mais tt de même l'option "-n"
n'est pas reconnue :
# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"
|> /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL


C'est-à-dire ? Que voulez vous dire par non reconnue ?
[ -n STRING ] est une commande de test dont la syntaxe est interprétée par
tous les shells récents sans aucun soucis.
Quel est le message d'erreur renvoyé ?

Merci encore.


De rien.

--
TiChou

Avatar
Bernard Déléchamp

[snip la pédagogie]

Il faut donc toujours passer par un fichier intermédiaire pour éviter de se
retrouver avec un fichier dont son contenu serait vidé :

sed -e "s/pasv_address=.*/pasv_address=$IP/" < $CONF > $CONF.tmp


On doit pouvoir se passer de «<», mais y gagne-t'on en temps CPU ?

mv $CONF.tmp $CONF


Si la préservation des droits et/ou du proprio de $CONF est nécessaire,
on peut aussi préférer «cat $CONF.tmp $CONF» suivi du «rm» kivabien si
le «cat» s'est bien passé, mais le temps d'exécution sera un poil plus
long ;-)

Cordialement.

--
Les imbéciles pensent que tous les noirs se ressemblent.
Je connais un noir qui trouve, lui, que tous les imbéciles se
ressemblent.
Philippe Geluck

Avatar
Bernard Déléchamp

on peut aussi préférer «cat $CONF.tmp $CONF» suivi du «rm» kivabien si


Vous aurez évidemment rectifié : «cat $CONF.tmp > $CONF»

--
L'amour n'est peut-être que la reconnaissance du plaisir.
Honoré de Balzac

Avatar
erion



Il faut utiliser une version suffisement récente de sed pour disposer de
cette option ou bien utiliser perl.


Bonjour,


Ok, j'avais fini par comprendre.

J'ai modifié le script à l'aide d'une proposition arrivée sur la liste
debian-user-french de ascii :
cat $CONF | sed -e"s/pasv_address=.*/pasv_address=$IP/" > $CONF



Je ne sais pas qui vous a conseillé ça, mais il devrait arreter de scripter
et surtout de conseiller de telles choses pour ne pas dire des « horreurs ».
:-)
Sans parler du UUOC...




Euh, c'est quoi ça, le UUOC ?

Et ça marche.



Coup de bol ! Car ce que vous risquez c'est de perdre tout le contenu de
votre fichier $CONF !

Le pipe '|' a pour effet de lancer les deux commandes 'cat' et 'sed' en même
temps et il redirige la sortie standard (stdout) de la commande 'cat' sur
l'entrée standard (stdin) de la commande 'sed'.
La commande 'cat' ouvre le fichier $CONF, lit son contenu au fur et à mesure
et le renvoie sur sa sortie standard. Seulement au même moment, la commande
'sed' qui renvoie ce qu'elle reçoit sur son entrée standard vers sa sortie
standard, voit sa sortie standard être redirigée par l'intermédiaire du '>'
vers le fichier $CONF dont le contenu d'origine est immédiatement écrasé au
lancement de la commande.
Donc, si le système met un certain temps à lire le fichier $CONF et à le
bufferiser par rapport au temps qu'il met pour écraser le fichier $CONF, on
va alors se retrouver avec un fichier vide ou partiellement vide qui sera
renvoyé par la commande 'cat' et donc au final se retrouver avec un fichier
$CONF vide ou corrompu.
Pour vous en convaincre, je vous invite à faire des essais sur différents
fichiers, des fichiers de différentes tailles, plus ou moins gros, sur des
supports plus ou moins rapide.

Il faut donc toujours passer par un fichier intermédiaire pour éviter de se
retrouver avec un fichier dont son contenu serait vidé :

sed -e "s/pasv_address=.*/pasv_address=$IP/" < $CONF > $CONF.tmp
mv $CONF.tmp $CONF



Houlà, ça c'est coton pour moi ! Mais j'ai compris la démarche. Je vais
modifier ça de ce pas : pas envie de tout perdre mm si j'ai des sauvegardes.
Sinon, celui qui m'a conseillé ça, c'est "ascii" sur debian-user-french.
Désolé pour la délation, mais je l'ai déjà vendu dans un précédent
message :-(


D'autre part, j'ai pas paramétré mon mail mais tt de même l'option "-n"
n'est pas reconnue :
# Envoit mail



[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"


|> /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

C'est-à-dire ? Que voulez vous dire par non reconnue ?
[ -n STRING ] est une commande de test dont la syntaxe est interprétée par
tous les shells récents sans aucun soucis.
Quel est le message d'erreur renvoyé ?




Je fais passer dès que possible le message d'erreur.

A bientôt.


Avatar
erion



merci, le script de TiChou marche bien sauf que l'option -i de sed est
inconnue sur ma woody.



Il faut utiliser une version suffisement récente de sed pour disposer de
cette option ou bien utiliser perl.


J'ai modifié le script à l'aide d'une proposition arrivée sur la liste
debian-user-french de ascii :
cat $CONF | sed -e"s/pasv_address=.*/pasv_address=$IP/" > $CONF



Je ne sais pas qui vous a conseillé ça, mais il devrait arreter de scripter
et surtout de conseiller de telles choses pour ne pas dire des « horreurs ».
:-)
Sans parler du UUOC...


Et ça marche.




Salut,
Euh, non, en fait hier, ça m'a bouffé la fin du fichier de conf :-(
(heureusement, que la fin ! ). Prédiction néanmoins complètement exacte.

Coup de bol ! Car ce que vous risquez c'est de perdre tout le contenu de
votre fichier $CONF !

Le pipe '|' a pour effet de lancer les deux commandes 'cat' et 'sed' en même
temps et il redirige la sortie standard (stdout) de la commande 'cat' sur
l'entrée standard (stdin) de la commande 'sed'.
La commande 'cat' ouvre le fichier $CONF, lit son contenu au fur et à mesure
et le renvoie sur sa sortie standard. Seulement au même moment, la commande
'sed' qui renvoie ce qu'elle reçoit sur son entrée standard vers sa sortie
standard, voit sa sortie standard être redirigée par l'intermédiaire du '>'
vers le fichier $CONF dont le contenu d'origine est immédiatement écrasé au
lancement de la commande.
Donc, si le système met un certain temps à lire le fichier $CONF et à le
bufferiser par rapport au temps qu'il met pour écraser le fichier $CONF, on
va alors se retrouver avec un fichier vide ou partiellement vide qui sera
renvoyé par la commande 'cat' et donc au final se retrouver avec un fichier
$CONF vide ou corrompu.
Pour vous en convaincre, je vous invite à faire des essais sur différents
fichiers, des fichiers de différentes tailles, plus ou moins gros, sur des
supports plus ou moins rapide.

Il faut donc toujours passer par un fichier intermédiaire pour éviter de se
retrouver avec un fichier dont son contenu serait vidé :

sed -e "s/pasv_address=.*/pasv_address=$IP/" < $CONF > $CONF.tmp
mv $CONF.tmp $CONF




Là, déjà, c beaucoup mieux.

D'autre part, j'ai pas paramétré mon mail mais tt de même l'option "-n"
n'est pas reconnue :
# Envoit mail



[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"


|> /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

C'est-à-dire ? Que voulez vous dire par non reconnue ?
[ -n STRING ] est une commande de test dont la syntaxe est interprétée par
tous les shells récents sans aucun soucis.
Quel est le message d'erreur renvoyé ?



En fait, je me suis aperçu qu'il manquait une partie d'une ligne du
script dans la 2ème partie "Le même mais en utilisant ez-update :"
Voilà ce qu'il y a à cette adresse :
http://groups.google.com/groups?q=group:fr.comp.os.linux.configuration+insubject:vsftpd&hl=fr&lr=lang_fr&ie=UTF-8&as_qdr=w&selm=gniii.20040528145503%40florizarre.tichou.org&rnum=1

# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IP"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL


Mais j'avais pas vu qu'un peu plus haut il y avait :
# Envoit mail

[ -n "$EMAIL" ] && echo -e "Adresse IP : $IPnRésultat : $RESULT"
| /usr/bin/mail -s "Mise a jour DynDNS" $EMAIL

Bref, petit pb. Mais maintenant, ça va, sauf qu'il faut que je trouve où
indiquer l'adresse smtp. Je ne l'ai pas encore découvert et forcément,
les mails n'arrivent pas...
Merci, à bientôt et bonne journée à tous.


Merci encore.



De rien.