我正在从命令行使用 telnet 来测试与远程主机的连接,下面是我使用的命令。我认为我可以连接到主机,但无法完全理解 telnet 输出
yabhi$ telnet <remote host_ipaddr> 22
Trying <remote host_ipaddr>…
Connected to <remote host>
Escape character is '^]'.
SSH-2.0-OpenSSH_5.3
Connection closed by foreign host.
yabhi$ telnet <remote host_ipaddr> 23
Trying <remote host_ipaddr>…
telnet: connect to address <remote host_ipaddr>: Connection refused
telnet: Unable to connect to remote host
在我远程登录到端口 22 的第一个命令中,我得到了已与端口 22(SSH 端口)建立连接的确认。但是当我尝试测试任何命令时,例如“ping”或“date”(打印日期),我收到连接关闭错误消息。此行为是否确认是否已建立与远程主机的连接
令人惊讶的是,当我 telnet 到端口 23(telnet 服务器运行的端口)时,我收到无法连接消息。
答案1
telnet
以这种方式使用只是建立一个有些原始 TCP 连接。 nc
或者netcat
是用于 IP 网络连接的命令行测试的更好工具。
在第一个实例中,您连接到端口 22 上的侦听sshd
,并获取 SSH 握手的第一部分——服务器版本字符串。
在第二个实例中,您连接到telnetd
传统上侦听的端口 23。然而,由于telnet
它的安全性不如ssh
,因此在现代系统上通常不会默认启用它。您无法连接,因为没有正在telnetd
监听<remote_host_ipaddr>
。
你是不是这样使用时会建立远程 shell 会话telnet
,这就是为什么你无法在远程系统上执行 shell 命令,例如ping
或date
。您正在建立一个网络连接,该连接允许您手动键入通常通过网络发送的相关协议的内容。使用 SSH,在初始版本交换后您几乎会陷入困境,因为交换的数据在此之后已加密。
更典型的用途是测试运行基于文本的协议的服务器,例如 HTTP、IMAP 或 SMTP,例如
$ telnet <remote_host_ipaddr> 80
> GET /index.html HTTP/1.0
>
...
$
答案2
您telnet
可以检查端口是否已打开并正在侦听。但并没有真正在远程主机上运行命令。telnet
主要不安全,所有现代系统都将其禁用。这也是您与端口 23 的连接失败的原因:系统不应该接受原则连接并且端口已关闭。Connection refused
表示连接已被防火墙或关闭的端口阻止。
答案3
如需更专用的测试方式,您可以使用我们的测试工具 dda-serverspec (https://github.com/DomainDrivenArchitecture/dda-serverspec-crate)用于此类任务。您可以定义您的期望
{:netcat [{:host "mywebserver.com" :port "443"}
{:host "telnet mywebserver.com" :port "80"}
{:host "telnet mywebserver.com" :port "8443"}]}
并针对本地主机或远程主机(通过 ssh 连接)测试这些期望。对于远程测试,您必须定义目标:
{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2"
:node-ip "18.194.113.138"}]
:provisioning-user {:login "ubuntu"}}
您可以运行测试java -jar dda-serverspec.jar --targets targets.edn serverspec.edn
在幕后,我们使用 netcat 进行一些特殊的超时或最小化流量设置...