在Linux中編寫shell腳本監(jiān)聽指定端口的實現(xiàn)方式
更新時間:2025年12月29日 09:30:55 作者:學(xué)亮編程手記
這篇文章主要介紹了在Linux中監(jiān)聽指定端口的幾種方法,包括使用netcat、socat、Python腳本等,并提供了每種方法的詳細(xì)步驟和示例腳本,需要的朋友可以參考下
在Linux中,你可以編寫一個shell腳本來監(jiān)聽指定端口。以下是幾種實現(xiàn)方式:
方法1:使用nc(netcat)的簡單監(jiān)聽腳本
#!/bin/bash
# 文件名:port_listener.sh
# 檢查參數(shù)
if [ $# -ne 1 ]; then
echo "使用方法: $0 <端口號>"
echo "示例: $0 8080"
exit 1
fi
PORT=$1
echo "正在監(jiān)聽端口 $PORT ..."
echo "按 Ctrl+C 停止監(jiān)聽"
# 使用netcat監(jiān)聽端口
nc -l -p $PORT
# 如果上面的命令失敗,嘗試不帶-p參數(shù)的格式
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監(jiān)聽端口 $PORT"
echo "輸入將會顯示在終端,輸出將會發(fā)送回客戶端"
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
# 檢查參數(shù)
if [ $# -lt 1 ] || [ $# -gt 2 ]; then
echo -e "${GREEN}使用方法:${NC}"
echo " $0 <端口號> [協(xié)議]"
echo " <端口號>: 要監(jiān)聽的端口"
echo " [協(xié)議]: 可選,tcp 或 udp,默認(rèn)為 tcp"
echo ""
echo -e "${YELLOW}示例:${NC}"
echo " $0 8080 # 監(jiān)聽TCP端口8080"
echo " $0 8080 tcp # 監(jiān)聽TCP端口8080"
echo " $0 53 udp # 監(jiān)聽UDP端口53"
exit 1
fi
PORT=$1
PROTOCOL=${2:-tcp} # 默認(rèn)為TCP
# 檢查端口是否有效
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || [ "$PORT" -lt 1 ] || [ "$PORT" -gt 65535 ]; then
echo -e "${RED}錯誤: 端口號必須在1-65535之間${NC}"
exit 1
fi
# 檢查協(xié)議是否有效
if [[ "$PROTOCOL" != "tcp" && "$PROTOCOL" != "udp" ]]; then
echo -e "${RED}錯誤: 協(xié)議必須是 '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}開始監(jiān)聽${NC}"
echo -e "端口: ${YELLOW}$PORT${NC}"
echo -e "協(xié)議: ${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 停止監(jiān)聽${NC}"
echo ""
# 根據(jù)協(xié)議選擇監(jiān)聽方式
if [[ "$PROTOCOL" == "tcp" ]]; then
# TCP監(jiān)聽
echo "等待TCP連接..."
nc -l -p $PORT -v
else
# UDP監(jiān)聽
echo "等待UDP數(shù)據(jù)包..."
echo "注意: UDP是無連接的,可能需要使用特定工具發(fā)送數(shù)據(jù)"
nc -u -l $PORT -v
fi
# 監(jiān)聽結(jié)束時顯示信息
echo ""
echo -e "${GREEN}監(jiān)聽已停止${NC}"
echo -e "結(jié)束時間: $(date)"
方法4:使用多個工具備選的腳本
#!/bin/bash
# 文件名:port_listener_universal.sh
PORT=$1
# 檢查工具是否可用
check_command() {
command -v $1 >/dev/null 2>&1
}
echo "嘗試監(jiān)聽端口 $PORT"
# 按優(yōu)先級嘗試不同的工具
if check_command nc; then
echo "使用 netcat (nc) 監(jiān)聽..."
nc -l $PORT
elif check_command socat; then
echo "使用 socat 監(jiān)聽..."
socat TCP-LISTEN:$PORT,fork EXEC:'/bin/cat'
elif check_command python3; then
echo "使用 Python3 監(jiān)聽..."
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監(jiān)聽端口 {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停止監(jiān)聽')
break
finally:
conn.close()
sock.close()
"
else
echo "錯誤: 沒有找到可用的監(jiān)聽工具"
echo "請安裝以下任一工具:"
echo " 1. netcat (nc)"
echo " 2. socat"
echo " 3. python3"
exit 1
fi
使用方法:
保存腳本
nano port_listener.sh # 復(fù)制粘貼上面的腳本內(nèi)容
添加執(zhí)行權(quán)限
chmod +x port_listener.sh
運行腳本
# 簡單監(jiān)聽 ./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
到此這篇關(guān)于在Linux中編寫shell腳本監(jiān)聽指定端口的實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Linux shell監(jiān)聽指定端口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一鍵配置CentOS iptables防火墻的Shell腳本分享
這篇文章主要介紹了一鍵配置CentOS iptables防火墻Shell腳本分享,可保存到一個腳本文件中,在新安裝的CentOS系統(tǒng)時一條命令搞定iptables配置,需要的朋友可以參考下2014-07-07
shell腳本學(xué)習(xí)之調(diào)用腳本將文件打包zip的方法示例
這篇文章主要給大家介紹了關(guān)于shell腳本學(xué)習(xí)之調(diào)用腳本將文件打包zip的方法,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-07-07

