在 Mac OSX 上,如何打开进程仍打开的已删除文件?

在 Mac OSX 上,如何打开进程仍打开的已删除文件?
b2-osx108v8-01:~ bamboo$ lsof -p 264
COMMAND PID   USER   FD     TYPE            DEVICE  SIZE/OFF     NODE NAME
<lines removed>
java    264 bamboo   20w     REG               1,2    240906 14883372 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML/SimbaProcessManager.log.0
<lines removed>

/Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML目录已被删除,但该文件仍然由我们的守护进程打开。我怎样才能看到这个日志呢?在 Linux 上,我会使用/proc/264/fd/20,但这似乎在 OSX 上不可用。

答案1

<编辑>

如果这是 Linux,你还可以使用一个gdb技巧。但事实证明我们可以在 OS X 上排除这个技巧,因为它依赖于/dev/fd/( /proc/self/fd/) 的 Linux 特定行为。

我知道的就这些,没有什么积极的建议。

</编辑>

它可能会变得非常可怕,但你考虑过吗gdb?一个包中的两个奇迹:一个 C 解释器,以及一种将代码注入到您选择的进程中的方法!显然你也可以用它来调试。

幸运的是,C 标准库还包含一个解释脚本的函数。您的平台上的脚本语言可能比 C 更方便编写...

我想到了一个用于lessOS X 的脚本。这是一个脆弱的 hack,可以根据以下内容返回日志文件的开头OS X、bash:较少对打开的文件描述符起作用,而 cat 则不然使用 读取整个日志文件后less,FD 位置应该位于文件末尾,这希望是我们干预之前的原始位置。

<编辑>但只有当文件也被打开以供读取时它才有效。根据您的lsof输出,该文件仅打开用于写入。</EDIT>

gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF

我转换了返回类型,因为否则我的系统会抱怨它不知道 的返回类型system()。想必这也意味着它也不确定参数类型,所以这听起来已经是一个好主意了。

当我在我的 Linux 机器上尝试使用system()它来操作文件描述符时,它以某种方式起作用了......一次。我不保证它永远有效:)。例如,从技术上讲,如果程序正在执行信号处理程序或其system()本身,则不能保证这是安全的。 (system()不是保证“可重入”的少数函数之一)。

答案2

我还没有验证icat在块设备上操作时行为是否正确,也没有验证 Mac OS 有块设备,也没有验证执行以下操作是否会吃掉您的数据。

或许可以使用icat /dev/MY-DEVICE 14883372.该icat命令由 The Sleuth Kit® (TSK) 提供。

https://github.com/sleuthkit/sleuthkit/wiki/HFS

(您已经提到了 Linux。这个想法的灵感来自debugfs,它有一个命令可以对 Linux 文件系统 ext2/ext3/ext4 执行相同的操作)。

相关内容