尝试利用PYTHON扫描电视盒子ip地址上的开放端口

起因是闲鱼购入了一台小米盒子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调试之后解决。

标签: python

移动端可扫我直达哦~

推荐阅读

thumbnail 2026-01-08

让python程序后台运行的方案

前台运行的程序影响了服务器的使用,但又希望该程序能一直运行,所以就考虑在后台跑这个PYTHON服务。使用&在Linux/Mac终端后台运行python your_script.py &程序会在后台运行按回车返回终端使用jobs...

建站相关 python

thumbnail 2025-12-27

利用python批量下载图片

在贴吧找到一组图片,记录了皇骑隐藏宝物的地址,但手机端访问的时候总是提示要求下载贴吧的app,博主用的64g内存的手机,光一个千牛就占了12g,实在没有太多空间来安装多余的app,所以就想把图片转载到自己的博客上。首先是审查元素提取图...

少儿编程 python

thumbnail 2025-10-09

python扫描电话手表的开放端口

手头上有台闲置的米兔2S电话手表,固件版本是T13开头的,想看看ip地址有没有什么端口是开放便于调试的,所以利用python扫了一下,程序利用deepseek生成,结果扫一遍下来用了10分钟,答案是一个端口也没有开放:import s...

少儿编程 python

thumbnail 2025-10-09

PYTHON 通过按键来中止循环程序运行

用python实现了一个类似按键精灵的功能,在一个可修改的pdf里依次输入序列号并打印,序列号多的时候结束程序很难被点到,所以想设置一个快捷键来中止程序。程序基与python 2.7.18, 需要调用 keyboard 库,如果没有的...

少儿编程 python

thumbnail 2025-07-23

利用python2.7.18解密pdf文件

之前介绍过在线移除pdf密码的方式,但在线的方式多少有些安全隐患,而且当pdf过大时,下载的速度也堪忧。所以就补充一个利用python来解密的方案。博主的python版本是python2.7.18。解密需要用到python的PyPDF...

少儿编程 python

thumbnail 2025-07-03

利用python拆分本地pdf文件的方法

之前分享过利用在线文件格式转换工具来拆分PDF文件的方法,昨天遇到一个尴尬的问题,利用在线转换的时候,上传速度很快,拆分也没有报错,然而拆分后的压缩包总计32M,而下载速度却只有可怜的30k,这就有点不能忍了。于是在下载进度条第一次报...

少儿编程 python

thumbnail 2025-03-29

利用python压缩扫描图片格式的pdf文件

扫描了一份52页的银行流水,需要提交到某个网站,但该站点限制最大文件不超过10M,博主的扫描件大小总计38M,用夸克浏览器扫描得到,即便选择瘦身模式,最终的大小也超过了30M。之前有找过压缩pdf的在线站点,博主在博客内也有提及,有兴...

少儿编程 python

thumbnail 2025-01-07

利用python3查找文件夹内所有文件内容

学习wp主题的时候看到了几个自定义的action,因为主题文件较多,随手点了几个都不对,逐渐红温,忽然想起来python可能会有对应的模块吧,毕竟“人生苦短,我用python”嘛。要说ai搜索这东西,方便确实是方便,一搜索直接把示例程...

少儿编程 python

thumbnail 2024-06-28

python中print函数的格式控制符号

%字符:标记转换说明符的开始;转换标志:- 表示左对齐;+ 表示在转换值之前要加上正负号;“” (空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充;最小字段宽度:转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽...

少儿编程 python

thumbnail 2024-06-27

小鸟数据python语法速查表

Python对大小写敏感,使用半角符号,变量命名采用“_”、数字或字母的组合,建议采用规范的命名方式,比如使用驼峰式命名方式,编程过程中多写注释。基础语法数据类型:整数,浮点,字符串,逻辑值运算符号:+,-,*,/, % , // ,...

少儿编程 python