将文本文件的内容作为命令传送到telnet


10

使用命令telnet docs.python.org 80,我可以http://docs.python.org/2/license.html通过键入实际请求来向发出手动HTTP 请求。

现在,我不想实时输入内容,而是希望从文本文件中获取请求。

我尝试了这个:

cat request.txt|telnet docs.python.org 80


request.txt

GET /2/license.html HTTP/1.1 
Host: docs.python.org

(您必须用空白行结束文件,否则将收到错误的请求!)


但是,到服务器的连接将立即关闭。

我应该如何正确地将request.txt传递给telnet docs.python.org 80


编辑:

很高兴知道;如果您使用HEAD而不是GET,则将获得与您发出GET请求相同的响应,但消息正文除外。
因此,HEAD如果您只想检查HTTP标头,请使用。(即,这样响应的内容就不会使您的shell输出混乱。)


您能否包括您手动运行的实际命令,以便我们进行比较?运行GET您发布的消息时,出现408 Request Time-out错误。另外,wget http://docs.python.org/2/license.html不是选择吗?
terdon

命令正确。我认为您在输入时即与服务器建立了连接telnet docs.python.org 80,因此您必须急于在几秒钟内键入这两行(如果需要,请复制并粘贴),否则服务器将返回超时错误。
Bentley4年

这些是确切的命令:telnet docs.python.org 80 <ENTER> GET /2/license.html HTTP/1.1 <ENTER> Host: docs.python.org <ENTER> <ENTER>
Bentley13年

1
我认为您需要<ENTER>在末尾再次键入的原因是因为HTTP协议在请求标头之后需要额外的空行。见请求消息部分的的HTTP wiki文章
Bentley4

1
该死,从理论上讲,您应该可以做到,telnet < request.txt但是我无法使GET命令正常工作。
terdon

Answers:


21

使用netcat(nc命令)而不是“ telnet”,因此

猫request.txt | nc docs.python.org 80

Telnet是一种快速简便的技巧,但是netcat显然是完成此任务的正确工具。


Telnet如何“快速”和“轻松”然后是netcap?对于这种情况,我认为在使用方面没有任何区别。
Bentley4

当然不是这种情况,但是我认为人们(读我,显然是您!!!)倾向于使用telnet,因为它是我们学习的第一件事,当然,它在Windows和Linux上也可以使用,我相信netcat在Windows下未预安装。
davidgo,2013年

5

我真的没有任何经验,telnet但是它确实需要文件重定向的输入:

telnet < abc.txt

我可以将其正确连接到服务器,如下所示:

$ cat abc.txt
open docs.python.org 80
$ telnet < abc.txt
telnet> Trying 82.94.164.162...
Connected to dinsdale.python.org.
Escape character is '^]'.
Connection closed by foreign host.

也许您可以弄清楚如何使它接受GET命令,但是我做不到。一种替代方法是使用expect脚本:

#!/usr/bin/expect

spawn telnet docs.python.org 80
expect "Escape character is '^]'." { 
     send "GET /2/license.html HTTP/1.1\nHost: docs.python.org\n\n" 
}
interact

然后,您可以将脚本另存为telnet.exp,使其可执行并运行:

./telnet.exp > output.html

酷,我不知道expect!我选择了davidgo的答案,因为它只是针对这种情况的最佳解决方案。我没有看到netcap和telnet在使用上想要达到的任何使用差异。尽管如此,还是感谢您的努力,Terdon,如果我能进一步支持您的回答,我会的。
Bentley13年

1
@ Bentley4没问题,使用nc是更好的解决方案,您应该接受它。
2013年

我看不到如何interact结束该expect脚本的正确方法。
2015年

@ 2rs2ts我对期望知之甚少,您也许是对的,但由于您的评论并没有告诉我您为什么认为这是错的,所以我不能告诉您。我的理解是interact“将控制当前进程的操作交给用户,以便将击键发送到当前进程,并返回当前进程的stdout和stderr”(来自man expect)。因此,interact是为用户提供一种实际使用telnet连接的方法。
terdon

由于最初的问题是关于将文件的内容馈入telnet而不是与文件进行交互,所以我认为您应该以此类推close -i $spawn_id。然后脚本将退出。随着interact我其实是无法退出telnet的一切,不得不关闭我的终端。十分悲惨(尽管可能部分原因是我的错。)
2rs2ts 2015年
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.