libgetargv 是一个库,允许您获取传递给 macOS 上另一个正在运行的进程的参数。它的目的是提供与在 Linux 上从 /proc/<pid>/cmdline 读取大致相同的功能。在 macOS 上,这是通过解析 KERN_PROCARGS2 系统调用的输出完成的,但由于忽略了传递给目标进程的前导空参数的可能性,因此 KERN_PROCARGS2 的实现经常是不正确的。这个软件包是 libgetargv 库的 Swift 绑定。
默认情况下,libgetargv 只能看到以相同用户身份运行的进程,因此请确保您的进程以所需的用户身份运行 (setuid、launchd.plist、sudo) 或可以提升权限;请注意,安全地提升权限是极其复杂的,并且将成为 macOS 上特权提升攻击的目标,因此如果您走这条路,请格外小心,最好推迟到用户根据需要为您提升权限。
需要 macOS,因为这是一个 macOS 特定的 sysctl,即使是 BSD 也没有实现它。您的系统必须支持 sysctl 和 KERN_PROCARGS2,这可能意味着 macOS 10.3 或更高版本,但我没有测试过低于 10.7 的版本。您还需要一个非古老的 clang(需要 c99),否则您必须使用 CC、EXTRA_CPPFLAGS 和 EXTRA_CFLAGS 覆盖编译器标志。
要创建 getargv.swift
libgetargv 安装到您的系统(见下文)。swift build,或者Package.swift 文件的 Package 中的 dependencies 数组中添加一个条目:.package(url: "https://github.com/getargv/getargv.swift", from: "0.0.5"),并在您的 target 的 dependencies 数组中添加一个条目:.product(name: "Cgetargv", package: "getargv.swift")要访问 libgetargv,请注册适当的赞助层级。
克隆 libgetargv 仓库:git clone https://github.com/getargv/getargv.git。
运行 make install_dylib 默认会将库安装到 /usr/local/ 前缀;您可以使用 PREFIX make 变量更改安装位置:make PREFIX=/opt install_dylib。
我正在努力构建二进制工件,以便无需编译即可安装,使用 pkg 安装程序,但是即使完成了,根据您的系统,仍然可能需要从源代码编译;例如,如果您使用自定义的 PID_MAX 值构建了自己的 xnu 内核。
我已经在 macOS 10.7-13 上构建了 libgetargv,仅使用 CLT 包,而不是完整的 Xcode 安装。如果您需要覆盖变量,请在 make 命令中执行此操作,例如:make EXTRA_CPPFLAGS=-DMACRO EXTRA_CFLAGS=-std=c17 dylib。由于 10.6 流行时 swift 尚未存在,因此这不应成为此项目的问题。