2016-01-26 14 views
23

Quindi ho uno script bash molto semplice che si arriccia su un server di autenticazione per un'intestazione. L'url di intestazione viene scritto in una var e quindi utilizzato nella successiva chiamata di arricciatura. Quando si utilizza il var set nella prima chiamata a ricciolo ricevo "arricciatura: (3) Caratteri non validi trovati nell'URL". Sono in grado di echo la var e tutto sembra a posto, sono anche in grado di resettare la var (nel mio esempio qui sotto) e funziona.Uso di arricciatura in uno script bash e arricciatura: (3) Caratteri non validi trovati nell'URL

Lo script Bash

URL=$(curl -i -X GET -H "X-Auth-User: MyUserna,e" -H "X-Auth-Key: MyAPIKey" "https://urlToAuthServer.tld/auth/v1.0/" | grep "X-Storage-Url:" | awk '{print $2}') 

curl -X GET -H "X-Auth-Token: MyAuthTok" "${URL}/folder/myfile.txt" -o ./myfile.txt 

Quando si esegue l'esempio di cui sopra ottengo:

curl: (3) Illegal characters found in URL 

Il var URL si presenta così (non caratteri illegali)

https://somesecureurl.com/auth/AUTH_67383834-45245453-g34g34t5-34534 

Quando faccio questo nel terminale funziona:

$ URL = $ (arricciare -i -X ​​GET -H "X-Auth-User: MyUserna, e" -H "X-Auth- Chiave: MyAPIKey "" https://urlToAuthServer.tld/auth/v1.0/ "| grep "X-Storage-Url:" | awk '{print $ 2}')

$ echo $ URL

https://somesecureurl.com/auth/AUTH_67383834-45245453-g34g34t5-34534

Ora copiare e incollare la stringa e reasign è a URL in questo modo (ancora una volta tutto in terminale):

Funziona.

Quindi, perché nel primo esempio viene visualizzato l'errore "arricciatura: (3) caratteri non consentiti trovati nell'URL"?

Aggiornamento mi sono imbattuto in questo modo: printf %s "$URL" | xxd

Ecco l'output (indirizzata cambiato fino si ottiene l'idea)

0000000: 6874 7470 733a 2f2f 6461 6c30 352e 6f62 https://server.ob 
0000010: 6a65 6374 7374 6f72 6167 652e 736f 6674 jectstorage.lite 
0000020: 6c61 7965 722e 6e65 742f 7631 2f41 5554 sabers.com/v1/AUT 
0000030: 485f 6665 3235 3339 3434 2d38 6433 322d H_aE2563981-7d32- 
0000040: 3432 3138 2d61 6566 632d 6665 6638 3465 4201-bdoi-fef94a 
0000050: 6166 3331 6232 0d      ag11c8. 
+0

Qualsiasi spazio bianco, newline, caratteri nascosti nell'URL? Prova con 'printf% s" $ URL "| xxd'. – choroba

+0

@choroba, sto ricevendo un "." alla fine in questo modo: 0000050: 6166 3331 6232 0d af31b2. è l'ultima riga nell'output. – gregwinn

risposta

51

Il $ URL contiene una \r (CR) alla fine (0d). Rimuoverlo con

URL=${URL%$'\r'} 

prima di utilizzarlo con curl.

+2

Grazie mille! Che funzioni! – gregwinn

+0

Comprendo che l'espansione dei parametri con% espande '$ '\ r'' in un modello e quindi elimina tale modello dall'URL. Ma perché è necessario il $ prima del '\ r'? – Noumenon

+2

@Noumenon: Perché ''\ r'' è di due caratteri, backslash e' r', mentre '$' \ r'' è un carattere, il CR. '$ '...'' sono virgolette diverse da ''...''. – choroba

Problemi correlati