9

我在telnet主机上为给定端口(打开)运行命令,它返回 0(成功)。

对于手动尝试 telnet,我输入以下命令,然后按 control+bracket ie ^],然后按Enter键,然后我得到telnet>提示,如果我输入closeor quit,它会返回$提示并看到最后一个命令的退出状态显示0为(成功),因为端口 2878 已打开(根据 telnet 命令的输出)。

[vagrant@myvagrant /tmp] $ telnet `hostname` 2878
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
^]

telnet> close
Connection closed.
[vagrant@myvagrant /tmp] $ echo $?
0

现在,我想在没有任何人为干预的情况下运行相同的操作,即我不想手动给出^]并按下Enter键来进入telnet>提示符,然后输入close(或quit)telnet 命令最终回到$提示符。

为此,我尝试使用echo -e命令的选项并给出^], \n(用于换行符,即Enter键)和close命令(用于telnet>提示,以便我回到$提示)。这样做,有点像预期的那样工作,但是对于 last command 的退出状态echo $?,我得到了1(而不是0)。为什么?

[vagrant@myvagrant /tmp] $ echo -e "^]\nclose" | telnet `hostname` 2878
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
Connection closed by foreign host.
[vagrant@myvagrant /tmp] $ 
[vagrant@myvagrant /tmp] $ echo $?
1
[vagrant@myvagrant /tmp] $ 

或者也尝试了 here-doc 方法,但不确定为什么它1会为打开的有效端口返回(作为退出代码)。

[vagrant@myvagrant /tmp] $ telnet `hostname` 2878 <<GIGA
> echo ^]
> echo close
> GIGA
Trying 127.0.0.1...
Connected to myvagrant.
Escape character is '^]'.
Connection closed by foreign host.
[vagrant@myvagrant ~/aks/always-latest-ws-sunny] $ echo $?
1
[vagrant@myvagrant ~/aks/always-latest-ws-sunny] $

0如果端口打开并作为退出代码获取,如何自动退出 telnet ?如果有办法捕获上一个命令的输出,也许我可以 grep '连接被外部主机关闭。' 字符串将其标记为成功 (0)。

4

5 回答 5

18

对上面 Matthew 提供的答案略有改进,允许您在 shell 脚本中使用它:

$ echo -e '\x1dclose\x0d' | telnet google.com 80
Connected to google.com.
Escape character is '^]'.

telnet> close
Connection closed.
$ echo $?
0
于 2019-01-25T12:01:41.193 回答
1
╭─ ~
╰» echo "^]close^M" | telnet localhost 22; echo $?
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

telnet> close
Connection closed.
0

要输入^]^M字符,请分别按ctrl+v ctrt+]ctrl+v ctrl+m

于 2018-08-11T06:07:33.427 回答
1

这是干净的方法

echo -n | telnet `hostname` 2878

有关此行为的更多信息,请参阅此链接

于 2020-03-28T05:29:28.503 回答
0

不使用Expect,我猜使用HERE文档 (<

[vagrant@myvagrant /tmp] $ telnet_result=$(telnet `hostname` 2878 <<GIGA
echo ^]
echo close
GIGA
); echo $telnet_result | grep "Escape character is '^]'"; echo $?
Connection closed by foreign host.
 Escape character is '^]'.
0
[vagrant@myvagrant /tmp] $ 

对于坏/无效/未开放的端口,同样给出1(如预期的那样)。

[vagrant@myvagrant /tmp] $ telnet_result=$(telnet `hostname` 287811111 <<GIGA
echo ^]
echo close
GIGA
); echo $telnet_result | grep "Escape character is '^]'"; echo $?
telnet: connect to address 127.0.0.1: Connection refused
1
[vagrant@myvagrant /tmp] $ 
于 2017-01-06T00:35:29.030 回答
0

您可能需要其他 linux 软件包expect来实现您想要的。

于 2017-01-05T02:05:26.630 回答