首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux上拦截文件操作

在Linux上拦截文件操作
EN

Stack Overflow用户
提问于 2016-10-20 18:06:27
回答 2查看 1K关注 0票数 2

我正在开发一个云平台来渲染视觉效果和动画。我们接受各种格式的场景描述渲染,并将图像输出返回给用户。处理后端是Linux。有时,我们会收到在Windows上生成的场景描述,因此我们会得到类似于'C:\path\to\file.mb‘的路径。我编写了一个Linux共享库来拦截各种文件系统调用,并修改Linux能够理解的'/C/path/ to /file‘的路径。我使用LD_PRELOAD机制在“真实的”函数之前插入我的函数,它工作得很好.除非它没有。

例如,这个命令:

LD_PRELOAD=/home/robert/path_fix.so .所以呈现-s 1 -e 1 C:\path\to\test_scene_03_vray.ma

不会找到test_scene_03_vray.ma。这也不起作用:

LD_PRELOAD=/home/robert/path_fix.so .所以回波测试> C:\path\to\test.txt

我一直在使用ltrace来找出调用哪些函数时引用路径名称,但是这些示例没有显示在我的跟踪中:

-f -C -S -o ltrace.out呈现C:\path\to\test_scene_03_vray.ma

除了ltrace之外,还有其他工具可以让我看到哪些函数调用被调用吗?

以下是我已经覆盖的内容列表:

  • fopen
  • 自由开放
  • 开迪尔
  • 打开
  • creat
  • 开胃
  • 状态
  • lstat
  • 福斯塔特
  • __lxstat
  • __xstat
  • mkdir
  • mkdirat
  • 解链接
  • 脱钩
  • 访问
  • 证照
  • 重命名
  • 重命名
  • renameat2
  • chmod
  • 福莫达特
  • 查城
  • 爱城
  • 福肖纳特
  • 链接
  • 链接
  • name_to_handle_at
  • 读链接
  • 重新链接
  • 符号链接
  • 辛连
  • 伦迪尔
  • 克迪尔

还有更多我在这里错过的功能吗?我试着实现所有需要

const char *filepath

作为一种争论。

附带问题:这似乎已经解决了一个问题.是否有将Windows路径转换为unix友好路径的库或其他方法?请记住,呈现应用程序是第三方专有二进制文件,所以我不能修改它们。

谢谢你的建议!

EN

回答 2

Stack Overflow用户

发布于 2016-10-20 18:43:11

是的,还有其他函数,如64位函数open64().还有一些函数,如__open()

在64位Centos 7服务器上,对于open,我得到:

代码语言:javascript
复制
nm -D /lib64/libc.so.6  | grep open
0000000000033d70 T catopen
00000000003c0b80 B _dl_open_hook
000000000006b140 T fdopen
00000000000ba4c0 W fdopendir
00000000000755d0 T fmemopen
000000000006ba00 T fopen
000000000006ba00 W fopen64
000000000006bb60 T fopencookie
0000000000073700 T freopen
0000000000074b60 T freopen64
00000000000eb7a0 T fts_open
0000000000022220 T iconv_open
000000000006b140 T _IO_fdopen
0000000000077230 T _IO_file_fopen
0000000000077180 T _IO_file_open
000000000006ba00 T _IO_fopen
000000000006d1d0 T _IO_popen
000000000006cee0 T _IO_proc_open
0000000000131580 T __libc_dlopen_mode
00000000000e82a0 W open
00000000000e82a0 W __open
00000000000ed0f0 T __open_2
00000000000e82a0 W open64
00000000000e82a0 W __open64
00000000000ed110 T __open64_2
00000000000e8330 W openat
00000000000e8410 T __openat_2
00000000000e8330 W openat64
00000000000e8410 W __openat64_2
00000000000f7860 T open_by_handle_at
00000000000340b0 T __open_catalog
00000000000b9f70 W opendir
00000000000f12b0 T openlog
0000000000073ea0 T open_memstream
00000000000731c0 T open_wmemstream
000000000006d1d0 T popen
0000000000130630 W posix_openpt
00000000000e6ec0 T posix_spawn_file_actions_addopen

例如,在Linux上,这个C代码很可能工作得很好:

代码语言:javascript
复制
int fd = __open( path, O_RDONLY );

您也不会捕获静态链接的进程,或者那些直接发出系统调用(如open )的进程。

票数 1
EN

Stack Overflow用户

发布于 2016-11-20 22:04:56

从技术上讲,您可以使用k探针来拦截调用,但是如果文件不太多或生成动态,我建议创建符号链接。它更安全,更简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40161522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档