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

Posted

技术标签:

【中文标题】自动退出 Telnet 命令返回提示,无需人工干预 ^] quit 关闭退出代码 1【英文标题】:Auto exit Telnet command back to prompt without human intervention ^] quit close exit code 1 【发布时间】:2017-05-19 11:14:22 【问题描述】:

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

要手动尝试 telnet,我输入以下命令,然后按 control+bracket 即^],然后按Enter 键,然后我得到telnet> 提示,如果我输入close 或@ 987654326@,它返回到$ 提示符,看到最后一个命令的退出状态显示0 for (success),因为端口 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] $ 

也尝试了 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 'Connection closed by foreign host.' 字符串将其标记为成功 (0)。

【问题讨论】:

【参考方案1】:

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

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

telnet> close
Connection closed.
$ echo $?
0

【讨论】:

马修的回答对我不起作用。这个有效。我仍然很惊讶为什么。 为我漂亮地工作! @Maxim Akhmedov 不错!!【参考方案2】:
╭─ ~
╰» 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

【讨论】:

【参考方案3】:

这是干净的方法

echo -n | telnet `hostname` 2878

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

【讨论】:

【参考方案4】:

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

【讨论】:

是的,期望是概率。要走的路。 “Expect 是一种根据脚本自动化交互式应用程序的工具。根据脚本,Expect 知道程序可以预期什么以及正确的响应应该是什么。”【参考方案5】:

不使用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] $ 

【讨论】:

不,我不太喜欢这个解决方案,但它可以工作,因为我至少使用了 2-3 次操作。

以上是关于自动退出 Telnet 命令返回提示,无需人工干预 ^] quit 关闭退出代码 1的主要内容,如果未能解决你的问题,请参考以下文章

youtube-dl 最高质量的 DASH 视频和音频,无需人工干预

/usr/bin/expect介绍

shell脚本常用命令:expect

如何编写无须人工干预的shell脚本?

无人工干预地自动下载某个文件

linux 怎么退出 telnet