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 尚未存在,因此这不应成为此项目的问题。