自动退出Telnet命令返回提示符,无需人工干预^]退出关闭退出代码1

问题描述 投票:0回答:6

我正在主机上针对给定端口(已打开)运行

telnet
命令,它返回 0(成功)。

要手动尝试telnet,我键入以下命令,然后按control+括号,即

^]
,然后按
Enter
键,然后进入
telnet>
提示,如果我键入
close
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>
提示,以便我回到
 $
提示)。这样做,有点按预期工作,但对于最后一个命令
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] $ 

or也尝试了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] $

如果端口打开,如何自动退出 telnet 并获得

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

linux telnet exit exit-code connection-close
6个回答
32
投票

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

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

telnet> close
Connection closed.
$ echo $?
0

6
投票

这是干净的方法

echo -n | telnet `hostname` 2878

或者,

telnet `hostname` 2878 </dev/null

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


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


0
投票

您可能需要其他Linux软件包,例如

expect
来实现您想要的。


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] $ 

0
投票

我为此使用的方法:

对于列表中的我 做 对于列表 1 中的 j 做 睡眠 2|超时 --signal=9 3 telnet $i $j 完毕 完成

© www.soinside.com 2019 - 2024. All rights reserved.