在Linux中编写shell脚本监听指定端口的实现方式
作者:学亮编程手记
这篇文章主要介绍了在Linux中监听指定端口的几种方法,包括使用netcat、socat、Python脚本等,并提供了每种方法的详细步骤和示例脚本,需要的朋友可以参考下
在Linux中,你可以编写一个shell脚本来监听指定端口。以下是几种实现方式:
方法1:使用nc(netcat)的简单监听脚本
#!/bin/bash
# 文件名:port_listener.sh
# 检查参数
if [ $# -ne 1 ]; then
echo "使用方法: $0 <端口号>"
echo "示例: $0 8080"
exit 1
fi
PORT=$1
echo "正在监听端口 $PORT ..."
echo "按 Ctrl+C 停止监听"
# 使用netcat监听端口
nc -l -p $PORT
# 如果上面的命令失败,尝试不带-p参数的格式
if [ $? -ne 0 ]; then
echo "尝试另一种nc语法..."
nc -l $PORT
fi
方法2:使用socat(功能更强大)
#!/bin/bash
# 文件名:port_listener_socat.sh
if [ $# -ne 1 ]; then
echo "使用方法: $0 <端口号>"
exit 1
fi
PORT=$1
echo "使用socat监听端口 $PORT"
echo "输入将会显示在终端,输出将会发送回客户端"
socat TCP-LISTEN:$PORT,fork EXEC:'/bin/cat'
方法3:使用Python的增强版脚本(推荐)
#!/bin/bash
# 文件名:port_listener_advanced.sh
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查参数
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo -e "${GREEN}使用方法:${NC}"
echo " $0 <端口号> [协议]"
echo " <端口号>: 要监听的端口"
echo " [协议]: 可选,tcp 或 udp,默认为 tcp"
echo ""
echo -e "${YELLOW}示例:${NC}"
echo " $0 8080 # 监听TCP端口8080"
echo " $0 8080 tcp # 监听TCP端口8080"
echo " $0 53 udp # 监听UDP端口53"
exit 1
fi
PORT=$1
PROTOCOL=${2:-tcp} # 默认为TCP
# 检查端口是否有效
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
echo -e "${RED}错误: 端口号必须在1-65535之间${NC}"
exit 1
fi
# 检查协议是否有效
if [[ "$PROTOCOL" != "tcp" && "$PROTOCOL" != "udp" ]]; then
echo -e "${RED}错误: 协议必须是 'tcp' 或 'udp'${NC}"
exit 1
fi
# 检查端口是否已被占用
echo -e "${YELLOW}检查端口 $PORT 是否可用...${NC}"
if ss -tuln | grep -q ":$PORT "; then
echo -e "${RED}错误: 端口 $PORT 已被占用${NC}"
ss -tuln | grep ":$PORT "
exit 1
fi
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}开始监听${NC}"
echo -e "端口: ${YELLOW}$PORT${NC}"
echo -e "协议: ${YELLOW}$PROTOCOL${NC}"
echo -e "时间: $(date)"
echo -e "主机: $(hostname)"
echo -e "IP地址: $(hostname -I 2>/dev/null || ip addr show | grep 'inet ' | grep -v '127.0.0.1' | head -1 | awk '{print $2}')"
echo -e "${GREEN}========================================${NC}"
echo -e "${YELLOW}按 Ctrl+C 停止监听${NC}"
echo ""
# 根据协议选择监听方式
if [[ "$PROTOCOL" == "tcp" ]]; then
# TCP监听
echo "等待TCP连接..."
nc -l -p $PORT -v
else
# UDP监听
echo "等待UDP数据包..."
echo "注意: UDP是无连接的,可能需要使用特定工具发送数据"
nc -u -l $PORT -v
fi
# 监听结束时显示信息
echo ""
echo -e "${GREEN}监听已停止${NC}"
echo -e "结束时间: $(date)"
方法4:使用多个工具备选的脚本
#!/bin/bash
# 文件名:port_listener_universal.sh
PORT=$1
# 检查工具是否可用
check_command() {
command -v $1 >/dev/null 2>&1
}
echo "尝试监听端口 $PORT"
# 按优先级尝试不同的工具
if check_command nc; then
echo "使用 netcat (nc) 监听..."
nc -l $PORT
elif check_command socat; then
echo "使用 socat 监听..."
socat TCP-LISTEN:$PORT,fork EXEC:'/bin/cat'
elif check_command python3; then
echo "使用 Python3 监听..."
python3 -c "
import socket
import sys
port = $PORT
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', port))
sock.listen(1)
print(f'Python监听端口 {port}...')
print('等待连接...')
while True:
conn, addr = sock.accept()
print(f'连接来自: {addr}')
try:
while True:
data = conn.recv(1024)
if not data:
break
print(f'收到: {data.decode()}')
conn.sendall(data) # 回声
except KeyboardInterrupt:
print('\\n停止监听')
break
finally:
conn.close()
sock.close()
"
else
echo "错误: 没有找到可用的监听工具"
echo "请安装以下任一工具:"
echo " 1. netcat (nc)"
echo " 2. socat"
echo " 3. python3"
exit 1
fi
使用方法:
保存脚本
nano port_listener.sh # 复制粘贴上面的脚本内容
添加执行权限
chmod +x port_listener.sh
运行脚本
# 简单监听 ./port_listener.sh 8080 # 高级版(支持TCP/UDP) ./port_listener_advanced.sh 8080 ./port_listener_advanced.sh 53 udp # 通用版(自动选择可用工具) ./port_listener_universal.sh 8080
测试连接:
在另一个终端测试连接:
# 使用telnet测试TCP telnet localhost 8080 # 使用nc测试TCP echo "Hello" | nc localhost 8080 # 使用nc测试UDP echo "Hello UDP" | nc -u localhost 53
安装必要工具(如果缺失):
# Ubuntu/Debian sudo apt update sudo apt install netcat socat python3 # CentOS/RHEL/Fedora sudo yum install nc socat python3 # 或 sudo dnf install nc socat python3
到此这篇关于在Linux中编写shell脚本监听指定端口的实现方式的文章就介绍到这了,更多相关Linux shell监听指定端口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
