¿Hay alguna manera de usar curl interactivamente? ¿O hay un shell interactivo curl / wget?

9

Imagina algo como esto:

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

¿Hay alguna herramienta que me permita hacer eso?

Cheeso
fuente

Respuestas:

8

En muchos sistemas Linux / Unix, su pseudocódigo simplemente funcionará en cualquier shell, aunque sus rutas realmente deberían ser URL completas.

Por ejemplo, en sistemas basados en Debian, el paquete libwww-perlinstala tres enlaces simbólicos a lwp-solicitud que se llama /usr/bin/GET, /usr/bin/HEADy /usr/bin/POST. Estos hacen lo que esperarías. Las versiones recientes del perl-libwww-perlpaquete de OpenSuse omiten los enlaces simbólicos (lo que probablemente sea un error), por lo que tendría que crearlos usted mismo o usarlos lwp-requestdirectamente. En general y durante muchos años, ha sido una suposición bastante segura que los ejecutables GET, HEAD y POST están disponibles en sistemas unixoides.

Por supuesto, también podría usarlo curlpara todas estas tareas, por lo que quizás no entiendo por qué siente que un shell de línea de comandos como bash no es interactivo.

Christian Pietsch
fuente
8

Gracias por las respuestas

Después de buscar en Google, encontré resty , que es un contenedor de script de shell alrededor de la herramienta de rizo . Esto es realmente lo que quiero. Son 155 líneas de script de shell, y cuando lo ejecuto, obtengo funciones para GET, PUT, POST, DELETE y OPTIONS. Estas funciones son solo envoltorios alrededor del programa curl que se encuentra en mi camino.

Funciona así en 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 primera línea allí solo ejecuta los comandos en el shell actual.

La siguiente línea, el comando "resty", establece la base de URL. A partir de entonces, cualquier llamada a GET, PUT, POST ... hace referencia implícita a esa base. Mostré un ejemplo que emite JSON prettified. Creo que si su servidor emite JSON minimizado, podría imprimirlo con un script externo canalizando la salida.

Hay soporte para preferencias basadas en host. Supongamos que su host de destino es api.example.org. Escriba un archivo llamado ~ / .resty / api.example.org e inserte allí líneas que especifiquen los argumentos que se deben pasar a cada llamada curl al host con ese nombre. Cada verbo http tiene su propia línea. Entonces, insertando este contenido en el archivo:

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

... significa que cada vez que hago un GET cuando api.example.org es el nombre de host base, el comando curl usará implícitamente los argumentos -uy que se --write-outmuestran allí. (-u para autenticación básica).

Como otro ejemplo, podría especificar el encabezado Aceptar en ese archivo, de modo que siempre solicite XML:

GET --header "Accept: application/xml"

Cualquier línea de comando curl arg es compatible con ese archivo de preferencias. Todos los argumentos curl para la tupla host + verbo deben ir en una sola línea en el archivo de preferencias.

Práctico.

Cheeso
fuente
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

Los listados de directorio solo funcionan para sitios web que envían índices de directorio. Pero incluso si no lo hacen, puede usar el getcomando para obtener archivos individuales.

Stéphane Chazelas
fuente
El getcomando descargará el archivo y catmostrará el archivo en la pantalla. Para tener una http postpuedes usar algo como: quote post post.php x=1&y=z.
donothings exitosamente
5

Puedes usar Netcat .

netcat es una sencilla utilidad de Unix que lee y escribe datos a través de conexiones de red, utilizando el protocolo TCP o UDP.

Aquí hay un ejemplo para recuperar la página de inicio 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
[…]

El resto del HTML se envía a la consola. Nota: debe escribir Return dos veces después HTTP/1.0.

Marco
fuente
44
Amigo, eres incondicional. Netcat para hacer HTTP? ¡Ay! Esperaba algo con algunas campanas y silbatos más.
Cheeso
1
No tengo idea de lo que buscas. Al menos hace lo que usted dijo en su pregunta, que no fue muy detallado. Netcat es una herramienta muy útil, para la navegación web quizás no sea tan adecuada. Depende de tus necesidades.
Marco
Sin ofender, solo digo que sería bueno que la herramienta fuera un poco más inteligente. Como si hubiera una manera de configurar los Encabezados HTTP que enviaría. O si no tuviera que escribir "HTTP / 1.1" para cada solicitud. o etc.
Cheeso
1

Puede usar interactivo shellstanto con pythono 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
(...)

Ver perldoc WWW::Mechanize::Shello 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()
(...)

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

Gilles Quenot
fuente
1

Sí, puedes usar la opción "--config":

Especifique el nombre del archivo a -K, --config como '-' para hacer que curl lea el archivo desde stdin.

Ejemplo:

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

Me gusta bastante Lynx para la navegación interactiva en la línea de comandos. Sin embargo, es más un navegador completo (que se adapta a una aplicación ncurses) que una herramienta HTML sin formato.

He probado comandos HTML sin procesar sobre SSL antes, para lo cual utilicé openssl, pero esto solo permite un comando a la vez.

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

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

Para obtener más información sobre las opciones s_client de openssl, man s_clientcontiene los detalles.

Alex Leach
fuente