如何在安装之前通过命令行检查 apt 包的许可证?

如何在安装之前通过命令行检查 apt 包的许可证?

我想检查软件包的许可证使用 apt 和 flatpak 安装。
这在允许非 FLOSS 许可证的 PPA/自定义存储库中特别有用,并且可能还具有非 FLOSS 依赖项。

这肯定是可能的,因为 Discover 显然可以做到这一点,至少对于官方软件包来说是这样(尽管对于自定义存储库来说可能是不可能的,因为它们不在 Launchpad 上?)。至少 Flathub 在软件包页面上有许可证信息。
但我想通过命令行检查它。

  • snap info $PKG_NAME可用于检查已卸载的 snap 包的许可证 -好的
  • apt info $PKG_NAME/apt-cache show $PKG_NAME不(总是?)有许可信息
  • flatpak info $PKG_ID仅适用于已安装的软件包
  • flatpak search $PKG_NAME -vv花了太长时间才显示基本没有信息

理想情况下,应该有一种简单的方法来检查隐私政策,但我想这要求太多了......

有关的:

答案1

在通过 apt 或 flatpak 安装软件包之前,我可能会检查软件包的许可证信息,这些软件包管理器及其存储库提供元数据的方式存在一些限制。您可以执行以下操作:

对于 APT 来说:

APT 存储库并不总是在软件包元数据中有一个用于许可证详细信息的部分。这就是为什么您在使用 info $PKG_NAME 或 apt cache show $PKG_NAME 等命令时可能并不总是能看到许可证信息。但是,您有时可以通过检查字段或访问软件包主页或元数据中链接的文档来找出许可证。

  1. 查看软件包信息;使用 info $PKG_NAME(通常不是标准命令)尝试使用 apt show $PKG_NAME 来访问相关详细信息,其中可能包括项目网站或文档的链接,您可以在其中找到许可细节。

  2. 手动调查;前往包元数据中提到的主页或项目 URL 来搜索许可信息。

  3. Debian 软件包跟踪器;如果您正在处理来自存储库的软件包,请考虑查看 Debian 软件包跟踪器网站 https;//tracker.debian.org/ 以获取潜在的许可数据。

关于Flatpak:

当谈到 Flatpak 时,定位许可证信息对于遵循元数据实践的应用程序来说通常更为简单;

  1. 请参阅 Flathub 网站;如果您正在寻找一种命令行方式,但发现 Flathub 网站包含许可信息,您仍然可以通过获取软件包的网页详细信息并扫描它以获取许可证详细信息来利用它。您可以使用 curl。Wget 以及 grep 或类似工具来提取许可证。

  2. 关于使用 Flatpak CLI 安装的应用程序;尽管您提到 flatpak info $PKG_ID 仅对已安装的软件包有效,但在安装后它很有用。但是,对于安装验证,此限制仍然存在。

  3. 增强的 Flatpak 搜索:虽然 flatpak search $PKG_NAME -vv 没有帮助,但直接从已知源存储库(如 Flathub)检索元数据可以是一种解决方法。没有直接命令来获取未安装软件包的许可证信息,但考虑到 Flathub 上提供了元数据,编写一个 Web 查询脚本来解析这些详细信息可以是一种解决方法。

希望对你有帮助。谢谢。

答案2

这是仅适用于官方存储库的一个内衬,就像您在评论中提到的那样:

function lic() { apt-get download --print-uris $1 | sed "s/.*\(\/pool.*\)_.*.deb'.*/https:\/\/changelogs.ubuntu.com\/changelogs\1\/copyright/" | wget -q -i - -O - ; }

用于:

lic pkg_source_name

如果我要支持所有类型的存储库,这条路似乎很长。因此,目前的缺陷如下:

  • 使用“源包名称”而不是“包名称”
  • 不适用于 PPA、外部存储库和旧版本(因为它们有单独的站点)

答案3

我找到了一种方法来获取 APT 和 Flathub 中 Ubuntu 存储库的许可证。感谢你们两位为我指明了正确的方向!当然,这些方法并不能处理所有极端情况,但对于我个人使用来说已经足够了。脚本的结果如下:

APT:Ubuntu 存储库

这将获取版权文件(感谢@user.dz),过滤以 开头的行License:,然后在每行上显示唯一值。任何获取错误(例如不存在的包)都应使脚本返回非零退出代码。如果提供了多个包,则结果将汇总,没有重复。文件中许可证的顺序将保留,因此主项目的许可证是大概列出的第一个(尽管我不会依赖它)。

/usr/local/bin/licenses-apt-ubuntu

#!/usr/bin/bash
# Public Domain - see https://unlicense.org
set -e ; set -o pipefail
apt-get download --print-uris "$@" |
sed "s|.*\(/pool.*\)_.*\.deb'.*|https://changelogs.ubuntu.com/changelogs\1/copyright|" |
wget -q -i - -O - |
grep -Po '^License: \K.*' |
perl -ne '$seen{$_}++ or print;'

Flatpak:Flathub

这将使用(未记录的?)Flathub API 来获取 JSON 元数据,其中包含字段projectLicense,该字段似乎与文件<project_license>中的标签相对应*.metainfo.xml。网站会返回null缺少的应用程序 ID,因此在这种情况下将显示为许可证,如果有任何空值,脚本将以非零值退出。每个软件包都应该有一个许可证条目,因此如果提供了多个软件包,则输出将按顺序匹配。

/usr/local/bin/license-flathub

#!/usr/bin/bash
# Public Domain - see https://unlicense.org
set -e ; set -o pipefail
echo "$@" |
perl -pe 's|\s*(\S+)\s*|https://flathub.org/api/v1/apps/$1\n|g' |
wget -q -i - -O - |
jq -er '.projectLicense'

折断

Snap Store 的等效脚本,仅供参考。它只是从信息中提取许可证字段的值。与 flathub 一样,它支持具有匹配输出顺序的多个包。但是,无效条目被排除在外,并且当它不匹配至少 1 个有效包时,它会以非零值退出。

/usr/local/bin/license-snap

#!/usr/bin/bash
# Public Domain - see https://unlicense.org
set -e ; set -o pipefail
snap info "$@" | grep -Po '^license:\s*\K.*'

相关内容