Ste*_*HHH 430 networking linux port
在过去,我们过去常常telnet
查看远程主机上的端口是否打开:telnet hostname port
会尝试连接到任何主机上的任何端口并让您访问原始 TCP 流。
这些天,我工作的系统没有安装 telnet(出于安全原因),并且默认情况下会阻止所有主机的所有出站连接。随着时间的推移,很容易忘记哪些端口对哪些主机开放。
是否有另一种方法来测试远程系统上的端口是否打开——使用安装了数量有限的软件包telnet
且不可用的 Linux 系统?
小智 481
好看又啰嗦!从手册页。
单端口:
nc -zv 127.0.0.1 80
Run Code Online (Sandbox Code Playgroud)
多个端口:
nc -zv 127.0.0.1 22 80 8080
Run Code Online (Sandbox Code Playgroud)
端口范围:
nc -zv 127.0.0.1 20-30
Run Code Online (Sandbox Code Playgroud)
lor*_*nix 350
Bash 已经能够访问TCP和UDP端口一段时间了。从手册页:
/dev/tcp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet address, and port is an integer port number
or service name, bash attempts to open a UDP connection to the corresponding socket.
Run Code Online (Sandbox Code Playgroud)
所以你可以使用这样的东西:
xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here
Run Code Online (Sandbox Code Playgroud)
哒哒!
thn*_*nee 112
Netcat 是一个有用的工具:
nc 127.0.0.1 123 &> /dev/null; echo $?
0
如果端口 123 打开,1
如果关闭,将输出。
slm*_*slm 69
不使用其他工具(例如 )的最简单方法如socat
上面@lornix 的回答中所述。这只是添加一个实际示例,说明/dev/tcp/...
如果您想测试另一台服务器是否具有可通过命令行访问的给定端口,则如何在 Bash 中使用伪设备。
假设我的网络上有一个名为skinner
.
$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
&& echo "It's up" || echo "It's down"
It's up
$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
echo "It's up" || echo "It's down"
It's down
Run Code Online (Sandbox Code Playgroud)
您想像这样将echo > /dev/...
括号括起来的原因(echo > /dev/...)
是,如果您不这样做,那么通过对断开的连接进行测试,您将看到这些类型的消息。
$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused
Run Code Online (Sandbox Code Playgroud)
这些不能简单地重定向到,/dev/null
因为它们来自尝试将数据写入设备/dev/tcp
。因此,我们在子命令中捕获所有输出,即(...cmds...)
并重定向子命令的输出。
Ste*_*HHH 53
我发现这curl
可能以类似于 的方式完成工作telnet
,curl
甚至会告诉您侦听器期望哪种协议。
从主机名和端口构造一个 HTTP URI 作为 的第一个参数curl
。如果curl
可以连接,它将报告协议不匹配并退出(如果侦听器不是 Web 服务)。如果curl
无法连接,它将超时。
例如,主机 10.0.0.99 上的端口 5672 被防火墙关闭或阻止:
$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host
Run Code Online (Sandbox Code Playgroud)
但是,从不同的系统,可以访问主机 10.0.0.99 上的端口 5672,并且似乎正在运行 AMQP 侦听器。
$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP
Run Code Online (Sandbox Code Playgroud)
区分不同的消息很重要:第一次失败是因为curl
无法连接到端口。第二次失败是成功测试,但curl
预期是 HTTP 侦听器而不是 AMQP 侦听器。
小智 14
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!
Run Code Online (Sandbox Code Playgroud)
希望它能解决您的问题:)
ken*_*orb 12
这是单线:
</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed
Run Code Online (Sandbox Code Playgroud)
使用@lornix answer 中解释的 Bash 语法。
欲了解更多信息,请查看:高级Bash脚本编程指南:29章/dev
及/proc
。
小智 9
我挣扎了一整天,因为这些答案似乎都不适合我。问题是最新版本的nc
不再具有该-z
标志,而当无法访问主机时,通过 TCP 的直接访问(根据@lornix 和@slm)会失败。我最终找到了这个页面,在那里我终于找到了两个工作示例:
nc -w1 127.0.0.1 22 </dev/null
(-w
标志负责超时,并</dev/null
替换-z
标志)
timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'
(timeout
命令负责超时,其余来自@slm)
然后,只需使用&&
和/或||
(甚至$?
)来提取结果。希望有人会发现这些信息有用。
结合@kenorb 和@Azukikuru 的答案,您可以测试端口打开/关闭/防火墙。
timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout
Run Code Online (Sandbox Code Playgroud)
使用 curl 到达任何端口的另一种方法
curl telnet://127.0.0.1:22
Run Code Online (Sandbox Code Playgroud)
小智 6
下面的函数将根据系统上安装的内容选择一种方法:
# Check_port <address> <port>
check_port() {
if [ "$(which nc)" != "" ]; then
tool=nc
elif [ "$(which curl)" != "" ]; then
tool=curl
elif [ "$(which telnet)" != "" ]; then
tool=telnet
elif [ -e /dev/tcp ]; then
if [ "$(which gtimeout)" != "" ]; then
tool=gtimeout
elif [ "$(which timeout)" != "" ]; then
tool=timeout
else
tool=devtcp
fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout) gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout) timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp) </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac
}
export check_port
Run Code Online (Sandbox Code Playgroud)
小智 5
如果您安装了curl:
curl -v telnet://$host:$port/$path
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
947617 次 |
最近记录: |