Apakah ada cara untuk menggunakan curl secara interaktif? Atau adakah shell keriting interaktif / wget?

9

Bayangkan sesuatu seperti ini:

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

apakah ada alat yang memungkinkan saya melakukannya?

Cheeso
sumber

Jawaban:

8

Pada banyak sistem Linux / Unix, pseudocode Anda hanya akan berfungsi di semua shell, meskipun path Anda harus benar-benar URL lengkap.

Misalnya, pada sistem berbasis Debian, paket libwww-perlmenginstal tiga symlink ke lwp-permintaan yang disebut /usr/bin/GET, /usr/bin/HEADdan /usr/bin/POST. Ini melakukan apa yang Anda harapkan. Versi terbaru dari perl-libwww-perlpaket OpenSuse menghilangkan symlink (yang mungkin merupakan bug), jadi Anda harus membuatnya sendiri atau menggunakannya lwp-requestsecara langsung. Secara umum dan selama bertahun-tahun, sudah merupakan asumsi yang cukup aman bahwa GET, HEAD, dan POST executable tersedia pada sistem unixoid.

Tentu saja Anda juga dapat menggunakan curluntuk semua tugas ini, jadi mungkin saya tidak mengerti mengapa Anda merasa bahwa shell baris perintah seperti bash tidak interaktif.

Christian Pietsch
sumber
8

Terima kasih atas jawabannya.

Setelah googling sekitar, saya menemukan resty , yang merupakan pembungkus skrip shell di sekitar alat keriting . Ini benar-benar yang saya inginkan. Ini 155 baris skrip shell, dan ketika saya menjalankannya, saya mendapatkan fungsi untuk GET, PUT, POST, DELETE, dan OPTIONS. Fungsi-fungsi ini hanya pembungkus di sekitar program ikal yang ditemukan di jalur saya.

Ini berfungsi seperti ini di 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" : [ ... ]
  },
}
$

Baris pertama di sana hanya menjalankan perintah di shell saat ini.

Baris berikutnya, perintah "resty", menetapkan basis URL. Setelah itu, setiap panggilan ke GET, PUT, POST ... secara implisit merujuk pangkalan itu. Saya menunjukkan contoh yang memancarkan JSON cantik. Saya pikir jika server Anda memancarkan JSON yang diperkecil, Anda dapat mencetaknya dengan skrip eksternal dengan mem-piping output.

Ada dukungan untuk preferensi berbasis host. Misalkan host target Anda adalah api.example.org. Ceate file bernama ~ / .resty / api.example.org, dan masukkan di sana, baris yang menentukan argumen yang harus diteruskan ke setiap panggilan curl ke host dengan nama itu. Setiap kata kerja http mendapatkan barisnya sendiri. Jadi, memasukkan konten ini ke file:

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

... berarti bahwa setiap kali saya melakukan GET ketika api.example.org adalah nama host dasar, perintah curl akan secara implisit menggunakan -udan --write-outargs yang ditampilkan di sana. (-u untuk auth dasar).

Sebagai contoh lain, Anda bisa menentukan header Terima di file itu, sehingga Anda selalu meminta XML:

GET --header "Accept: application/xml"

Arg baris perintah ikal apa pun didukung dalam file preferensi itu. Semua argumen curl untuk host + kata kerja tuple harus melalui satu baris dalam file preferensi.

Berguna.

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

Daftar direktori hanya berfungsi untuk situs web yang mengirim indeks direktori. Tetapi meskipun tidak, Anda masih dapat menggunakan getperintah untuk mendapatkan file individual.

Stéphane Chazelas
sumber
The getperintah akan men-download file catakan menampilkan file ke layar. Untuk mendapatkan http postAnda dapat menggunakan sesuatu seperti: quote post post.php x=1&y=z.
donasi berhasil
5

Anda dapat menggunakan Netcat .

netcat adalah utilitas unix sederhana yang membaca dan menulis data melalui koneksi jaringan, menggunakan protokol TCP atau UDP.

Berikut adalah contoh untuk mengambil beranda 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
[…]

Sisa HTML adalah output ke konsol. Catatan: Anda harus mengetik Return dua kali setelahnya HTTP/1.0.

Marco
sumber
4
Kawan, kau hardcore. Netcat melakukan HTTP? Aduh! Saya berharap untuk sesuatu dengan beberapa lonceng dan peluit.
Cheeso
1
Saya tidak tahu apa yang Anda cari. Setidaknya itu melakukan apa yang Anda sebutkan dalam pertanyaan Anda, yang tidak terlalu detail. Netcat adalah alat yang sangat berguna, untuk menjelajah web mungkin tidak cocok. Tergantung kebutuhan Anda.
Marco
Jangan tersinggung, saya hanya mengatakan, alangkah baiknya jika alat itu sedikit lebih cerdas. Seperti jika ada cara untuk mengatur HTTP Header yang akan dikirim. Atau jika saya tidak harus mengetik "HTTP / 1.1" untuk setiap permintaan. atau yang lainnya
Cheeso
1

Anda dapat menggunakan interaktif shellsbaik dengan pythonatau perl:

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

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


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

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

Gilles Quenot
sumber
1

Yap, Anda dapat menggunakan opsi "--config":

Tentukan nama file ke -K, --config sebagai '-' untuk membuat curl membaca file dari stdin.

Contoh:

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

Saya cukup suka lynx untuk penelusuran interaktif di baris perintah. Ini lebih dari browser penuh sesak nafas (yang cocok dengan aplikasi ncurses) daripada alat HTML mentah, meskipun ..

Saya telah menguji perintah HTML mentah melalui SSL sebelumnya, yang saya gunakan openssl, tetapi ini hanya memungkinkan satu perintah pada suatu waktu ..

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

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

Untuk info lebih lanjut tentang opsi s_client openssl, man s_clientberisi detailnya.

Alex Leach
sumber