Gibt es eine Möglichkeit, Curl interaktiv zu verwenden? Oder gibt es eine interaktive Curl / Wget-Shell?

9

Stellen Sie sich so etwas vor:

$ curlsh http://www.example.org
> GET /foo/bar/bam
...output here...
> POST /thing/pool ...
... result here.... 

Gibt es ein Tool, mit dem ich das machen kann?

Cheeso
quelle

Antworten:

8

Auf vielen Linux / Unix-Systemen funktioniert Ihr Pseudocode nur in jeder Shell, obwohl Ihre Pfade eigentlich vollständige URLs sein sollten.

Auf Debian-basierten Systemen libwww-perlinstalliert das Paket beispielsweise drei Symlinks zu lwp-request, die aufgerufen /usr/bin/GETwerden /usr/bin/HEAD, und /usr/bin/POST. Diese tun, was Sie erwarten würden. In neueren Versionen des OpenSuse- perl-libwww-perlPakets werden die Symlinks weggelassen (was wahrscheinlich ein Fehler ist), sodass Sie sie selbst erstellen oder lwp-requestdirekt verwenden müssten . Im Allgemeinen und seit vielen Jahren ist es eine ziemlich sichere Annahme, dass ausführbare Dateien von GET, HEAD und POST auf unixoiden Systemen verfügbar sind.

Natürlich können Sie sie auch curlfür all diese Aufgaben verwenden. Vielleicht verstehe ich nicht, warum Sie der Meinung sind, dass eine Befehlszeilen-Shell wie bash nicht interaktiv ist.

Christian Pietsch
quelle
8

Danke für die Antworten.

Nachdem ich herumgegoogelt hatte , fand ich resty , einen Shell-Skript-Wrapper um das Curl- Tool. Das ist wirklich was ich will. Es sind 155 Zeilen Shell-Skript, und wenn ich es ausführe, erhalte ich Funktionen für GET, PUT, POST, DELETE und OPTIONS. Diese Funktionen sind nur Wrapper um das Curl-Programm, das sich auf meinem Pfad befindet.

Unter MacOSX Bash funktioniert das folgendermaßen:

$ . resty

$ resty https://api.example.org
https://api.myhost.com*

$ GET /v1/o/orgname -u myusername:password
{
  "createdAt" : 1347007133508,
  "createdBy" : "admin",
  "displayName" : "orgname",
  "environments" : [ "test", "prod" ],
  "lastModifiedAt" : 1347007133508,
  "lastModifiedBy" : "admin",
  "name" : "orgname",
  "properties" : {
    "propertyList" : [ ... ]
  },
}
$

In der ersten Zeile werden nur die Befehle in der aktuellen Shell ausgeführt.

Die nächste Zeile, der Befehl "resty", legt die URL-Basis fest. Danach verweist jeder Aufruf von GET, PUT, POST ... implizit auf diese Basis. Ich habe ein Beispiel gezeigt, das hübsches JSON ausgibt. Ich denke, wenn Ihr Server minimiertes JSON ausgibt, können Sie es mit einem externen Skript drucken, indem Sie die Ausgabe weiterleiten.

Hostbasierte Einstellungen werden unterstützt. Angenommen, Ihr Zielhost ist api.example.org. Erstellen Sie eine Datei mit dem Namen ~ / .resty / api.example.org und fügen Sie dort Zeilen ein, die Argumente angeben, die unter diesem Namen an jeden Curl-Aufruf an den Host übergeben werden sollen. Jedes http-Verb erhält eine eigene Zeile. Einfügen dieses Inhalts in die Datei:

GET -u myusername:mypassword --write-out "\nStatus = %{http_code}\n"

... bedeutet, dass jedes Mal, wenn ich ein GET mache, wenn api.example.org der Basis-Hostname ist, der Befehl curl implizit die dort gezeigten -uund --write-outargs verwendet. (-u für Basisauthentifizierung).

Als weiteres Beispiel können Sie den Accept-Header in dieser Datei angeben, sodass Sie immer XML anfordern:

GET --header "Accept: application/xml"

Jedes Curl-Befehlszeilenargument wird in dieser Voreinstellungsdatei unterstützt. Alle Curl-Argumente für das Host + Verb-Tupel müssen in der Einstellungsdatei in einer einzigen Zeile stehen.

Praktisch.

Cheeso
quelle
6

lftp:

