it-swarm.com.de

cURL: Wie kann man seltsame Ausgaben beim Umleiten unterdrücken?

Ich versuche, nur die ausführlichen Abschnitte einer cURL-Anforderung (die an stderr gesendet werden) aus der Bash-Shell zu drucken.

Aber wenn ich stdout so umleite:

curl -v http://somehost/somepage > /dev/null

In der Mitte der Ausgabe von stderr wird eine Art Ergebnistabelle angezeigt:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

Gefolgt von diesem gegen Ende:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

Dadurch werden die Antwortheader weniger lesbar.

Ich sehe diesen Text nicht, wenn ich ihn nicht weiterleite.


Ein anderer Weg, um die Effekte zu sehen:

Tabelle erscheint nicht:

curl -v http://somehost/somepage 2>&1

Tabelle erscheint:

curl -v http://somehost/somepage 2>&1 | cat

1) Wie kommt es, dass dies nur bei bestimmten Arten von Weiterleitungen auftritt?

2) Wie kann man es am besten unterdrücken?

Vielen Dank

58
Ian Mackinnon

Versuche dies:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Dadurch wird die Fortschrittsanzeige unterdrückt, stdout an /dev/null gesendet und stderr (die -v-Ausgabe) an stdout umgeleitet.

54
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Dadurch wird der Statusdialog unterdrückt, andernfalls werden Fehler an STDERR ausgegeben.

[email protected]:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

Das obige gibt die Statustabelle bei der Umleitung aus.

[email protected]:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

Das Obige unterdrückt die Statustabelle beim Umleiten, aber Fehler gehen immer noch zu STDERR.

[email protected]:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve Host 'www.errorexample.com'

Das Obige ist ein Beispiel für einen Fehler bei STDERR.

[email protected]:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
[email protected]:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve Host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve Host 'www.errorexample.com'

Fügen Sie einfach am Ende 2> & 1 hinzu, um STDERR zu STDOUT umzuleiten (in diesem Fall zu einer Datei).

20
mhoydis

Nach man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Beispielverwendung:

curl -s 'http://www.google.com'

oder wenn Sie den HTTP-BODY in einer Variablen in Bash erfassen möchten

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

Sie können -s oder --silent austauschbar verwenden.

5
Venkatt Guhesan

In Bezug auf Frage 1 (, wie cURL die Tabelle nur anzeigt, wenn die Ausgabe umgeleitet wird), habe ich nicht bemerkt, dass ein Programm erkennen kann, dass die Ausgaben gerichtet sind, aber es scheint Auf POSIX-Systemen gibt es eine Funktion isatty , die angibt, ob ein Dateideskriptor auf ein Terminal verweist oder nicht.

4
Ian Mackinnon

1) Wie kommt es, dass dies nur bei bestimmten Arten von Weiterleitungen auftritt?

von der Curl-Manpage

Wenn Sie eine Fortschrittsanzeige für HTTP POST - oder PUT-Anforderungen benötigen, müssen Sie die Antwortausgabe mithilfe von Shell-Umleitung (>), -o [Datei] oder ähnlichem in eine Datei umleiten.

curl muss isatty verwenden, um die Umleitung zu bestimmen, und die Fortschrittsanzeige drucken, wenn sie zu einer Datei oder einer Shell-Pipe umgeleitet wird.

2) Wie kann man es am besten unterdrücken?

von der Curl-Manpage

- s, --silent

Lautloser oder leiser Modus. Keine Fortschrittsanzeige oder Fehlermeldungen anzeigen. Macht Curl stumm. Die von Ihnen angeforderten Daten werden weiterhin ausgegeben, möglicherweise sogar an das Terminal/stdout, es sei denn, Sie leiten sie um.

2
Wyrmwood

Um echte Fehlermeldungen irgendwo abzulegen, sollten Sie stderr in eine Protokolldatei schreiben. Sowas in der Art:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
1
user1065951

Da ich hinter einem Proxy stehe, benutze ich einen Befehl wie diesen.

date -s "$ (curl --proxy http: // PROXY: 8080 -s http: // google.com --head -s | grep Datum | sed 's/Datum: // g') "

0
VeggieVampire