Existe uma maneira de usar o cacho interativamente? Ou existe um shell curl / wget interativo?

9

Imagine algo como isto:

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

existe uma ferramenta que me permita fazer isso?

Cheeso
fonte

Respostas:

8

Em muitos sistemas Linux / Unix, seu pseudocódigo funcionará em qualquer shell, embora seus caminhos sejam realmente URLs completos.

Por exemplo, em sistemas baseados em Debian, o pacote libwww-perlinstala três links simbólicos para lwp-request que são chamados /usr/bin/GET, /usr/bin/HEADe /usr/bin/POST. Estes fazem o que você esperaria. As versões recentes do perl-libwww-perlpacote do OpenSuse omitem os links simbólicos (o que provavelmente é um bug), então você teria que criá-los ou usá-los lwp-requestdiretamente. Geralmente e por muitos anos, tem sido bastante seguro que os executáveis ​​GET, HEAD e POST estejam disponíveis em sistemas unixóides.

É claro que você também pode usar curlpara todas essas tarefas, então talvez eu não entenda por que você acha que um shell de linha de comando como o bash não é interativo.

Christian Pietsch
fonte
8

Obrigado pelas respostas.

Depois de pesquisar no Google, achei resty , que é um wrapper de script de shell em torno da ferramenta curl . Isso é realmente o que eu quero. São 155 linhas de script de shell e, quando o executo, obtenho funções para GET, PUT, POST, DELETE e OPTIONS. Essas funções são apenas wrappers em torno do programa curl encontrado no meu caminho.

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

A primeira linha lá apenas executa os comandos no shell atual.

A próxima linha, o comando "resty", define a base da URL. Depois disso, qualquer chamada para GET, PUT, POST ... faz referência implícita a essa base. Eu mostrei um exemplo que emite JSON prettified. Acho que se o seu servidor emitir JSON reduzido, você poderá imprimi-lo com um script externo, canalizando a saída.

Há suporte para preferências baseadas em host. Suponha que seu host de destino seja api.example.org. Crie um arquivo chamado ~ / .resty / api.example.org e insira nele as linhas que especificam argumentos que devem ser passados ​​a cada chamada de conexão com o host com esse nome. Cada verbo http obtém sua própria linha. Então, inserindo este conteúdo no arquivo:

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

... significa que cada vez que eu faço um GET quando api.example.org é o nome do host base, o comando curl usará implicitamente o -ue --write-outargs mostrado lá. (-u para autenticação básica).

Como outro exemplo, você pode especificar o cabeçalho Accept nesse arquivo, para solicitar sempre o XML:

GET --header "Accept: application/xml"

Qualquer argumento de linha de comando curl é suportado nesse arquivo de preferências. Todos os argumentos de curvatura para a tupla host + verbo precisam seguir uma única linha no arquivo de preferências.

Handy.

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

As listagens de diretório funcionam apenas para sites que enviam índices de diretório. Mas, mesmo que não, você ainda pode usar o getcomando para obter arquivos individuais.

Stéphane Chazelas
fonte
O getcomando fará o download do arquivo e catenviará o arquivo para a tela. Para se ter uma http postvocê pode usar algo como: quote post post.php x=1&y=z.
donothingsuccessfully
5

Você pode usar o Netcat .

O netcat é um utilitário unix simples que lê e grava dados nas conexões de rede, usando o protocolo TCP ou UDP.

Aqui está um exemplo para recuperar a página inicial do 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
[…]

O restante do HTML é enviado para o console. Nota: Você precisa digitar Return duas vezes depois HTTP/1.0.

Marco
fonte
4
Cara, você é hardcore. Netcat para fazer HTTP? ai! Eu esperava algo com mais alguns sinos e assobios.
Cheeso 16/10
11
Eu não tenho idéia do que você está procurando. Pelo menos, faz o que você declarou na sua pergunta, que não foi muito detalhada. O Netcat é uma ferramenta muito útil, para a navegação na web talvez não seja tão adequada. Depende das suas necessidades.
Marco
Sem ofensas, estou apenas dizendo, seria bom se a ferramenta fosse um pouco mais inteligente. Como se houvesse uma maneira de definir os cabeçalhos HTTP que seriam enviados. Ou se eu não tivesse que digitar "HTTP / 1.1" para cada solicitação. ou etc.
Cheeso 16/10
1

Você pode usar interativo shellscom pythonou perl:

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

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


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

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

Gilles Quenot
fonte
1

Sim, você pode usar a opção "--config":

Especifique o nome do arquivo como -K, --config como '-' para fazer o curl ler o arquivo a partir de stdin.

Exemplo:

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

Eu gosto bastante do lynx para navegação interativa na linha de comando. É mais um navegador completo (que se encaixa em um aplicativo ncurses) do que uma ferramenta HTML bruta.

Eu testei comandos HTML brutos sobre SSL antes, para os quais usei openssl, mas isso permite apenas um comando por 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 mais informações sobre as opções s_client do openssl, man s_clientcontém os detalhes.

Alex Leach
fonte