SemClone/osslili
GitHub: SemClone/osslili
osslili 是一款高性能的开源许可证与版权检测工具,通过三层检测机制精准识别本地源码中的许可证信息,助力软件供应链合规管理。
Stars: 7 | Forks: 1
# OSS 许可证与版权检测器 (osslili)
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.python.org/downloads/)
[](https://pypi.org/project/osslili/)
一款用于识别本地源码中许可证和版权信息的高性能工具。生成详细的许可证检测证据,支持所有 700 多个 SPDX 许可证标识符,为 SEMCL.ONE 生态系统提供全面的合规性文档支持。
## 功能
- **三层许可证检测**:Dice-Sørensen 相似度、TLSH 模糊哈希和正则表达式模式匹配
- **基于证据的输出**:精确的文件路径、置信度得分和检测方法
- **700 多个 SPDX 许可证**:全面支持所有 SPDX 许可证标识符
- **SEMCL.ONE 集成**:与 purl2notices、ospac 及其他生态系统工具无缝协作
### 工作原理
#### 三层许可证检测系统
该工具使用复杂的多层方法以实现最高的准确性:
1. **第一层:Dice-Sørensen 相似度与 TLSH 确认**
- 使用 Dice-Sørensen 系数比较许可证文本(97% 阈值)
- 使用 TLSH 模糊哈希确认匹配,防止误报
- 对标准 SPDX 许可证实现 97-100% 的准确率
2. **第二层:TLSH 模糊哈希匹配**
- 使用 Trend Micro 局部敏感哈希进行变体检测
- 捕获 MIT-0、BSD-2-Clause 与 BSD-3-Clause 等许可证变体
- 为所有 700 多个 SPDX 许可证预计算哈希值
3. **第三层:模式识别**
- 基于正则表达式检测许可证引用和标识符
- 从注释、文件头和文档中提取
#### 其他检测方法
- **包元数据扫描**:从 package.json、composer.json、pyproject.toml 等文件中检测许可证
- **版权提取**:带有验证和去重功能的高级模式匹配
- **SPDX 标识符检测**:在源文件中查找 SPDX-License-Identifier 标签
## 安装说明
```
pip install osslili
```
用于开发:
```
git clone https://github.com/SemClone/osslili.git
cd osslili
pip install -e .
```
## 快速入门
```
# 快速默认扫描 (LICENSE 文件 + metadata + docs) - 推荐
osslili .
# 全面深度扫描 (所有源文件)
osslili . --deep
# 生成包含 license 证据的 SBOM
osslili ./my-project -f cyclonedx-json -o sbom.json
```
## 用法
### 扫描模式
osslili 提供了三种针对不同用例优化的扫描模式:
#### **默认模式**(推荐)
快速实用 - 扫描 LICENSE 文件、包元数据和文档。
```
# 扫描: LICENSE*、README*、*.md、*.txt、package.json、go.mod 等
osslili ./my-project
```
**扫描内容:**
- **LICENSE 文件**:LICENSE、COPYING、NOTICE、COPYRIGHT 等(28 种以上模式)
- **文档**:README、CHANGELOG、CONTRIBUTING(.txt、.md、.rst、.adoc)
- **包元数据**:package.json、go.mod、Cargo.toml、pom.xml 等(40 个以上文件)
- **覆盖范围**:12 种以上的包生态系统(npm、Python、Go、Java、.NET、Rust、Ruby、PHP、Swift、Dart、Elixir、Scala)
**性能**:在 ffmpeg-6.0(4,000 多个文件)上耗时约 8 秒
**适用场景**:日常开发、CI/CD 流水线、快速许可证检查
#### **深度模式**(全面)
彻底扫描所有源文件以查找嵌入的许可证。
```
# 扫描所有文件: .py、.js、.java、.c、.go 等
osslili ./my-project --deep
```
**性能**:在 ffmpeg-6.0 上耗时约 5 分钟(比默认模式慢 40 倍)
**适用场景**:法律合规审查、查找嵌入的许可证头
#### **严格模式**(最快)
仅扫描 LICENSE 文件 - 最大速度。
```
# 仅扫描 LICENSE 文件 (无 metadata,无 README)
osslili ./my-project --license-files-only
```
**性能**:在 ffmpeg-6.0 上耗时约 7 秒
**适用场景**:当您只需要已声明的许可证时
### CLI 用法
```
# 默认扫描 - 快速且智能 (推荐)
osslili /path/to/project
# 深度扫描 - 全面但较慢
osslili /path/to/project --deep
# 严格扫描 - 仅限 LICENSE 文件
osslili /path/to/project --license-files-only
# 生成不同的输出格式
osslili ./my-project -f kissbom -o kissbom.json
osslili ./my-project -f cyclonedx-json -o sbom.json
osslili ./my-project -f cyclonedx-xml -o sbom.xml
# 使用并行处理进行扫描 (默认: 4 个线程)
osslili ./my-project --threads 8
# 有限深度扫描 (仅深达 2 层)
osslili ./my-project --max-depth 2
# 解压并扫描 archives
osslili package.tar.gz --max-extraction-depth 2
# 使用 caching 加快重复扫描
osslili ./my-project --cache-dir ~/.cache/osslili
# 检查版本
osslili --version
# 将结果保存到文件
osslili ./my-project -o license-evidence.json
# 使用自定义配置和详细输出
osslili ./src --config config.yaml --verbose
# Debug 模式用于详细日志记录
osslili ./project --debug
```
### 输出示例
```
{
"scan_results": [{
"path": "./project",
"license_evidence": [
{
"file": "/path/to/project/LICENSE",
"detected_license": "Apache-2.0",
"confidence": 0.988,
"detection_method": "dice-sorensen",
"category": "declared",
"match_type": "text_similarity",
"description": "Text matches Apache-2.0 license (98.8% similarity)"
},
{
"file": "/path/to/project/package.json",
"detected_license": "Apache-2.0",
"confidence": 1.0,
"detection_method": "tag",
"category": "declared",
"match_type": "spdx_identifier",
"description": "SPDX-License-Identifier: Apache-2.0 found"
}
],
"copyright_evidence": [
{
"file": "/path/to/project/src/main.py",
"holder": "Example Corp",
"years": [2023, 2024],
"statement": "Copyright 2023-2024 Example Corp"
}
]
}],
"summary": {
"total_files_scanned": 42,
"declared_licenses": {"Apache-2.0": 2},
"detected_licenses": {},
"referenced_licenses": {},
"copyright_holders": ["Example Corp"]
}
}
```
### 库用法
```
from osslili import LicenseCopyrightDetector
# 初始化 detector
detector = LicenseCopyrightDetector()
# 处理本地目录
result = detector.process_local_path("/path/to/source")
# 处理单个文件
result = detector.process_local_path("/path/to/LICENSE")
# 生成不同的输出格式
evidence = detector.generate_evidence([result])
kissbom = detector.generate_kissbom([result])
cyclonedx = detector.generate_cyclonedx([result], format_type="json")
cyclonedx_xml = detector.generate_cyclonedx([result], format_type="xml")
# 直接访问结果
for license in result.licenses:
print(f"License: {license.spdx_id} ({license.confidence:.0%} confidence)")
print(f" Category: {license.category}") # declared, detected, or referenced
for copyright in result.copyrights:
print(f"Copyright: © {copyright.holder}")
```
## 输出格式
该工具输出显示以下内容的 JSON 证据:
- **文件路径**:发现许可证的位置
- **检测到的许可证**:许可证的 SPDX 标识符
- **置信度**:检测的置信度(0.0 到 1.0)
- **匹配类型**:许可证的检测方式(license_text、spdx_identifier、license_reference、text_similarity)
- **描述**:关于所发现内容的人类可读描述
## 配置
创建一个 `config.yaml` 文件:
```
similarity_threshold: 0.97
max_recursion_depth: 10
max_extraction_depth: 10
thread_count: 4
cache_dir: "~/.cache/osslili"
custom_aliases:
"Apache 2": "Apache-2.0"
"MIT License": "MIT"
```
## 文档
- [用户指南](docs/USAGE.md) - 全面的用法示例和配置
- [API 参考](docs/API.md) - Python API 文档和示例
- [SPDX 更新](docs/SPDX.md) - 如何更新 SPDX 许可证数据
- [性能基准测试](docs/BENCHMARK_SCANCODE.md) - 与其他工具的比较
## 贡献
我们欢迎您的贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 以了解有关以下内容的详细信息:
- 行为准则
- 开发环境设置
- 提交 Pull Request
- 报告问题
## 支持
如需支持和提问:
- [GitHub Issues](https://github.com/SemClone/osslili/issues) - Bug 报告和功能请求
- [文档](https://github.com/SemClone/osslili) - 完整的项目文档
## 许可证
Apache License 2.0 - 详情请参阅 [LICENSE](LICENSE) 文件。
## 作者
请参阅 [AUTHORS.md](AUTHORS.md) 获取贡献者列表。
*隶属于用于全面 OSS 合规性和代码分析的 [SEMCL.ONE](https://semcl.one) 生态系统的一部分。*
标签:Dice-Sørensen相似度, Linux安全, Python, SEMCL.ONE, SPDX, TLSH模糊哈希, 云安全监控, 合规性审查, 安全合规, 开源合规, 开源许可协议识别, 无后门, 正则表达式匹配, 源码分析, 版权检测, 知识产权保护, 网络代理, 许可证提取, 逆向工具, 静态分析