Existe-t-il un moyen d'utiliser curl de manière interactive? Ou existe-t-il un shell curl / wget interactif?


9

Imaginez quelque chose comme ça:

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

existe-t-il un outil qui me permet de faire cela?

Réponses:


8

Sur de nombreux systèmes Linux / Unix, votre pseudocode ne fonctionnera que dans n'importe quel shell, bien que vos chemins d'accès devraient vraiment être des URL complètes.

Par exemple, sur les systèmes basés sur Debian, le paquet libwww-perlinstalle trois liens symboliques vers mf-demande qui sont appelés /usr/bin/GET, /usr/bin/HEADet /usr/bin/POST. Ceux-ci font ce que vous attendez. Les versions récentes du perl-libwww-perlpackage d'OpenSuse omettent les liens symboliques (ce qui est probablement un bogue), vous devrez donc les créer vous-même ou les utiliser lwp-requestdirectement. En règle générale et pendant de nombreuses années, il est assez sûr que les exécutables GET, HEAD et POST sont disponibles sur les systèmes unixoïdes.

Bien sûr, vous pouvez également utiliser curlpour toutes ces tâches, donc je ne comprends peut-être pas pourquoi vous pensez qu'un shell de ligne de commande tel que bash n'est pas interactif.


8

Merci pour les réponses.

Après avoir parcouru Google, j'ai trouvé resty , qui est un wrapper de script shell autour de l' outil curl . C'est vraiment ce que je veux. C'est 155 lignes de script shell, et quand je l'exécute, j'obtiens des fonctions pour GET, PUT, POST, DELETE et OPTIONS. Ces fonctions ne sont que des wrappers autour du programme curl trouvé sur mon chemin.

Cela fonctionne comme ceci sur MacOSX bash:

$ . 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" : [ ... ]
  },
}
$

La première ligne exécute simplement les commandes dans le shell actuel.

La ligne suivante, la commande "resty", définit la base de l'URL. Par la suite, tout appel à GET, PUT, POST ... fait implicitement référence à cette base. J'ai montré un exemple qui émet du JSON prettifié. Je pense que si votre serveur émet du JSON minifié, vous pouvez l'imprimer avec un script externe en canalisant la sortie.

Il existe un support pour les préférences basées sur l'hôte. Supposons que votre hôte cible soit api.example.org. Créez un fichier appelé ~ / .resty / api.example.org et insérez-y des lignes qui spécifient les arguments qui doivent être passés à chaque appel curl à l'hôte de ce nom. Chaque verbe http obtient sa propre ligne. Donc, en insérant ce contenu dans le fichier:

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

... signifie que chaque fois que je fais un GET lorsque api.example.org est le nom d'hôte de base, la commande curl utilisera implicitement les arguments -uet --write-outaffichés ici. (-u pour l'authentification de base).

Comme autre exemple, vous pouvez spécifier l'en-tête Accept dans ce fichier, afin de toujours demander XML:

GET --header "Accept: application/xml"

Tout argument de ligne de commande curl est pris en charge dans ce fichier de préférences. Tous les arguments curl pour le tuple hôte + verbe doivent aller sur une seule ligne dans le fichier de préférences.

Pratique.


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

Les listes de répertoires ne fonctionnent que pour les sites Web qui envoient des index de répertoires. Mais même s'ils ne le font pas, vous pouvez toujours utiliser la getcommande pour obtenir des fichiers individuels.


La getcommande téléchargera le fichier cataffichera le fichier à l'écran. Pour obtenir un http , postvous pouvez utiliser quelque chose comme: quote post post.php x=1&y=z.
donothings avec succès

5

Vous pouvez utiliser Netcat .

netcat est un simple utilitaire Unix qui lit et écrit des données sur des connexions réseau, en utilisant le protocole TCP ou UDP.

Voici un exemple pour récupérer la page d'accueil de VLC

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
[…]

Le reste du code HTML est sorti sur la console. Remarque: Vous devez taper Return deux fois après HTTP/1.0.


4
Mec, tu es hardcore. Netcat pour faire HTTP? Aie! J'espérais quelque chose avec quelques cloches et sifflets de plus.
Cheeso

1
Je n'ai aucune idée de ce que tu cherches. Au moins, il fait ce que vous avez dit dans votre question, qui n'était pas très détaillée. Netcat est un outil très pratique, pour la navigation Web peut-être pas très bien adaptée. Dépend de vos besoins.
Marco

Aucune infraction, je dis juste, ce serait bien si l'outil était un peu plus intelligent. Comme s'il y avait un moyen de définir les en-têtes HTTP qu'il enverrait. Ou si je n'ai pas eu à taper "HTTP / 1.1" pour chaque demande. ou etc.
Cheeso

1

Vous pouvez utiliser interactif à la shellsfois avec pythonou perl:

En 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
(...)

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


En 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()
(...)

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


1

Oui, vous pouvez utiliser l'option "--config":

Spécifiez le nom de fichier à -K, --config comme '-' pour que curl lise le fichier depuis stdin.

Exemple:

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

0

J'aime bien lynx pour la navigation interactive sur la ligne de commande. C'est plus un navigateur complet (qui s'intègre dans une application ncurses) qu'un outil HTML brut, cependant.

J'ai déjà testé des commandes HTML brutes sur SSL, pour lesquelles j'ai utilisé openssl, mais cela ne permet qu'une seule commande à la fois ..

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

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

Pour plus d'informations sur les options s_client de openssl, man s_clientcontient les détails.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.