问题描述
使用 opensnoop.py 中的 iovisor/bcc,我试图扩展 ebpf 代码以处理从相对路径中提取完整路径。
例如,运行 opensnoop.py 并在另一个运行 cat anything.txt
的终端中,opensnoop 中的输出将显示相对文件名,而不是绝对路径:
$ sudo ./venv/bin/python bcc/tools/opensnoop.py | grep anything.txt &
$ cat anything.txt 2>/dev/null
19536 cat -1 2 anything.txt
$ cat /tmp/anything.txt 2>/dev/null
19540 cat -1 2 /tmp/anything.txt
我已经叙述了 opensnoop.py 中的代码块,我应该考虑修改,并添加一些类似于以下的逻辑:
// .. existing code
bpf_probe_read_user(&data.fname,sizeof(data.fname),(void *)filename);
data.id = id;
data.ts = tsp / 1000;
data.uid = bpf_get_current_uid_gid();
data.flags = flags; // EXTENDED_STRUCT_MEMBER
data.ret = ret;
// new code to handle relative paths:
if (data.fname[0] != '/' && data.fname[0] != '\\0') {
// TODO if filename doesn't start with a /,need to convert relative path to abs
struct fs_struct *fs = ((struct task_struct *) bpf_get_current_task())->fs;
// TODO: get pwd path from fs->pwd
struct path *pwd_path = &fs->pwd // ?
// TODO: call bpf_d_path(pwd_path,buf,sz)
// TODO: update data.fname to insert buf pwd)
}
events.perf_submit(ctx,&data,sizeof(data));
我遇到的问题是 TODO 部分,似乎没有很多/任何使用新 bpf_d_path
辅助函数的好例子
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)