Aller au contenu

Erreur De Grep Dans Le Script Et Ok Sans...

Featured Replies

Posté(e)

Bonjour,

Je souhaite modifier un script pour intégrer une authentification et je bloque sur une étape.

Je récupère le contenu de ma première commande dans un fichier, jusque là tout va bien et j'obtiens ceci :

Homeserver> cat mktemp
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Thu, 07 Feb 2013 10:22:58 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: FBXSID="CIL7fGQ1QljVwfgNOgcRZB3NeBWPpCk6y0VgoTYB2hlJOOokcZZaadwiw7dipwoC"; Max-Age=86400; HTTPOnly
X-FBX-CSRF-Token: a8IrV3aybHghQ2nuzcro/Jz5nHVCJh/ElsL6Sm/Gdivp69g6EH8AfhCVq5vlXNZI
Location: /settings.php

A partir de ce fichier, je souhaite récupérer le FBXID et le CSRF Toke, par une commande grep ce qui fonctionne quand je les lances en shell :

Homeserver> grep "X-FBX-CSRF-Token" "/volume1/opt/mktemp" | cut -f 2 -d ' '
a8IrV3aybHghQ2nuzcro/Jz5nHVCJh/ElsL6Sm/Gdivp69g6EH8AfhCVq5vlXNZI

Homeserver> grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//"
"CIL7fGQ1QljVwfgNOgcRZB3NeBWPpCk6y0VgoTYB2hlJOOokcZZaadwiw7dipwoC"

Par contre, si j'intègre ces commande dans mon script, ça ne passe pas ...

Homeserver> sh test.sh
test.sh: line 5: =grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d : not found
test.sh: line 6: =grep: not found
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 07 Feb 2013 10:22:58 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Reason: please log-in

Voici le script en question :

#!/bin/sh

$fbxSid=grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//"
$csrfToken=grep "X-FBX-CSRF-Token" "/volume1/opt/mktemp" | cut -f 2 -d ' '


curl -s -D - -o /dev/null http://mafreebox.freebox.fr/login.php -d 'login=freebox&passwd=mon_mot_de_passe > /volume1/opt/mktemp

curl -s -b FBXSID=$fbxSid -D - -o /dev/null -e "http://mafreebox.freebox.fr/settings.php?page=wifi_conf" http://mafreebox.freebox.fr/wifi.cgi --data-urlencode "csrf_token=$csrfToken" -d "channel=11&ht_mode=disabled&method=wifi.ap_params_set&config=Valider" -H "X-Requested-With: XMLHttpRequest" -H "Accept: application/json, text/javascript, */*" 

J'ai testé avec /bin/grep mais problème identique.

Please help :D

Posté(e)

As-tu essayé avec le chemin absolu /bin/grep ?

Et il faut peut-être aussi encadrer tes commandes avec "`" :

$fbxSid=`grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//"`
$csrfToken=`grep "X-FBX-CSRF-Token" "/volume1/opt/mktemp" | cut -f 2 -d ' '`

Modifié par PiwiLAbruti

Posté(e)
  • Auteur

Oui j'ai testé avec le chemin absolu PB identique.

Par contre j'ai testé avec de simples quotes ' pas des guillemets "

je vais essayer ça merci.

Posté(e)

N'aurais-tu pas édité ton script avec un éditeur Windows qui ne gère pas les fins de lignes unix ?

Posté(e)

Complément à ce que dit CoolRaoul : Tu verras çà en regardant ton fichier avec "vi"

Comme l'a dit Piwi, il manque un ` devant le grep et à la fin des commandes (c'est un AltGr+7)

Posté(e)

Et puis il n'y a pas que le grep mais aussi le "sed" où il faudrait mettre un chemin absolu au cas où (et toutes les autres commandes !!)

Tout dépends comment tu lance ta commande et quelle est à ce moment là la valeur de PATH

Patrick

Posté(e)

Complément à ce que dit CoolRaoul : Tu verras çà en regardant ton fichier avec "vi"

