从内存中恢复 Python 脚本,我搞砸了

Recover Python script from memory, I screwed up

救命,我搞砸了。

我有一个有点复杂的 python 脚本,目前正在 运行ning 中 window 到 Ubuntu 服务器。

我不小心用另一个 putty window 覆盖了脚本,所以硬盘上的副本现在不见了,但脚本仍然 运行 在第一个 window 中从内存中读取].

这发生在我有机会 运行 我为此文件夹的备份之前。

有没有办法从第一个 putty window 的内存中获取脚本(目前是 运行ning)?

我没有停止脚本,我猜一旦我停止它它就会永远消失。

我能否以某种方式(一些热键)将它发送到后台进程,然后从内存转储或其他东西中收集脚本。我假设从脚本 运行ning.

的实际 window 中必须发生这样的事情

如果我能找回 .py 就好了,我听说 Python 在 运行ning 之前编译脚本,如果是这样的话,人类可读的部分可能会消失。

唉,今天真是压力山大

感谢您的帮助,Mark.using

据我所知,Python 不会将源代码保存在内存中,并且评论中提供的方法只会使可执行文件保持活动状态,而不是脚本。转储程序的内存可能会让你得到字节码,但我不知道这可能需要多少努力。

相反,我会首先尝试一种非Python 特定的方法,我已经成功地使用它来恢复我不小心删除的 Python 源。这假定文件系统是 ext2/3/4 并且您具有 root 访问权限。

第一步(在任何恢复中)显然是要尽量避免在系统上写入任何文件,以免覆盖您正在寻找的数据。在家庭系统上,如果可能的话,我可能会亲自将分区重新挂载为只读,以避免进行更多的写入操作。我听说其他人建议快速拔掉插头,这可能会阻止 OS/disk 缓存被写入磁盘,并且如果你 [=31] 可能会为你节省一些额外的数据(甚至阻止删除) =]真的快点。在远程系统上,这些都不是一个好主意(除非数据真的很重要并且您可以将磁盘运送给您或其他东西)因为如果某些东西突然变成只读,系统可能不喜欢它。

第二步是执行debugfs /dev/sdXY,其中/dev/sdXY是被删除文件所在的分区。在提示中,说 blocks /path/to/the/directory/the/removed/file/was/in。然后,为目录中的其他现有文件提供 blocks 命令路径。现在,通过说 quit 退出程序,希望你看到的块号彼此接近。如果目录是旧的并且块号分散,则从最近文件的块号开始。 (也就是说,一个最近被修改的文件尽可能接近被删除文件的最后修改时间)我们将尝试扫描目录中其他文件附近的分区内容,假设文件存储在附近给他们。执行 dd if=/dev/sdXY bs=4096 skip=BLOCKNUMBER count=COUNT |grep -C APPROXIMATE_LINE_COUNT_OF_THE_REMOVED_FILE WORD,其中 BLOCKNUMBER 是第一个块号之前某处的数字,COUNT 是要搜索的合适的块数,WORD 是包含在源文件。如果您没有得到任何东西,请尝试在另一个文件的块附近钓鱼。如果时间不是问题,并且您可以想到只出现在已删除文件中的字符串(这样您就不会得到太多误报),您可以跳过所有这些并使用 [=19= 扫描整个磁盘].

另一种方法(你应该先尝试另一种方法)可能对你不起作用,因为 IIRC 最近版本的 Ubuntu(可能还有其他系统)默认配置内核以阻止访问到 /dev/mem,正在尝试扫描内存中的文件。只需执行 grep -a WORD -C LINECOUNT /dev/mem 扫描内存而不是分区。 (如果您在表单字段中写了很长的文本,然后误点击并且浏览器清空了该字段,这也可以节省您的时间)

这个问题我迟了两年,但这就是我恢复脚本的方式。 在运行脚本之后,在pycache文件夹中,会出现与脚本同名的.pyc(字节码)文件。您可以使用名为 uncompyle 的第三方模块反编译此 .pyc 文件以取回源代码。唯一的缺点是您的评论会丢失。但有总比没有好。

这是一个迟到的答案,但对于每个使用 IDE eclipse(其他人有类似的东西)的人来说,可以使用 eclipse 历史轻松恢复他们的 *.py 或其他文件。 eclipse 文档中的更多内容: https://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.user%2Ftasks%2Ftasks-87b.htm 甚至更好: Eclipse, recover recent history