getargv

Swift CI

libgetargv 是一个库,允许您获取传递给 macOS 上另一个正在运行的进程的参数。它的目的是提供与在 Linux 上从 /proc/<pid>/cmdline 读取大致相同的功能。在 macOS 上,这是通过解析 KERN_PROCARGS2 系统调用的输出完成的,但由于忽略了传递给目标进程的前导空参数的可能性,因此 KERN_PROCARGS2 的实现经常是不正确的。这个软件包是 libgetargv 库的 Swift 绑定。

权限

默认情况下,libgetargv 只能看到以相同用户身份运行的进程,因此请确保您的进程以所需的用户身份运行 (setuidlaunchd.plistsudo) 或可以提升权限;请注意,安全地提升权限是极其复杂的,并且将成为 macOS 上特权提升攻击的目标,因此如果您走这条路,请格外小心,最好推迟到用户根据需要为您提升权限。

系统要求

需要 macOS,因为这是一个 macOS 特定的 sysctl,即使是 BSD 也没有实现它。您的系统必须支持 sysctlKERN_PROCARGS2,这可能意味着 macOS 10.3 或更高版本,但我没有测试过低于 10.7 的版本。您还需要一个非古老的 clang(需要 c99),否则您必须使用 CCEXTRA_CPPFLAGSEXTRA_CFLAGS 覆盖编译器标志。

构建 getargv.swift

要创建 getargv.swift

安装 libgetargv

要访问 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 内核。

构建 libgetargv

我已经在 macOS 10.7-13 上构建了 libgetargv,仅使用 CLT 包,而不是完整的 Xcode 安装。如果您需要覆盖变量,请在 make 命令中执行此操作,例如:make EXTRA_CPPFLAGS=-DMACRO EXTRA_CFLAGS=-std=c17 dylib。由于 10.6 流行时 swift 尚未存在,因此这不应成为此项目的问题。