2

我需要 Telnet 到我的同事的服务器以进行我正在从事的项目:

telnet = Net::Telnet::new(
  "Host" => "example_ip",
  "Port" => 80,
  "Timeout"=>90,
  "Waittime" => 1,
  "Output_log"=>"output_log.log",
  "Dump_log"=> "dump_log.log"
)# => #<Net::Telnet:0x007f8142321c00 ...
telnet.cmd('ls')  # => "HTTP/1.1 0 ERROR\n\nERROR 0\n" 

我的 output_log 看起来像:

Trying example_ip...
Connected to example_ip.
HTTP/1.1 0 ERROR

ERROR 0

我知道他的服务器正在运行,我可以连接到它。为什么我无法从 Ruby 连接?

(来自 OSX 终端)

$ telnet example_ip 80
Trying example_ip...
Connected to c-example_ip...comcast.net.
Escape character is '^]'.
...
$ ls
_~1     .TRA 22       4096
TRASHE~1.    12          0
FSEVEN~1.    12          0
20110221.LOG  0         73
CONFIG  .     0        573
20110223.LOG  0         95
20110224.LOG  0         17
20110225.LOG  0         17
20110315.LOG  0         73
...

编辑:

我尝试设置Binmodeto falseTelnetmodetofalse和一些不同的值Prompt(但我不知道正确的值是什么)。

4

1 回答 1

1

一个问题是您在代码中远程登录到端口 80,即 HTTPd 端口。这就是为什么你得到:

HTTP/1.1 0 ERROR

服务器希望您发送 HTTP 命令,例如GET /index.html,但您发送的是“ls”。

您没有说明您在机器的命令行上使用什么主机操作系统连接到服务器,但是,该机器上的 telnet 命令可能需要使用冒号将端口命令与主机 IP 或 FQDN 分开:

telnet example_ip:80

未能在该类型的客户端上使用冒号会导致连接到端口 23 上的标准 telnet 端口,这似乎由您的ls命令工作备份。端口 80 上的 HTTPd 不会知道您的意思ls

您可以使用 Telnet 协议连接到 HTTPd,也可以使用 telnet 客户端应用程序。不过,您必须使用正确的命令集。尝试调整您的代码telnet.cmd("GET /index.html\r\n"),看看您是否收到回复。


编辑:

使用 OpenURI 进行实验。这是一种非常简单方便的方式来戳 Web 服务器:

需要'open-uri'
doc = open('http://example.com').read
放置文档 [0, 100]

这将在给定的主机上打开到端口 80 的连接,然后进行重定向,并返回收到的文档。然后打印前 100 个字符,如下所示:

<!doctype html>
<html>
<head>
  <title>Example Domain</title>

  <meta charset="utf-8" />
  <meta http-

您没有说明为什么“需要”远程登录到 Web 服务器。它们不支持您可以通过普通 telnet 会话发出的相同命令,并且不会让您访问文件系统,除非已为此目的编写代码。

于 2013-02-09T23:51:58.957 回答