Comme l'a dit Piwi, il manque un ` devant le grep et à la fin des commandes (c'est un AltGr+7)

Et aussi, comme le shell du syno supporte la syntaxe posix (plus lisible a mon avis), au lieu d'écrire:

`commande`
on peut mettre:
$(commande)
Posté(e)
  • Auteur

Merci pour le ALTGR+7 effectivement j'avance, il m'affiche les bonnes valeurs mais il ne les utilise pas dans la commande d'après.

Pour l'édition, je suis sur notepad++ sous Windows et vi ou nano sur le syno.

Voici ce que j'obtiens maintenant :

Homeserver> sh test.sh
test.sh: line 5: syntax error: unexpected word (expecting ")")
Homeserver> nano test.sh
Homeserver> sh test.sh
test.sh: line 5: ="0telHGZMPRcjDcwkAK5L+m34ZY02lnE/Kl6Y07HGxJ/jFQJEPOh8+Dz1VTXJmJb": not found
: not foundne 6: =DEWSkAUs4Zfq2+9Xi1TWXUVLEYDGH7KOIGXYDpljseX+ypwj9SfolNjTSgVRGV/L
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 07 Feb 2013 13:40:02 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Reason: please log-in

Homeserver> cat mktemp
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Thu, 07 Feb 2013 13:40:02 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: FBXSID="0telHGZMPRcjDcwkAK5L+m34ZY02lnE/Klr6Y07HGxJ/jFQJEPOh8+Dz1VTXJmJb"; Max-Age=86400; HTTPOnly
X-FBX-CSRF-Token: DEWSkAUs4Zfq2+9Xi1TWXUVLEYDGH7KOIGXYDpljseX+ypwj9SfolNjTSgVRGV/L
Location: /settings.php

et sinon pour le $(commande)

j'ai testé ça mais sans succès :

