Skip to content

show_banner() 与 stoplog() ​

🎨 辅助函数:启动时打印 banner,退出时清理资源。

📎 源码在线查看:r0capture.py#L111-L123(show_banner)

show_banner ​

python
def show_banner():
    colors = ['bright_red', 'bright_green', 'bright_blue', 'cyan', 'magenta']
    try:
        click.style('color test', fg='bright_red')
    except:
        colors = ['red', 'green', 'blue', 'cyan', 'magenta']
    try:
        columns = get_terminal_size().columns
        if columns >= len(banner.splitlines()[1]):
            for line in banner.splitlines():
                click.secho(line, fg=random.choice(colors))
    except:
        pass

逻辑 ​

  1. 色板探测:先 click.style('color test', fg='bright_red') 探测终端是否支持 bright 色,不支持则退回普通色板
  2. 宽度检查:get_terminal_size().columns 取终端宽度,仅当宽度 ≥ banner 最长行才打印(避免窄终端里折行难看)
  3. 逐行随机色:每行 click.secho 用 random.choice(colors) 选一种颜色
  4. 全程 try/except:任何异常都静默吞掉,保证 banner 失败也不影响抓包

ASCII art 的 r0capture 字样 + 项目地址 https://github.com/r0ysue/r0capture。

stoplog ​

python
def stoplog(signum, frame):
    print('You have stoped logging.')
    session.detach()
    if pcap:
        pcap_file.flush()
        pcap_file.close()
    exit()

注册 ​

python
signal.signal(signal.SIGINT, stoplog)
signal.signal(signal.SIGTERM, stoplog)

清理顺序 ​

  1. session.detach() —— 断开与设备端的脚本会话,触发 hook 卸载
  2. pcap_file.flush() —— 双保险,确保 pcap 落盘(虽然 open 时已是无缓冲)
  3. pcap_file.close() —— 关闭文件
  4. exit() —— 退出进程

相关文档 ​

基于 VitePress 构建 · 教学用途