起因是闲鱼购入了一台小米盒子3S, 想尝试利用WIFI连接ABD调试, 结果开心电视助手报错说对方设备积极拒绝。博主前后购入了两台小米3S, 前一台并没有发现这样的问题。于是就想看一下是否是5555端口没有正确被打开。
DeepSeek大法好
记得之前看一个车商访谈,有个造车的抱怨某厂商,说xxx自己做大了,结果参与制订规则限制其他厂商要怎么怎么样,自己过了河,把人桥给拆了。有时候感觉吧,做AI的那个群体也异曲同工。AI很好用,但越用越感觉自己的无力。以下是deepseedk2分钟写的扫描端口程序:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys
import time
from datetime import datetime
from threading import Thread, BoundedSemaphore
from Queue import Queue
class PortScanner(object):
"""
Python 2.7 端口扫描器
"""
def __init__(self, target_ip, timeout=1.5, max_threads=100):
self.target_ip = target_ip
self.timeout = timeout
self.max_threads = max_threads
self.open_ports = []
self.closed_count = 0
self.total_ports = 0
self.scanned_count = 0
self.lock = BoundedSemaphore(1) # 用于线程安全输出
self.port_queue = Queue()
def get_service_name(self, port):
"""
获取端口对应的服务名称
"""
try:
return socket.getservbyport(port)
except:
return 'unknown'
def scan_port(self, port):
"""
扫描单个端口
"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self.timeout)
result = sock.connect_ex((self.target_ip, port))
sock.close()
if result == 0:
service = self.get_service_name(port)
with self.lock:
self.open_ports.append((port, service))
self.scanned_count += 1
# 显示进度和开放端口
progress = (float(self.scanned_count) / self.total_ports) * 100
sys.stdout.write("\r\033[K") # 清除当前行
sys.stdout.write(u"进度: {}/{} ({:.1f}%) | 开放端口: {}".format(
self.scanned_count, self.total_ports, progress, len(self.open_ports)))
sys.stdout.flush()
# 打印开放的端口
print u"\n ✓ 端口 {} 开放 ({})".format(port, service)
else:
with self.lock:
self.scanned_count += 1
self.closed_count += 1
# 每50个端口更新一次进度
if self.scanned_count % 50 == 0 or self.scanned_count == self.total_ports:
progress = (float(self.scanned_count) / self.total_ports) * 100
sys.stdout.write("\r\033[K")
sys.stdout.write(u"进度: {}/{} ({:.1f}%) | 开放端口: {}".format(
self.scanned_count, self.total_ports, progress, len(self.open_ports)))
sys.stdout.flush()
except Exception as e:
with self.lock:
self.scanned_count += 1
def worker(self):
"""
工作线程函数
"""
while not self.port_queue.empty():
port = self.port_queue.get()
self.scan_port(port)
self.port_queue.task_done()
def scan_all_ports(self):
"""
扫描所有端口 (1-65535)
"""
print "=" * 70
print u" Python 2.7 端口扫描器"
print u" 目标IP: {}".format(self.target_ip)
print u" 扫描范围: 1-65535 (所有端口)"
print u" 超时时间: {} 秒".format(self.timeout)
print u" 并发线程: {}".format(self.max_threads)
print u" 开始时间: {}".format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
print "=" * 70
print ""
# 初始化端口队列
self.total_ports = 65535
for port in range(1, 65536):
self.port_queue.put(port)
start_time = time.time()
# 创建并启动工作线程
print u"启动 {} 个扫描线程...".format(self.max_threads)
threads = []
for i in range(self.max_threads):
t = Thread(target=self.worker)
t.daemon = True
t.start()
threads.append(t)
# 等待所有任务完成
self.port_queue.join()
# 等待所有线程结束
for t in threads:
t.join(timeout=0.1)
elapsed_time = time.time() - start_time
# 显示最终结果
print "\n\n" + "=" * 70
print u" 扫描完成!"
print u" 结束时间: {}".format(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
print u" 总端口数: {}".format(self.total_ports)
print u" 开放端口: {}".format(len(self.open_ports))
print u" 关闭端口: {}".format(self.closed_count)
print u" 耗时: {:.2f} 秒".format(elapsed_time)
print "=" * 70
# 显示开放的端口列表
if self.open_ports:
print "\n" + "=" * 70
print u" 【开放的端口列表】"
print "-" * 70
print u"{:<10} {:<25} {}".format(u"端口", u"服务", u"状态")
print "-" * 70
for port, service in sorted(self.open_ports):
print u"{:<10} {:<25} {}".format(port, service, u"✓ 开放")
print "=" * 70
# 特别提示ADB端口
adb_open = False
for port, service in self.open_ports:
if port == 5555:
adb_open = True
break
if adb_open:
print u"\n✅ ADB端口 (5555) 已开放!"
print u" 可以执行: adb connect {}:5555".format(self.target_ip)
else:
print u"\n⚠️ ADB端口 (5555) 未开放"
print u" 请在小米盒子上先执行: adb tcpip 5555"
else:
print u"\n⚠️ 没有发现开放的端口"
print u" 可能的原因:"
print u" 1. 目标IP地址不正确"
print u" 2. 目标设备防火墙阻止了连接"
print u" 3. 目标设备没有运行任何网络服务"
return self.open_ports
def scan_common_ports(target_ip, timeout=1.5, max_threads=50):
"""
扫描常用端口 (快速扫描)
"""
common_ports = [
20, 21, 22, 23, 25, 53, 80, 110, 111, 135, 139, 143, 443, 445,
993, 995, 1080, 1433, 1521, 3306, 3389, 5432, 5555, 6379, 8080,
8443, 27017
]
print "=" * 70
print u" Python 2.7 端口扫描器 (快速模式)"
print u" 目标IP: {}".format(target_ip)
print u" 扫描端口: {} 个常用端口".format(len(common_ports))
print u" 超时时间: {} 秒".format(timeout)
print "=" * 70
print ""
open_ports = []
start_time = time.time()
for idx, port in enumerate(common_ports, 1):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((target_ip, port))
sock.close()
if result == 0:
try:
service = socket.getservbyport(port)
except:
service = 'unknown'
open_ports.append((port, service))
print u"✓ 端口 {} 开放 ({})".format(port, service)
# 显示进度
sys.stdout.write(u"\r进度: {}/{} ({:.1f}%)".format(idx, len(common_ports),
float(idx) / len(common_ports) * 100))
sys.stdout.flush()
except Exception as e:
pass
print "\n"
elapsed_time = time.time() - start_time
# 显示结果
print "=" * 70
print u" 扫描完成!"
print u" 开放端口: {} 个".format(len(open_ports))
print u" 耗时: {:.2f} 秒".format(elapsed_time)
print "=" * 70
if open_ports:
print "\n" + "-" * 70
print u"{:<10} {:<25}".format(u"端口", u"服务")
print "-" * 70
for port, service in sorted(open_ports):
print u"{:<10} {:<25}".format(port, service)
print "-" * 70
# 检查ADB端口
for port, service in open_ports:
if port == 5555:
print u"\n✅ ADB端口 (5555) 已开放!"
print u" 可以执行: adb connect {}:5555".format(target_ip)
break
else:
print u"\n⚠️ ADB端口 (5555) 未开放"
return open_ports
def get_user_input():
"""
获取用户输入
"""
print "\n" + "=" * 70
print u" 端口扫描器 - Python 2.7"
print "=" * 70
# 输入目标IP
target_ip = raw_input(u"\n请输入目标IP地址 [默认: 192.168.3.17]: ").strip()
if not target_ip:
target_ip = "192.168.3.17"
# 选择扫描模式
print u"\n请选择扫描模式:"
print u" 1. 快速扫描 (常用端口, 约27个)"
print u" 2. 完整扫描 (所有端口, 1-65535, 耗时较长)"
print u" 3. 自定义端口范围"
print u" 4. 扫描指定端口列表"
mode = raw_input(u"\n请输入选项 (1-4) [默认: 1]: ").strip()
if not mode:
mode = "1"
return target_ip, mode
def main():
"""
主程序
"""
try:
target_ip, mode = get_user_input()
# 设置超时时间
timeout_input = raw_input(u"设置超时时间(秒) [默认: 1.5]: ").strip()
if timeout_input:
try:
timeout = float(timeout_input)
except:
timeout = 1.5
else:
timeout = 1.5
# 设置线程数
thread_input = raw_input(u"设置并发线程数 [默认: 100]: ").strip()
if thread_input:
try:
max_threads = int(thread_input)
except:
max_threads = 100
else:
max_threads = 100
if mode == "1":
# 快速扫描常用端口
scan_common_ports(target_ip, timeout, min(max_threads, 50))
elif mode == "2":
# 完整扫描所有端口
scanner = PortScanner(target_ip, timeout, max_threads)
scanner.scan_all_ports()
elif mode == "3":
# 自定义端口范围
start_port = int(raw_input(u"输入起始端口 [默认: 1]: ").strip() or "1")
end_port = int(raw_input(u"输入结束端口 [默认: 1024]: ").strip() or "1024")
if start_port < 1:
start_port = 1
if end_port > 65535:
end_port = 65535
if start_port > end_port:
print u"错误: 起始端口不能大于结束端口"
return
print u"\n扫描端口范围: {}-{}".format(start_port, end_port)
print u"共 {} 个端口".format(end_port - start_port + 1)
scanner = PortScanner(target_ip, timeout, max_threads)
# 修改扫描范围
scanner.total_ports = end_port - start_port + 1
for port in range(start_port, end_port + 1):
scanner.port_queue.put(port)
scanner.scan_all_ports()
elif mode == "4":
# 指定端口列表
port_input = raw_input(u"输入端口列表, 用逗号分隔 (如: 22,80,443,5555): ")
try:
ports = [int(p.strip()) for p in port_input.split(",") if p.strip()]
if not ports:
print u"错误: 未输入有效端口"
return
print u"\n将扫描 {} 个指定端口".format(len(ports))
print u"端口列表: {}".format(ports)
# 使用快速扫描方式
open_ports = []
for port in ports:
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((target_ip, port))
sock.close()
if result == 0:
try:
service = socket.getservbyport(port)
except:
service = 'unknown'
open_ports.append((port, service))
print u"✓ 端口 {} 开放 ({})".format(port, service)
except:
pass
print "\n" + "=" * 70
print u"扫描完成! 开放端口: {} 个".format(len(open_ports))
if open_ports:
print u"端口列表:"
for port, service in sorted(open_ports):
print u" {} - {}".format(port, service)
# 检查ADB端口
for port, service in open_ports:
if port == 5555:
print u"\n✅ ADB端口 (5555) 已开放!"
print u" 可以执行: adb connect {}:5555".format(target_ip)
break
else:
print u"没有发现开放的端口"
except ValueError:
print u"错误: 端口格式无效"
return
else:
print u"无效的选项"
return
# 等待用户按任意键退出
print u"\n按 Enter 键退出..."
raw_input()
except KeyboardInterrupt:
print u"\n\n扫描被用户中断"
sys.exit(0)
except Exception as e:
print u"\n发生错误: {}".format(str(e))
sys.exit(1)
if __name__ == "__main__":
main()小米盒子3s
扫描后确实找不到5555端口的开放信息,但即便直接用双公usb连接,电脑上也没有出现设备列表,最后直接格机重置,重新开启ADB调试之后解决。

