2010-05-04 9 views
6

Warum funktionierts:Verwendung von/dev/tcp statt wget

 
exec 3<>/dev/tcp/www.google.com/80 
echo -e "GET/HTTP/1.1\n\n">&3 
cat <&3 

Und diese fehlschlagen:

 
echo -e "GET/HTTP/1.1\n\n" > /dev/tcp/www.google.com/80 
cat </dev/tcp/www.google.com/80 

Gibt es eine Möglichkeit, es in einer Zeile zu tun, w/o wget , Curl oder eine andere Bibliothek?

+0

Achten Sie darauf, dass die Verwendung dieser '/ dev/tcp'-Methode anstelle von wget oder curl bedeutet, dass Sie nicht die gesamte Funktionalität von wget oder curl erhalten - wie die automatische Verarbeitung von 302 Weiterleitungen, Proxy-Server-Unterstützung, usw. –

Antwort

8

Das zweite Snippet schlägt fehl, weil es zwei separate TCP-Sockets öffnet. Die echo verbindet sich mit www.google.com und schreibt die HTTP-Anfrage; und dann öffnet die zweite Zeile eine andere Verbindung und versucht, von diesem Socket zu lesen. Der zweite Socket blockiert einfach, weil Google auf den Versand der HTTP-Anfrage wartet.

+0

um es auf einer Linie funktionieren zu lassen? – User1

+1

Ich versuchte für 20 Minuten, konnte es nicht tun. Heh. Sie können die drei Anweisungen mit '&&' zu eins zusammenfassen, wenn dies als eine Zeile gilt: 'exec ... && echo ... && cat ...' –

1

Nicht mein Fachgebiet, aber ich denke, dass das zweite Beispiel eine zweite Verbindung öffnen wird, während das erste Beispiel einen offenen Handle für die gleiche Verbindung hält. Also sollte jede Lösung, die das Öffnen nur einer Verbindung beinhaltet, funktionieren.