2017-10-03 12 views
4

Je dois obtenir un nonce d'un service http J'utilise curl et openssl plus tard pour calculer le sha1 de ce nonce. mais pour que je dois obtenir le nonce à une variableExtraire la sous-chaîne dans bash d'un fichier avec l'emplacement du modèle d'une position donnée à un caractère spécial

1 étape (fait)

curl --user username:password -v -i -X POST http://192.168.0.202:8080/RPC3 -o output.txt -d @initial.txt 

et maintenant, le fichier de sortie @ sortie.txt détient le http Reponse

HTTP/1.1 401 Unauthorized 
Server: WinREST HTTP Server/1.0 
Connection: Keep-Alive 
Content-Length: 89 
WWW-Authenticate: ServiceAuth realm="WinREST", nonce="/wcUEQOqUEoS64zKDHEUgg==" 

<html><head><title>Unauthorized</title></head><body>Error 401: Unauthorized</body></html> 

Je dois obtenir la position de "nonce =" et extraire tout le chemin au "char Comment puis-je obtenir dans bash, la valeur de nonce ??

Cordialement

Répondre

2

Assez simple avec grep en utilisant le -o/--only-matching et -P/--perl-regexp Options (disponible dans GNU grep):

$ grep -oP 'nonce="\K[^"]+' output.txt 
/wcUEQOqUEoS64zKDHEUgg== 

L'option -o n'imprimera que apparié partie, qui comprennent normalement nonce=" si nous avions pas a utilisé la séquence d'échappement reset match start disponible dans PCRE.

De plus, si votre output.txt (c.-à-réponse du serveur) peut contenir plus d'un nonce, et vous êtes intéressé par la lecture seule la première, vous pouvez utiliser l'option -m1 (comme Glenn suggère):

$ grep -oPm1 'nonce="\K[^"]+' output.txt 

Pour stocker ce nonce dans une variable, utilisez simplement la substitution de commandes; ou juste passer à travers openssl sha1 pour obtenir ce dont vous avez besoin digérer:

$ nonce=$(grep -oPm1 'nonce="\K[^"]+' output.txt) 
$ echo "$nonce" 
/wcUEQOqUEoS64zKDHEUgg== 

$ read hash _ <<<"$(grep -oPm1 'nonce="\K[^"]+' output.txt | openssl sha1 -r)" 
$ echo "$hash" 
2277ef32822c37b5c2b1018954f750163148edea 
+0

Pourrait également ajouter l'option '-m1' pour quitter après la première correspondance. –

+0

Bon point, merci. J'ai mis à jour la réponse. – randomir

0

Vous pouvez utiliser GNU sed pour cela comme ci-dessous:

ubuntu$ cat output.txt 
HTTP/1.1 401 Unauthorized 
Server: WinREST HTTP Server/1.0 
Connection: Keep-Alive 
Content-Length: 89 
WWW-Authenticate: ServiceAuth realm="WinREST", nonce="/wcUEQOqUEoS64zKDHEUgg==" 

<html><head><title>Unauthorized</title></head><body>Error 401: Unauthorized</body></html> 

ubuntu$ sed -E -n 's/(.*)(nonce="\/)([a-zA-Z0-9=]+)(")(.*)/\3/gp' output.txt 
wcUEQOqUEoS64zKDHEUgg== 

Cordialement!

+1

Quelques notes: i) Vous semblez manquer la barre oblique de la valeur nonce - votre jeu de caractères est trop restrictif; ii) vous n'avez pas besoin de capturer * tout *, seulement les choses dont vous avez besoin dans le remplacement: 's /.* nonce =" ([^ "] +)". */\ 1/p' –

+0

@glennjackman Nice merci pour le conseil de mon ami, je n'ai jamais pensé sérieusement à capturer seulement le groupe que je voulais extraire, et oui, j'ai égaré le slash. –