【渗透测试】使用 UV 简化 Python 工具和脚本管理
在 Python 开发领域,UV 作为一款新兴工具正迅速受到关注。它以高效、便捷的方式解决了 Python 生态系统中诸多痛点,包括包管理、项目管理、工具安装和虚拟环境管理等。尽管许多教程主要面向开发者,但对于信息安全从业者等 Python 的“用户”群体,UV 同样提供了强大的功能支持。本文将详细介绍如何使用 UV 来安装和运行 Python 应用及脚本,特别适合非开发者的用户。以下内容将涵盖 UV 的核心功能、安装方法、实际案例以及一些实用技巧。
什么是 UV?
UV 是由 Astral 公司开发的一款“下一代 Python 工具”,号称能够替代 pip
、pip-tools
、pipx
、poetry
、pyenv
、virtualenv
和 twine
等工具。其主要特点包括:
- 多功能合一:集成了包管理、项目管理、工具安装和虚拟环境管理等多种功能。
- 超高性能:比
pip
快 10-100 倍。 - 项目管理:提供全面的项目管理功能和统一的锁文件。
- 脚本运行:支持运行脚本和内联依赖元数据。
- Python 版本管理:能够安装和管理不同版本的 Python。
- 工具安装:支持运行和安装以 Python 包形式发布的工具。
- 兼容性:提供与
pip
兼容的命令行接口,兼顾性能与熟悉的操作体验。 - 工作空间支持:支持类似 Cargo 的工作空间,适合大型项目。
- 高效存储:通过全局缓存实现依赖去重,节省磁盘空间。
- 跨平台:支持 macOS、Linux 和 Windows。
- 灵活安装:可通过
curl
或pip
安装,无需 Rust 或 Python 环境。
本文将展示如何使用 UV 替代 pipx
安装工具、替代 venv
运行脚本,以及其他实用功能。
安装 UV
推荐通过以下 shell 脚本安装 UV:
curl -LsSf https://astral.sh/uv/install.sh | sh
也可以通过 pip
安装:
pip install uv
但需要注意的是,pip
安装可能存在某些限制,建议优先使用官方脚本安装。
指定 Python 版本
UV 支持通过 --python
参数指定所需的 Python 版本。例如:
uv --python 3.11
如果系统中没有指定版本,UV 会自动下载并安装(速度极快),无需手动管理。
安装工具
在过去,信息安全从业者常使用 pipx
安装工具(如 Impacket)以便将其脚本添加到系统路径中。现在,UV 的 uv tool
命令可以完全替代 pipx
,且语法相似但性能更优。
从 PyPI 安装
以下是从 PyPI 安装 Impacket 的示例:
uv tool install impacket
输出示例:
Resolved 21 packages in 537ms
Prepared 1 package in 522ms
Installed 21 packages in 20ms+ blinker==1.9.0+ cffi==1.17.1+ charset-normalizer==3.4.1+ click==8.1.8+ cryptography==42.0.8+ dnspython==2.7.0+ flask==3.1.0+ impacket==0.12.0...
Installed 62 executables: DumpNTLMInfo.py, Get-GPPPassword.py, ...
安装完成后,Impacket 的所有命令行工具(如 smbclient.py
、psexec.py
)都将添加到系统路径,随时可用。
从 GitHub 安装
UV 支持直接从 GitHub 仓库安装包。例如,安装 NetExec:
uv tool install git+https://github.com/Pennyw0rth/NetExec
输出示例:
Resolved 86 packages in 2.11s
Built impacket @ git+https://github.com/Pennyw0rth/impacket.git@4caf58fbebe2831b5708de932162a206f68121a1
Built netexec @ git+https://github.com/Pennyw0rth/NetExec@84d8f108c9c6b47cd2ba5fdede700dc7d2f5054c
Prepared 2 packages in 1.32s
Installed 86 packages in 73ms+ aardwolf==0.2.12+ aesedb==0.1.6...
Installed 4 executables: NetExec, netexec, nxc, nxcdb
从特定 GitHub 分支安装
若需安装特定分支,例如 BloodHound.py 的 bloodhound-ce
分支:
uv tool install git+https://github.com/dirkjanm/BloodHound.py.git@bloodhound-ce
输出示例:
Resolved 23 packages in 500ms
Installed 23 packages in 18ms+ bloodhound-ce==1.8.0...
Installed 1 executable: bloodhound-ce-python
从本地目录安装
对于本地包含 setup.py
、setup.cfg
或 pyproject.toml
的包,可以直接安装:
uv tool install .
输出示例:
Resolved 27 packages in 438ms
Built pywhisker @ file:///opt/pywhisker
Prepared 1 package in 892ms
Installed 27 packages in 52ms+ pywhisker==0.1.0...
Installed 1 executable: pywhisker
更新工具
使用 uv tool list
查看已安装的工具及其可执行文件:
uv tool list
输出示例:
black v25.1.0
- black
- blackd
bloodhound-ce v1.8.0
- bloodhound-ce-python
impacket v0.12.0
- DumpNTLMInfo.py
- Get-GPPPassword.py
...
更新所有工具:
uv tool upgrade --all
更新特定工具:
uv tool upgrade impacket
处理依赖问题
某些工具的元数据可能未准确列出所有依赖。例如,certipy-ad
需要 setuptools
,但未在依赖中声明,导致运行时出错:
certipy
Traceback (most recent call last):File "/home/oxdf/.local/bin/certipy", line 4, in <module>from certipy.entry import main...
ModuleNotFoundError: No module named 'pkg_resources'
解决方法是使用 --with
参数添加缺失依赖:
uv tool install --with setuptools certipy-ad
运行脚本
添加依赖元数据
对于未打包为 Python 包的脚本(仅包含 requirements.txt
),UV 提供了简便的运行方式。首先,使用 PEP 723 添加内联依赖元数据。
添加单个依赖:
uv add --script targetedKerberoast.py impacket
结果:
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "impacket",
# ]
# ///
添加 requirements.txt
中的所有依赖:
uv add --script targetedKerberoast.py -r requirements.txt
结果:
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "impacket",
# "ldap3",
# "pyasn1",
# "pycryptodome",
# "rich",
# ]
# ///
运行脚本
使用 uv run
运行脚本,UV 会自动创建虚拟环境并安装依赖:
uv run targetedKerberoast.py
首次运行会安装依赖(通常只需几十毫秒),后续运行直接复用虚拟环境。
设置 Shebang
通过修改脚本的 shebang 行,可以让脚本像二进制文件一样运行:
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "impacket",
# "ldap3",
# "pyasn1",
# "pycryptodome",
# "rich",
# ]
# ///
赋予执行权限并移至系统路径:
chmod +x targetedKerberoast.py
cp targetedKerberoast.py ~/.local/bin/
之后即可直接运行:
targetedKerberoast.py
本地包示例
以 spring_heapdumper.py
(依赖 pyhprof
)为例,假设 pyhprof
未在 PyPI 上发布:
- 克隆仓库:
git clone https://github.com/wdahlenburg/pyhprof
cd pyhprof
- 添加依赖:
uv add --script spring_heapdumper.py -r requirements.txt
- 运行脚本:
uv run spring_heapdumper.py
若需全局安装,修改 shebang 并添加 GitHub 依赖:
uv add --script spring_heapdumper.py 'pyhprof@git+https://github.com/wdahlenburg/pyhprof'
更新后的脚本:
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.12"
# dependencies = [
# "hexdump",
# "pyhprof",
# "trufflehogregexes",
# ]
# [tool.uv.sources]
# pyhprof = { git = "https://github.com/wdahlenburg/pyhprof" }
# ///
将其复制到 ~/.local/bin
,即可全局运行。
交互式终端(REPL)
UV 支持在 Python REPL 中加载特定依赖:
uv run --with js2py --python 3.11 python
示例输出:
Python 3.11.12 (main, Apr 9 2025, 04:04:00) [Clang 20.1.0 ] on linux
>>> import js2py
>>> js2py.__file__
'/home/oxdf/.cache/uv/archive-v0/BH7n3RO6K1FJ5Bk0Qj5Bo/lib/python3.11/site-packages/js2py/__init__.py'
总结
UV 是一款功能强大、性能卓越的 Python 工具管理解决方案,特别适合信息安全从业者等非开发者用户。它简化了工具安装、脚本运行和虚拟环境管理,极大地提升了工作效率。通过本文介绍的命令和技巧,您可以快速上手 UV,优化 Python 工作流。