【问题标题】:Recover Python script from memory, I screwed up从内存中恢复 Python 脚本,我搞砸了
【发布时间】:2015-09-10 00:09:03
【问题描述】:

帮帮忙,我搞砸了。

我有一个有点复杂的 python 脚本,它当前在 Ubuntu 服务器的腻子窗口中运行。

我不小心用另一个腻子窗口覆盖了脚本,所以硬盘上的副本现在已经消失了,但脚本仍然在第一个窗口中从内存中运行。

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

有没有办法从第一个腻子窗口的内存中获取脚本(当前正在运行)?

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

我能否以某种方式将它发送到后台进程(一些热键),然后从内存转储或其他东西中收集脚本。我假设这样的事情必须在运行脚本的实际窗口中发生。

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

叹息,今天压力很大。

感谢您的帮助,Mark.using

【问题讨论】:

标签: python recovery


【解决方案1】:

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

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

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

第二步是执行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 是源文件中包含的单词。如果您没有得到任何东西,请尝试在另一个文件的块附近钓鱼。如果时间不是问题,并且您可以想到仅在已删除文件中出现的字符串(因此您不会得到太多误报),您可以跳过所有这些并使用grep -a WORD -C LINECOUNT /dev/sdXY 扫描整个磁盘。

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

【讨论】:

  • 谢谢,Alsksi:这就是我想从记忆中恢复的想法。不幸的是,那台机器上还有很多其他的磁盘活动,而且在我注意到这个错误之前已经有一段时间了,所以从磁盘恢复脚本的几率很小。我想我将不得不重写脚本。有一线希望,我有一些我想使用的增强功能,现在我有机会了。 (就像我无事可做,哈,哈。)感谢您抽出宝贵时间发布此内容,如果我偶然发现类似问题,我会将其加入书签以供将来参考。
【解决方案2】:

对于这个问题,我已经晚了两年,但这就是我恢复脚本的方式。 运行脚本后,在pycache文件夹中,会出现与脚本同名的.pyc(字节码)文件。您可以使用名为 uncompyle 的第三方模块来反编译此 .pyc 文件以获取源代码。唯一的缺点是你的 cmets 会迷路。但有总比没有好。

【讨论】:

    【解决方案3】:

    这是一个较晚的答案,但对于使用 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

    【讨论】:

      猜你喜欢
      • 2021-09-22
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多