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

时间:2016-07-22 16:13:25

标签: python

原始问题

我最近编写了一个小型Python脚本,其作用类似于服务器,长度为+/- 200行,并未分成多个文件。原始文件已被删除且没有备份,但进程本身仍在运行。

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

with open(__file__) as f:
    print f.read()

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

修改

到目前为止,我只能读取脚本的反汇编字节码,或者直接读出变量。我需要该脚本的主要原因主要是在删除脚本后丢失数据库密码后重新获取数据库密码。

为此,我必须安装使用pyrasitegdb。 这是我用来安装Ubuntu所有必需库的命令列表:

# Installing GDB and the libraries I had to use
root@hostname:~# apt-get install glibc-source
root@hostname:~# apt-get install libc6-dbg
root@hostname:~# apt-get install gdb

# Installing pyrasite
root@hostname:~# pip install pyrasite
root@hostname:~# echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

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

# Injecting a python IDLE shell into our process and retrieving variable values
root@hostname:~# ps aux | grep python
root      7589  0.0  1.3 230544 13296 pts/1    S    12:16   0:00 python main.py
root      7610  0.0  0.1  11284  1088 pts/0    S+   12:19   0:00 grep --color=auto python

root@hostname:~# pyrasite-shell 7589
Pyrasite Shell 2.0
Connected to 'python main.py'
Python 2.7.12 (default, Jul  1 2016, 15:12:24)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(DistantInteractiveConsole)

>>> 

由于我需要恢复数据库凭据,因此我只需将它们写入shell即可将其回显:

# There we go
>>> DB_USER
'root'

>>> DB_PASS
'********'

>>> DB_NAME
'SomeDatabase'

>>> DB_HOST
'127.0.0.1'

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

>>> import dis
>>> dis.dis(foo)

Disassembly of foo:
  7           0 LOAD_CONST               1 ('Hello world')
              3 PRINT_ITEM
              4 PRINT_NEWLINE
              5 LOAD_CONST               0 (None)
              8 RETURN_VALUE

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

2 个答案:

答案 0 :(得分:2)

您是否可以访问运行该进程的服务器?

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

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

HTH,

答案 1 :(得分:0)

Pyrasite可能是你最好的选择,但这是在黑暗中完全拍摄:尝试检查目录/proc/<pid>/fd/中的文件,其中pid是正在运行的脚本的进程ID。如果您非常幸运,您可以恢复pyc,然后您可以反编译。