从外部获取正在运行的Python脚本的源代码

Par*_*xis 5 python

原问题

\n\n

我最近写了一个小的 Python 脚本,它的作用就像一个服务器,它有 +/- 200 行长,并且没有分成多个文件。原始文件已被删除并且没有备份,但该进程本身仍在运行。

\n\n

我知道以下代码将读出当前脚本的源代码,但是假设该文件仍然存在(并且该代码必须位于包含的脚本中)。来源

\n\n
with open(__file__) as f:\n    print f.read()\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想知道的是,是否有可能在不再拥有原始文件的情况下获得无限运行脚本的源代码。我目前正在使用基于 Ubuntu Linux 的服务器,但如果有跨平台解决方案,我将不胜感激。谢谢

\n\n
\n\n

编辑

\n\n

到目前为止,我\xe2\x80\x99只能读取脚本的反汇编字节码,或者直接读取变量。我需要该脚本的主要原因是为了在删除脚本时丢失数据库密码后找回数据库密码。

\n\n

为此,我必须安装使用gdb的Pyrasite。\nHere\xe2\x80\x99 是我用来安装 Ubuntu 所需的所有库的命令列表:

\n\n
# Installing GDB and the libraries I had to use\nroot@hostname:~# apt-get install glibc-source\nroot@hostname:~# apt-get install libc6-dbg\nroot@hostname:~# apt-get install gdb\n\n# Installing pyrasite\nroot@hostname:~# pip install pyrasite\nroot@hostname:~# echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope\n
Run Code Online (Sandbox Code Playgroud)\n\n

安装完所有内容后,我使用 Pyrasite 将 Python IDLE shell 注入正​​在运行的进程中,这样我就可以与代码进行交互。

\n\n
# Injecting a python IDLE shell into our process and retrieving variable values\nroot@hostname:~# ps aux | grep python\nroot      7589  0.0  1.3 230544 13296 pts/1    S    12:16   0:00 python main.py\nroot      7610  0.0  0.1  11284  1088 pts/0    S+   12:19   0:00 grep --color=auto python\n\nroot@hostname:~# pyrasite-shell 7589\nPyrasite Shell 2.0\nConnected to \'python main.py\'\nPython 2.7.12 (default, Jul  1 2016, 15:12:24)\n[GCC 5.4.0 20160609] on linux2\nType "help", "copyright", "credits" or "license" for more information.\n(DistantInteractiveConsole)\n\n>>> \n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我需要取回数据库凭据,因此我只是通过将它们写入 shell 来回显它们:

\n\n
# There we go\n>>> DB_USER\n\'root\'\n\n>>> DB_PASS\n\'********\'\n\n>>> DB_NAME\n\'SomeDatabase\'\n\n>>> DB_HOST\n\'127.0.0.1\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

dis尽管脚本的源代码已经消失,我们仍然可以使用我们想要的方法来反编译内存中的对象并将其传递给它。我也尝试使用该inspect模块,但尝试调用inspect.getsourcelines()只会导致IOError

\n\n
>>> import dis\n>>> dis.dis(foo)\n\nDisassembly of foo:\n  7           0 LOAD_CONST               1 (\'Hello world\')\n              3 PRINT_ITEM\n              4 PRINT_NEWLINE\n              5 LOAD_CONST               0 (None)\n              8 RETURN_VALUE\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您想要返回的方法中有任何文本,您可以在那里找到它。我无法将此代码转换回可用的 python,但我设法得到了我需要的东西。

\n

Mar*_*cel 3

您有权访问运行该进程的服务器吗?

那么也许你可以尝试http://pyrasite.readthedocs.io/en/latest/CLI.html

(免责声明:我自己从未使用过)

哈特哈,