Есть ли способ использовать curl в интерактивном режиме? Или есть интерактивная оболочка curl / wget?

9

Представьте себе что-то вроде этого:

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

есть ли инструмент, который позволяет мне это сделать?

Cheeso
источник

Ответы:

8

Во многих системах Linux / Unix ваш псевдокод будет работать в любой оболочке, хотя ваши пути должны быть полными URL-адресами.

Например, в системах Debian на базе, пакет libwww-perlустанавливает три символические ссылки на LWP-запрос , которые называются /usr/bin/GET, /usr/bin/HEADи /usr/bin/POST. Они делают то, что вы ожидаете. Последние версии пакета OpenSuse perl-libwww-perlпропускают символические ссылки (что, вероятно, является ошибкой), поэтому вам придется создавать их самостоятельно или использовать lwp-requestнапрямую. В целом и на протяжении многих лет было вполне безопасным предположение, что исполняемые файлы GET, HEAD и POST доступны в системах unixoid.

Конечно, вы могли бы также использовать curlдля всех этих задач, поэтому, возможно, я не понимаю, почему вы чувствуете, что оболочка командной строки, такая как bash, не является интерактивной.

Кристиан Питч
источник
8

Спасибо за ответы.

Поискав в поиске , я нашел resty , который является оболочкой сценария оболочки для инструмента curl . Это действительно то, чего я хочу. Это 155 строк сценария оболочки, и когда я его запускаю, я получаю функции для GET, PUT, POST, DELETE и OPTIONS. Эти функции - просто обертки вокруг программы curl, найденной на моем пути.

Это работает так на 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" : [ ... ]
  },
}
$

Первая строка там просто запускает команды в текущей оболочке.

Следующая строка, команда resty, устанавливает базу URL. После этого любой вызов GET, PUT, POST ... неявно ссылается на эту базу. Я показал пример, который испускает предварительно подтвержденный JSON. Я думаю, что если ваш сервер испускает минимизированный JSON, вы можете распечатать его с помощью внешнего скрипта, отправив выходные данные.

Есть поддержка хост-настроек. Предположим, что вашим целевым хостом является api.example.org. Создайте файл с именем ~ / .resty / api.example.org и вставьте туда строки, которые определяют аргументы, которые должны передаваться при каждом вызове curl хосту с этим именем. Каждый глагол http получает свою собственную строку. Итак, вставив этот контент в файл:

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

... означает , что каждый раз , когда я делаю GET , когда api.example.org является базой имя хоста, команда локон будет неявно использовать -uи --write-outпоказано, арг. (-u для базовой аутентификации).

В качестве другого примера вы можете указать заголовок Accept в этом файле, чтобы всегда запрашивать XML:

GET --header "Accept: application/xml"

Любой аргумент командной строки curl поддерживается в этом файле настроек. Все аргументы curl для кортежа host + verb должны находиться в одной строке в файле настроек.

Handy.

Cheeso
источник
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

Списки каталогов работают только для сайтов, которые отправляют индексы каталогов. Но даже если они этого не делают, вы все равно можете использовать getкоманду для получения отдельных файлов.

Стефан Шазелас
источник
Команда getзагрузит файл, catвыведет файл на экран. Чтобы получить HTTP postвы можете использовать что - то вроде: quote post post.php x=1&y=z.
удачно сделано
5

Вы можете использовать Netcat .

netcat - это простая утилита Unix, которая читает и записывает данные через сетевые соединения, используя протокол TCP или UDP.

Вот пример, чтобы получить домашнюю страницу 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
[…]

Остальная часть HTML выводится на консоль. Примечание: вам нужно напечатать Return дважды после HTTP/1.0.

Marco
источник
4
Чувак, ты хардкор. Netcat делать HTTP? Уч! Я надеялся на что-то еще с несколькими прибамбасами.
Cheeso
1
Я понятия не имею о том, что вы после. По крайней мере, он делает то, что вы задали в своем вопросе, который не был очень подробным. Netcat - очень удобный инструмент для просмотра веб-страниц, возможно, не очень подходящий. Зависит от ваших потребностей.
Марко
Без обид, я просто говорю, было бы неплохо, если бы инструмент был немного более интеллектуальным. Например, если бы был способ установить заголовки HTTP, которые он отправлял. Или если мне не нужно было вводить «HTTP / 1.1» для каждого запроса. или т. д.
Cheeso
1

Вы можете использовать интерактивные shellsи с pythonили perl:

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

См. perldoc WWW::Mechanize::ShellИли http://search.cpan.org/~corion/WWW-Mechanize-Shell-0.52/lib/WWW/Mechanize/Shell.pm.


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

Смотрите http://wwwsearch.sourceforge.net/mechanize/

Жиль Квено
источник
1

Да, вы можете использовать опцию "--config":

Укажите имя файла для -K, --config как '-', чтобы curl прочитал файл из stdin.

Пример:

$ curl -K-
url https://github.com/blog
remote-name
<Ctrl + D>
Стивен Пенни
источник
0

Мне очень нравится рысь для интерактивного просмотра в командной строке. Это скорее полноценный браузер (который вписывается в приложение ncurses), чем простой инструмент HTML, хотя ..

Ранее я тестировал необработанные команды HTML через SSL, для которых я использовал openssl, но это позволяет только одну команду за раз ..

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

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

Для получения дополнительной информации об опциях openssl s_client, man s_clientсодержит детали.

Алекс Лич
источник