$fbxSid(grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//")
Posté(e)

et sinon pour le $(commande)

j'ai testé ça mais sans succès :

$fbxSid(grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//")

la bonne syntaxe est:

fbxSid=$(grep "FBXSID" "/volume1/opt/mktemp" | cut -f 2 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//")

et tu peux remplacer (mais la je chipote!):

sed <cmd> | sed <cmd2> | sed <cmd3>

par

sed -e <cmd> -e <cmd2> -e <cmd3>

Mais tout ça ne résoud pas ton problème, patience on va trouver

***EDIT***

Faudrait nous remettre la dernière version du script aussi

Posté(e)

remplace les 2 premieres lignes de ton script par

fbxsid=$(sed -n -e '/^X-FBX-CSRF-Token/s/^.*: //p' /volume1/opt/mktemp)
csrfToken=$(sed -n -e '/Set-Cookie: FBXSID/s/^.*"(.*)".*$/1/p' /volume1/opt/mktemp) 

Je pense que ça va le faire

Modifié par CoolRaoul

Posté(e)
  • Auteur

Merci beaucoup CoolRaoul effectivement les valeurs sorties par le script sont les bonnes :

Homeserver> sh test.sh
HTTP/1.1 403 Forbidden
Server: nginx
Date: Thu, 07 Feb 2013 14:26:56 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Reason: please log-in

Iu9rw/Z5hYECLWDYz0xVtVgNgKxFhAodZZz8g6luAUmqJsNvhlfe/WkK0sOQBC0+
RnomueQwChD3yZGfqUuhtfDE42cLbuwP4XKZfNkkXJvw+lt5VjrZ1XhWCsSntYFR
Homeserver> cat mktemp
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Thu, 07 Feb 2013 14:26:56 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: FBXSID="RnomueQwChD3yZGfqUuhtfDE42cLbuwP4XKZfNkkXJvw+lt5VjrZ1XhWCsSntYFR"; Max-Age=86400; HTTPOnly
X-FBX-CSRF-Token: Iu9rw/Z5hYECLWDYz0xVtVgNgKxFhAodZZz8g6luAUmqJsNvhlfe/WkK0sOQBC0+
Location: /settings.php

Homeserver>

Bon par contre il ne se connecte pas correctement alors que les variables sont bonnes mais ça s'est autre chose...

pour le script, il doit permettre la désactivation du wifi la nuit sur la Freebox v6 (et il y a sont homologue pour le réactiver), mon précédent script fonctionnait bien mais Free en corrigeant une faille CSRF à intégré cette nouvelle authentification.

Voici donc pour ceux que ça peut intéresser la globalité du script :

#!/bin/sh

curl -s -D - -o /dev/null http://mafreebox.freebox.fr/login.php -d 'login=freebox&passwd=Votre_mot_de_passe' > /volume1/opt/mktemp

fbxSid=$(sed -n -e '/^X-FBX-CSRF-Token/s/^.*: //p' /volume1/opt/mktemp)
csrfToken=$(sed -n -e '/Set-Cookie: FBXSID/s/^.*"(.*)".*$/1/p' /volume1/opt/mktemp)

curl -s -b FBXSID=$fbxSid -D - -o /dev/null -e "http://mafreebox.freebox.fr/settings.php?page=wifi_conf" http://mafreebox.freebox.fr/wifi.cgi --data-urlencode "csrf_token=$csrfToken" -d "channel=11&ht_mode=disabled&method=wifi.ap_params_set&config=Valider" -H "X-Requested-With: XMLHttpRequest" -H "Accept: application/json, text/javascript, */*" 

En tout cas en utilisant la dernière ligne et en remplaçant les variables à la main cela fonctionne.

Edit : pour commencer, il y a une inversion des variables par rapport au grep mais même en les mettant dans le bon ordre ca ne passe pas.

Modifié par joebarteam77

Posté(e)

Pour les variables qui fonctionnent pas, met des ` avant et après la variable à appeler (car sinon elles sont pas "traduites" par la valeur de la variable)

Posté(e)
  • Auteur

j'essaie ça merci

EDIT :

Comme ça :

`FBXSID=$fbxSid`

ou

comme ça :

FBXSID=`$fbxSid`

:unsure:

Modifié par joebarteam77

Posté(e)

Pour le même besoin, voici ma version du script :

#!/bin/sh

resultCurl=$( mktemp )

curl -S -d "login=freebox&passwd=XXXXXX" http://mafreebox.freebox.fr/login.php -v > $resultCurl 2>&1
if grep -q "Set-Cookie:" $resultCurl; then
    echo "Login to Freebox succeeded!"
else
    echo "Login to Freebox failed!"
    rm $resultCurl > /dev/null 2>&1
    exit 1
fi

csrfToken=`grep "X-FBX-CSRF-Token" $resultCurl | cut -f 3 -d ' ' | sed "s/r//"  `
fbxSid=`grep "FBXSID" $resultCurl | cut -f 3 -d ' ' | sed "s/FBXSID=//" | sed "s/;//" | sed "s/r//" `

curl -s -b FBXSID=$fbxSid -D - -o /dev/null -e http://mafreebox.freebox.fr/settings.php?page=wifi_conf http://mafreebox.freebox.fr/wifi.cgi --data-urlencode csrf_token=$csrfToken -d "channel=11&ht_mode=disabled&method=wifi.ap_params_set&config=Valider" -H "X-Requested-With: XMLHttpRequest" -H "Accept: application/json, text/javascript, */*" > $resultCurl 2>&1
if grep -q "HTTP/1.1 200 OK" $resultCurl; then
    echo "Setting Freebox wifi OFF succeeded!"
else
    echo "Setting Freebox wifi OFF failed!"
fi

rm $resultCurl > /dev/null 2>&1
echo "Logout to Freebox succeeded!"

exit 0

En lançant avec dash, on voit que les valeurs sont passées correctement. Mais je confirme, ça marche à la main mais pas via le script.

Si j'ajoute des ` les valeurs sont vides. Bref, on sait que ça vient des valeurs de fbxSid et csrfToken mais on est bloqués :/

Merci pour votre aide.

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

Qui est en ligne (Afficher la liste complète)

  • Il n’y a aucun utilisateur enregistré actuellement en ligne

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.