通过运行单行命令使用telnet测试远程TCP端口


12

我有许多Linux机器,它们的命令和磁盘空间非常有限。但是它上面有telnet命令。

我通过编程方式远程连接到每个探针,并通过SSH发出一行linux命令。

我需要运行一个命令来使用telnet连接到特定计算机,然后立即断开连接

我可以做所有的事情,但是断开部分是可以的。Telnet打开某种类型的控制台或终端,我无法找出单行命令来运行telnet命令,然后立即断开连接。

如果这样做,我可以轻松地分析文本输出以获取错误消息,因为它们无法在指定的端口上连接到计算机,而这正是我要寻找的。

那么,如何运行单行命令以使用telnet连接到计算机并随后断开连接?


据我了解,您的Telnet客户端不支持直接发送?
IBr

@IBr,你是什么意思?
Muhammad Gelbana

注意,telent客户端在使用client exit命令终止后报告的退出代码有所不同。因此,零退出代码不应视为端口已打开的信号。至少不适用于RHEL远程RPM。
奥利弗·冈萨(OliverGondža),

Answers:


28

您应该能够将exit命令通过管道传递到STDIN中telnet。尝试:

echo 'exit' | telnet {site} {port}

看看是否可行。(它似乎可以在我的Web服务器上运行,但可以使用YMMV)。


可能有效,但似乎很愚蠢-telnet应该可以选择退出或第一次接触
亚历山大·米尔斯

10

下面给出了最简单,最简单的方法。

 sleep <n> | telnet <server> <port>

n-自动退出之前的等待时间(以秒为单位)。它可能是小数,例如0.5。请注意,某些必需的输出可能不会在指定的等待时间内返回。因此,我们可能需要相应增加。

服务器 -目标服务器IP或主机名。

port-目标服务端口号。

您也可以像这样将输出重定向到文件,

sleep 1 | telnet <server> <port> > output.log

这样完美!虽然输出确实已重定向,但我注意到我仍然得到“外部主机关闭了连接”。睡眠后在我的控制台中输出,而不是在output.log文件中。有什么办法可以防止这种情况?

5

就我而言,这可行。(CentOS 7):

while read host port; do
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi
done

1
嘿,太好了。我是工作中所有Linux系统上的用户,但不是管理员(并且没有管理员权限)。我讨厌让他们一直安装telnet,这样我就可以测试网络连接(我是网络工程师)。这是一个很好的解决方法。我进行了一些更改,使其更像telnet。我在这里提供了自己的修改答案。
theglossy1

3

我认为netcat是直接发送命令并仅获得输出的更好的工具。它只是简单而强大的工具,用于通过端口放置命令。您可以在以下超级用户问题中看到用法示例:https ://superuser.com/questions/261900/how-can-i-pipe-commands-to-a-netcat-that-will-stay-alive-asker提供了工作示例几秒钟后关闭连接。

如果您只想测试连接性,请使用以下命令:http : //terminalinflection.com/use-netcat-not-telnet-to-test-network-connectivity/


我正在尝试立即安装netcat,但无法安装。我下载了一个已编译的powerpc版本,但是缺少glibc库。我下载了一个已编译的powerpc版本,但是该设备没有足够的空间来复制库文件!glibc库是否可能已经存在,但netcat找不到它?
Muhammad Gelbana

仅在客户端需要Netcat:在服务器(探针)上可以使用相同的普通旧式telnet。
IBr

Glibc也应该已经存在,它在通常的系统中用于很多东西。
IBr

您可以尝试添加到telnet脚本中以&& exit查看其是否断开连接(至少在ssh中已足够)。
IBr

&& exit没用。如果glibc应该存在,我相信它会存在。为什么会nc.traditional抱怨它好像丢失了?
Muhammad Gelbana

1

这是上面答案的另一个版本,使它的行为有点像“常规” telnet语法。如果您喜欢我的回答,请不要对此表示赞成,而应反对原始形式。

#!/bin/bash
if [ "$2" == "" ]; then
 echo "Syntax: $0 <host> <port>"
 exit;
fi

host=$1
port=$2

r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
     echo "$host $port is open"
else
     echo "$host $port is closed"
     exit 1 # To force fail result in ShellScript
fi

1

这是我在Internet上找到的解决方案:

( echo open 127.0.0.1 23
sleep 5
echo your_login
sleep 5
echo your_password
sleep 5
echo hostname
sleep 5
echo exit ) | telnet

它在SunOS和HP-UX上对我有效



0

如果您有自定义路由,请避免使用netcat,因为它不遵循路由规则。类似于nslookupdighost忽略/ etc / hosts文件(nslookup,dig,firefox忽略/ etc / hosts文件条目)。

即:不像遵循系统路由规则的应用程序和工具(例如telnet/dev/tcp通过运行单行命令使用telnet测试远程TCP端口))和应用程序和工具那样,nc它使用默认网关,除非特别告知要使用带有以下内容的源IP地址-s

nc -w 3 -s 192.168.1.12 example.com 8080

我需要测试应用程序是否可以访问资源,以及路由是否断开,netcat报告一切正常,因为在测试中已指定了源地址。我要改用/dev/tcp

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.