PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash und Kommandozeilenquoting



pberg
27-01-2011, 08:53
Hallo,

ich bin heute über folgendes Problem gestolpert.

Ich rufe in einem bash-Skript das Programm "curl" auf.
"curl" unterstützt ab Version 7.20 die Option

--noproxy "*"

Da ich nicht sicher bin, auf welche curl-Version ich stoße, ermittle ich mir die
Version und unterscheide dann im Aufruf. Also:

if [ $curlversion -gt "719" ]
then
NO_PROXY_OPTION="--noproxy \"*\""
else
NO_PROXY_OPTION=""
fi

und dann der eigentliche Aufruf:

curl ${NO_PROXY_OPTION} ... URL


Das Problem ist die Übergabe des "*". Wenn ich mit set -x debugge, sehe ich,
dass immer

curl --noproxy '"*"' ... URL

ausgeführt wird, also die doppelten Hochkommas sind von einfachen Hochkommas umschlossen. Damit klappt dann der CURL-Aufruf nicht.

Wer kann helfen?

Mit Gruß
Thomas

pberg
27-01-2011, 10:14
printer.sh -->

#!/bin/bash
echo $*
exit 0

call_printer.sh -->

#!/bin/bash
p="--noproxy \"*\""
set -x
./printer.sh ${p}

Ausgabe:

+ ./printer.sh --noproxy '"*"'
--noproxy "*"

Wie man sieht, wird printer.sh mit '"*"' aufgerufen. Ich möchte aber den Aufruf "*".
Sonst klappt es mit dem curl-Aufruf nämlich nicht.

Mit Gruß
Thomas

John W
27-01-2011, 15:33
Schmeiß den Noproxy-Parameter weg und setz lieber die Umgebungsvariable NO_PROXY. ;)
Format ist dasselbe, Aufruf wäre dann z.B.


NO_PROXY='*' curl ... URL

pberg
27-01-2011, 15:49
Schmeiß den Noproxy-Parameter weg und setz lieber die Umgebungsvariable NO_PROXY. ;)
Format ist dasselbe, Aufruf wäre dann z.B.


NO_PROXY='*' curl ... URL


Gute Idee das Problem zu umschiffen, klappt aber leider nicht. Ich habe in meiner Umgebung jetzt nur noch eine Variable mit 'proxy'-->

$ env | grep -i proxy
NO_PROXY=*

curl ... URL
ergibt HTTP-Return-Code=000
und $? ist 56

in der gleichen Umgebung mit

curl --noproxy "*" ... URL

ergibt HTTP-Return-Code=200 (=SUCCESS)
und $? ist 0

Meine curl version ist curl 7.20.1.

Gruß
Thomas

John W
27-01-2011, 15:51
Wenn du NO_PROXY in eine eigene Zeile schreiben willst, musst du noch export davor setzen, also entweder


export NO_PROXY='*'
curl ... URL

oder


NO_PROXY='*' curl ... URL

pberg
28-01-2011, 06:43
Wenn du NO_PROXY in eine eigene Zeile schreiben willst, musst du noch export davor setzen, also entweder


export NO_PROXY='*'
curl ... URL

oder


NO_PROXY='*' curl ... URL


Hilft aber nicht.
$ NO_PROXY='*' curl --insecure -u cobra-we-system:Naja-we1 -w "%{http_code}" <URL>

Output: return code von curl =56
stdout: 000

komplette Ausgabe:

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (56) Received HTTP code 404 from proxy after CONNECT
000

Langsam denke ich, dass das ein Bug von curl ist.

Trotzdem verhält sich curl ja korrekt, wenn man die Option --noproxy mitgibt.
Und deine Idee ist ja "nur" ein Workaround.

Gruß
Thomas

John W
28-01-2011, 13:18
Langsam denke ich, dass das ein Bug von curl ist. Nö, funzt bei mir problemlos. Hab das auch ausprobiert:


curl google.de # Funzt (kein Proxy eingetragen)
export ALL_PROXY=http://gibts.nich.t
curl google.de # Funzt nicht (nicht-existenten Proxy eingetragen)
NO_PROXY='*' curl google.de # Funzt, da NO_PROXY greift
export NO_PROXY='*'
curl google.de # Funzt, da NO_PROXY auch hier greift
Hier noch Infos von meinem curl unter Ubuntu 10.10:


$ curl --version
curl 7.21.0 (x86_64-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
Protocols: dict file ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz

Der Fehler liegt also irgendwo bei dir.