有没有一种交互式使用curl的方法?还是有一个互动的curl / wget外壳?


9

想象这样的事情:

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

有没有可以让我做到这一点的工具?

Answers:


8

在许多Linux / Unix系统上,尽管您的路径实际上应该是完整的URL,但是您的伪代码将可以在任何shell中使用。

例如,在基于Debian的系统中,包libwww-perl装3个符号连接LWP请求这是所谓的/usr/bin/GET/usr/bin/HEAD/usr/bin/POST。这些可以达到您的期望。OpenSuse perl-libwww-perl软件包的最新版本省略了符号链接(这可能是一个错误),因此您必须自己创建或lwp-request直接使用它们。通常,多年来,一直非常安全地假设GET,HEAD和POST可执行文件在unixoid系统上可用。

当然,您也可以使用curl所有这些任务,所以也许我不明白为什么您会觉得bash之类的命令行外壳不是交互式的。


8

感谢您的回答。

围绕谷歌搜索后,我发现resty,这是围绕一个shell脚本卷曲工具。这真的是我想要的。它是155行shell脚本,当我运行它时,我得到了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" : [ ... ]
  },
}
$

此处的第一行仅在当前shell中运行命令。

下一行,“ 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"

...表示每次在api.example.org是基本主机名时执行GET时,curl命令都会隐式使用此处显示的-u--write-outargs。(-u用于基本身份验证)。

另一个示例,您可以在该文件中指定Accept标头,以便始终请求XML:

GET --header "Accept: application/xml"

该首选项文件中支持任何curl命令行arg。主机+动词元组的所有curl参数都需要在首选项文件中一行。

便利。


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
donothing成功地

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


4
杜德,你是铁杆。Netcat做HTTP吗?哎哟!我希望有更多的风吹草动。
Cheeso 2012年

1
我不知道你要干什么 至少它能做到您在问题中所说的,但不是很详细。Netcat是一个非常方便的工具,对于Web浏览来说可能不太适合。取决于您的需求。
马可(Marco)2012年

我只是说没有冒犯,如果该工具更加智能,那就太好了。就像有一种设置将发送的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::Shellhttp://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

我非常喜欢lynx在命令行上进行交互式浏览。不过,与原始HTML工具相比,它更像是功能全面的浏览器(适合ncurses应用程序)。

我曾经使用SSL来测试过基于SSL的原始HTML命令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包含详细信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.