我运行了命令ps -ef
并发现以下内容:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:30 ? 00:00:00 socat tcp-l:1024,reuseaddr,f
root 7 1 0 12:30 ? 00:00:00 socat EXEC:/usr/bin/nano /ho
testuser 10 7 0 12:30 ? 00:00:00 /usr/bin/nano /home/testuser/testfile
root 141 1 0 13:44 ? 00:00:00 socat tcp-l:1024,reuseaddr,f
ctf 142 141 0 13:44 pts/1 00:00:00 /bin/bash
ctf 148 142 0 13:49 pts/1 00:00:00 ps -ef
所以我想查看测试文件的内容,但我没有完整路径,也找不到它(假设它被隐藏了,找不到)。
我去/proc/10/fd
并发现了以下内容:
total 0
dr-x------ 2 testuser testuser 0 Mar 3 12:33 .
dr-xr-xr-x 9 testuser testuser 0 Mar 3 12:33 ..
lrwx------ 1 testuser testuser 64 Mar 3 12:33 0 -> /dev/pts/0
lrwx------ 1 testuser testuser 64 Mar 3 12:33 1 -> /dev/pts/0
l-wx------ 1 testuser testuser 64 Mar 3 12:33 2 -> 'pipe:[300396]'
lrwx------ 1 testuser testuser 64 Mar 3 12:33 3 -> 'socket:[300398]'
lrwx------ 1 testuser testuser 64 Mar 3 12:33 4 -> 'socket:[300399]'
我已阅读如何复制已删除的文件,但此文件(“测试文件”)并未被删除。它只是无处可寻。我的目标是根据使用 nano 打开此文件的过程来读取此文件。
我怎样才能解决这个问题?
编辑:该文件之前没有保存并重新打开。想象一下用 nano 打开一个新文件,在其中写入一些内容,而进程仍在运行。目标是转储当前存在的内容。我读到你可以终止 nano 并创建一个 .save 文件,但我找不到这样的文件。也许我做错了什么。
答案1
大多数文本编辑器不会一直保持文件打开;它们会将整个文件读入内存并关闭。你无法轻易解决这个问题——你可以转储进程的整个内存(例如使用gcore
gdb 动态使用或检查它),但找到加载的文本缓冲区的确切位置会因编辑器的不同而有很大差异。通常它不会是一个单独的缓冲区,而是一组不一定按顺序排列的单独行。
(例如,您可以strings
针对该进程生成的核心转储运行它;针对从“新鲜”的“纳米”进程生成的另一个转储运行它;并使用工具来过滤仅在第一个转储中但不在两个转储中出现的字符串。)