SED et remplacement valeur

Impec ! :041

Tu me sors une épine du pied :023 Moi je dis bravo syam :dance:

Ta syntaxe est plus simple que la mienne :

HOME1="${HOME1#*HOME = }"
HOME1="${HOME1%% *}"
THE_HOME="$(echo “$HOME1” | sed ‘s@\n@@’)"

Bonjour,

Je te propose de tester la 2nde solution de ma réponse.
Elle t’évitera ce genre de désagrément.
Elle présente tout de même un inconvénient : ne fonctionne pas avec des chemins contenant des blancs.
En revanche, elle te permet d’accéder aisément à n’importe quelle donnée retournée par ta page web.

Bonjour Totor,

En fait mes champs de la page Web sont dynamiques… Donc je ne connais pas le N° de champ renvoyé par ma page web.

Dans ton exemple tu travailles sous forme de tableau, cela me pose un souci puisque je connais pas les éléments qui me sont retournés !

C’est pour cela que j’utilise la comparaison des valeurs et ensuite traite la valeur retournée :unamused:

ok, je comprends !

Une autre approche…
En considérant le format retournée (par la page web) suivant :
VAR1 = VAL1 VAR2 = VAR2 … VARi = VALi

On peut procéder ainsi :

eval $(printf '%s%s%s\n' $(w3m -dump http://ip/test.php))
echo $VAR1
echo $VAR2

Concrétement, si ta page retourne les informations mentionnées dans l’autre fil, on obtient les variables IP, HOSTNAME, DATE et TIME

Cependant, les noms de variables doivent pas être exotiques mais respecter le nommage ‘bash’.

Effectivement cela peut être une autre solution !

Mes variables ne sont pas “exotiques”, elles ne contiennent pas d’espace, ni de caractères spéciaux afin d’éviter quelque soucis d’encodage Web > Shell ou autre :unamused:

@Totor > Je ne comprends pas très bien ta solution. Pourquoi 3 %s dans le format ? Comment bash va délimiter les instructions ?

Le but est de constituer un “script” compréhensible par bash et plus précisément un ensemble de ligne où chacune correspond à une initialisation de variable.

Donc quelque chose comme :

[quote]
IP=192.168.1.199
HOTSNAME=PC-A
DATE=20110824
TIME=12592034[/quote]

Je décompose :
w3m -dump ip/test.php retourne IP = 192.168.1.199 HOTSNAME = PC-A DATE = 20110824 TIME = 12592034
…soit 12 données

Ce qui donne : printf ‘%s%s%s\n’ IP = 192.168.1.199 HOTSNAME = PC-A DATE = 20110824 TIME = 12592034

Dont l’évaluation ce fait ainsi :
-le 1er %s prend le paramètre IP
-le 2nd %s prend le paramètre =
-le 3eme %s prend le paramètre 192.168.1.199
Puis retour à la ligne avec le \n dans le format

Puis comme il reste des paramètres, le format est à nouveau appliqué :
-le 1er %s prend le paramètre HOTSNAME
-le 2nd %s prend le paramètre =
-le 3eme %s prend le paramètre PC-A
-retour à la ligne

et ainsi de suite…

On obtient donc une chaine de caractères contenant ce que l’on souhaitait et qui sera évaluée grace à la builtin eval

EDIT : je viens de m’apercevoir qu’il y avait une faute d’orthographe à HOSTNAME (écrit HOTSNAME) et ce depuis le tout premier post de seb
j’espère que cela ne provoque pas d’erreur dans les traitements de seb

C’est le fonctionnement de printf qui cherche à consommer tout ces paramètres que je ne connaissais pas. Assez pratique il n’y a pas à dire et ton utilisation est très astucieuse :slightly_smiling:

Faire un eval sur des données venant d’ailleurs, sans en vérifier le contenu préalablement, pose un immense problème de sécurité.
Ce que tu proposes, en fait, c’est d’exécuter sans aucun contrôle des commandes shell inconnues, avec les droits de l’utilisateur courant (et donc possibilité d’élévation de privilège via une faille du noyau ou d’un service quelconque qui tourne sur la machine).

Je sais qu’on va me répondre que la page web dont sont extraites ces données a un format connu etc, mais ce n’est pas la bonne manière d’aborder les choses. La plupart des failles de sécurité existent à cause d’une hypothèse (toujours erronée) du programmeur comme quoi les données en entrée sont correctes, et qu’il n’y a pas besoin de les vérifier. Jusqu’au jour où la source des données pose problème (que ce soit parce qu’elle a été attaquée, ou tout simplement une erreur d’inattention lors d’une modification).

Tant qu’on manipulait du bête texte (recherche / remplacement / expressions régulières) ça ne posait pas de problème particulier (bien que pour être tout à fait sûr il faudrait échapper la variable avant de la fournir à sed, pour éviter qu’elle ne contienne des références arrières et je ne sais quelles autres possibilités sed autorise dans la seconde partie d’une commande s/…/…/), au pire on se retrouvait avec une erreur de syntaxe dans sed et le fichier de config n’était pas modifié, ou alors avec des données incorrectes dans ledit fichier de config (auquel cas le programme qui utilise ce fichier vérifie de toutes façons si les données sont correctes et prend les mesures nécessaires). Bref, la portée de ce “bug” (absence d’échappement de la variable) est tellement faible que ça ne vaut probablement pas le coup de s’embêter avec.

Mais exécuter des commandes shell totalement inconnues, sans les vérifier ?.. :018

Si on a une contrainte sécurité importante le shell n’est pas la bonne solution (quoi qu’il arrive).
Si par contre on veut juste être un peu plus rigoureux, personnellement je ferais ainsi (là on perd tout bénéfice du shell c’est directement transposable en python/perl/C++) :

[code]declare -t t=( $(w3m -dump http://ip/test.php) )
declare -A variables
declare -i index=0

while ((index <= ${#t})) ; do
variables[${t[$index]}]=${t[(($index + 2))]}
(( index += 3 ))
done[/code]

Du coup tu accède aux variables par :

Si la page ne renvoie pas ce qu’il faut ça plante, mais ça n’exécuteras jamais de code arbitraire.

declare -A variables
eval $(printf "variables['%s']='%.0s%s';" $(w3m -dump http://ip/test.php))

voilà qui limite

edit :
et voilà qui éradique le problème :

web="$(w3m -dump http://ip/test.php)"
declare -A variables
eval $(printf "variables['%s']='%.0s%s';" ${web//\'})

en effet eval $(printf “toto[’%s’]=’%.0s%s’;” A = “1’;ls;a='2” B = 4) permet de lister le dossier courant et de créer la variable “a” qui n’était pas souhaitée.