$ lftp http://repo.xplico.org/pool/
cd ok, cwd=/pool
lftp repo.xplico.org:/pool> ls
drwxr-xr-x  --  /
drwxr-xr-x            -  2012-02-13 09:48  main
lftp repo.xplico.org:/pool> cd main
lftp repo.xplico.org:/pool/main> ls
drwxr-xr-x  --  ..
drwxr-xr-x            -  2012-02-13 09:48  x

Verzeichnislisten funktionieren nur für Websites, die Verzeichnisindizes senden. Aber auch wenn dies nicht der getFall ist, können Sie den Befehl verwenden, um einzelne Dateien abzurufen.

Stéphane Chazelas
quelle
Der getBefehl lädt die Datei herunter und catgibt die Datei auf dem Bildschirm aus. Um eine http zu erhalten post, können Sie Folgendes verwenden : quote post post.php x=1&y=z.
donothings erfolgreich
5

Sie können Netcat verwenden .

netcat ist ein einfaches Unix-Dienstprogramm, das Daten über Netzwerkverbindungen mithilfe des TCP- oder UDP-Protokolls liest und schreibt.

Hier ist ein Beispiel zum Abrufen der VLC-Homepage

nc www.videolan.org 80
GET http://www.videolan.org/vlc/ HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 16 Oct 2012 07:34:48 GMT
Server: Apache/2.2.16 (Debian)
Content-Location: index.html
[…]

Der Rest des HTML wird an die Konsole ausgegeben. Hinweis: Sie müssen danach Return zweimal eingeben HTTP/1.0.

Marco
quelle
4
Alter, du bist Hardcore. Netcat macht HTTP? Autsch! Ich hoffte auf etwas mit ein paar weiteren Schnickschnack.
Cheeso
1
Ich habe keine Ahnung, wonach Sie suchen. Zumindest macht es das, was Sie in Ihrer Frage angegeben haben, was nicht sehr detailliert war. Netcat ist ein sehr praktisches Tool, für das Surfen im Internet ist es vielleicht nicht so gut geeignet. Kommt auf deine Bedürfnisse an.
Marco
Nichts für ungut, ich sage nur, es wäre schön, wenn das Werkzeug etwas intelligenter wäre. Als ob es eine Möglichkeit gäbe, die zu sendenden HTTP-Header festzulegen. Oder wenn ich nicht für jede Anfrage "HTTP / 1.1" eingeben musste. oder etc.
Cheeso
1

Sie können interaktiv shellssowohl mit pythonals auch perl:

In Perl

$ perl -MWWW::Mechanize::Shell -eshell
(no url)> get http://cnn.com
Retrieving http://cnn.com(200)
http://edition.cnn.com/> title
CNN.com International - Breaking, World, Business, Sports, Entertainment and Video News
http://edition.cnn.com/> content
(...)

Siehe perldoc WWW::Mechanize::Shelloder http://search.cpan.org/~corion/WWW-Mechanize-Shell-0.52/lib/WWW/Mechanize/Shell.pm


In Python :

$ python -i -c 'import mechanize; br = mechanize.Browser(factory=mechanize.RobustFactory())'
>>> br.open("http://xkcd.com/")
<response_seek_wrapper at 0x2824a28 whose wrapped object = <closeable_response at 0x27c2710 whose fp = <socket._fileobject object at 0x27be3d0>>>
>>> br.title()
'xkcd: Identity'
>>> print br.response().read()
(...)

Siehe http://wwwsearch.sourceforge.net/mechanize/

Gilles Quenot
quelle
1

Ja, Sie können die Option "--config" verwenden:

Geben Sie den Dateinamen in -K, --config als '-' an, damit curl die Datei von stdin liest.

Beispiel:

$ curl -K-
url https://github.com/blog
remote-name
<Ctrl + D>
Steven Penny
quelle
0

Ich mag Luchs für das interaktive Surfen in der Kommandozeile. Es ist jedoch eher ein ausgewachsener Browser (der in eine ncurses-Anwendung passt) als ein rohes HTML-Tool.

Ich habe zuvor rohe HTML-Befehle über SSL getestet, für die ich verwendet habe openssl, aber dies erlaubt jeweils nur einen Befehl.

> openssl s_client -quiet -connect google.com:443
GET /
... HTML response

> openssl s_client -quiet -connect myprivateserver.com:443
POST /thing/pool ...
... response

Weitere Informationen zu den s_client-Optionen von openssl man s_clientfinden Sie in den Details.

Alex Leach
quelle