gee*_*ley 8 package-management command-line license apt software-installation
我想在使用 apt 和 flatpak 安装之前检查软件包的许可证。
这在允许非 FLOSS 许可证的 PPA/自定义存储库中特别有用,并且也可能具有非 FLOSS 依赖项。
这一定是可能的,因为 Discover 显然可以做到这一点,至少对于官方软件包来说是这样(尽管对于自定义存储库来说可能是不可能的,因为它们不在 Launchpad 上?)。至少 Flathub 在软件包页面上确实有许可证信息。
但我想通过命令行检查它。
snap info $PKG_NAME可用于检查已卸载的快照包的许可证 -好的apt info $PKG_NAME/apt-cache show $PKG_NAME没有(总是?)有许可证信息flatpak info $PKG_ID仅适用于已安装的软件包flatpak search $PKG_NAME -vv花了太长时间基本上没有显示任何信息理想情况下,应该有一种简单的方法来检查隐私政策,但我认为这要求太多了......
有关的:
apt-cache并且apt info似乎没有许可证信息我找到了一种方法来获取 APT 中 Ubuntu 存储库和 Flathub 的许可证。感谢你们俩为我指明了正确的方向!当然,这些并不能处理所有极端情况,但对于我个人的使用来说已经足够了。脚本的结果如下:
这将获取版权文件(感谢@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;'
Run Code Online (Sandbox Code Playgroud)
这将使用(未记录?)Flathub API 来获取 JSON 元数据,其中包含字段,该字段似乎与文件中的标签projectLicense相对应。站点会返回缺少的应用程序 ID,因此在本例中它将显示为许可证,如果存在任何空值,脚本将以非零值退出。每个包应该有一个许可证条目,因此如果提供多个包,输出将按顺序匹配。<project_license>*.metainfo.xmlnull
/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'
Run Code Online (Sandbox Code Playgroud)
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.*'
Run Code Online (Sandbox Code Playgroud)