如何在C语言中检测程序是否运行于Flatpak、AppImage等沙箱环境?
判断进程是否处于Flatpak或受限沙箱环境的方法
检查Flatpak专属环境变量
Flatpak会给每个运行的应用设置专属环境变量,直接读这些变量就能快速判定:- 优先看
FLATPAK_ID,只要这个变量存在且非空,百分百是在Flatpak沙箱里; - 另外
XDG_CURRENT_DESKTOP可能会变成Flatpak-GNOME这类带Flatpak前缀的值,但这个不如前者靠谱。
用C语言检测的示例:
#include <stdlib.h> #include <stdbool.h> bool is_in_flatpak() { return getenv("FLATPAK_ID") != NULL; }- 优先看
查看文件系统的特殊标记
各类沙箱都会在文件系统留下痕迹:- Flatpak应用的根目录下会有
/.flatpak-info文件,里面存着应用元数据,检查这个文件是否存在也能判断; - Snap沙箱可以看
SNAP环境变量,或者/snap目录是否存在; - 通用沙箱可以解析
/proc/self/cgroup文件,里面的路径通常会包含flatpak、snap、docker这类沙箱标识,不过需要写代码解析内容,稍微麻烦点。
- Flatpak应用的根目录下会有
通过权限限制间接判断
可以尝试执行一些沙箱里会被禁止的操作,间接验证:- 试着往
/usr/bin这类系统目录写文件,如果返回权限错误,大概率在沙箱里; - 尝试访问主机的硬件设备,比如
/dev/sda,如果访问失败也可能是沙箱限制;
注意:普通用户本来也可能没这些权限,所以最好结合前面的方法一起判断,别单独用这个。
- 试着往
其他沙箱的针对性检测
- Snap:检查
SNAP环境变量是否存在; - Docker:查看
/.dockerenv文件或DOCKER_CONTAINER环境变量; - AppImage:虽然不算严格沙箱,但可以通过
APPIMAGE环境变量判断。
- Snap:检查
内容的提问来源于stack exchange,提问作者AggelosT
相关产品推荐
相关产品推荐

