Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从外部获取正在运行的Python脚本的源代码 原始问题_Python - Fatal编程技术网

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

从外部获取正在运行的Python脚本的源代码 原始问题,python,Python,我最近写了一个小Python脚本,它的作用类似于服务器,它有+/-200行长,并且没有被分成多个文件。原始文件已被删除,没有备份,但进程本身仍在运行 我知道下面的代码将读取当前脚本的源代码,但是假设文件仍然存在(并且该代码必须在包含脚本的脚本中) 我想知道的是,是否有可能在没有原始文件的情况下获得无限运行脚本的源代码。我目前正在使用一个基于Ubuntu Linux的服务器,但希望能有一个跨平台的解决方案。多谢各位 编辑 到目前为止,我只能读取脚本的反汇编字节码,或者直接读取变量。我需要该脚本的

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

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

我想知道的是,是否有可能在没有原始文件的情况下获得无限运行脚本的源代码。我目前正在使用一个基于Ubuntu Linux的服务器,但希望能有一个跨平台的解决方案。多谢各位


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

要做到这一点,我必须安装使用。 下面是我用来为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空闲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,但我设法获得了所需的内容。

您有权访问正在运行进程的服务器吗

那也许你可以试试

(免责声明:我本人从未使用过)


HTH,

您有权访问正在运行进程的服务器吗

那也许你可以试试

(免责声明:我本人从未使用过)


HTH,

吡咯石可能是您最好的选择,但这里有一个完全不可能的办法:尝试检查目录
/proc//fd/
中的文件,其中pid是您正在运行的脚本的进程id。如果您非常幸运,您可以恢复一个
pyc
,然后可以对其进行反编译。

吡咯石可能是您最好的选择,但这里有一个总的解决方案:尝试检查目录
/proc//fd/
中的文件,其中pid是正在运行的脚本的进程id。如果你很幸运,你可以恢复一个
pyc
,然后进行反编译。

另外,如果你使用的是cpython,它将是内存中的字节码(.pyc),据我所知,原始源代码已经消失了。下面是wim的建议:尝试将进程内存转储到磁盘,在转储中找到字节码并在其上运行pycdc?只是大声想一想……另外,如果您使用的是cpython,它的副本将是内存中的字节码(.pyc),据我所知,原始源代码已经消失了。按照wim的建议:尝试将进程内存转储到磁盘,在转储中找到字节码并在其上运行pycdc?我可以完全访问服务器(根级别),谢谢,我会检查的。我认为这是个好主意。一旦获得了一个pyrasite外壳,您就可以沿着
dir(sys.modules[\uuuu name\uuuu])
的思路运行一些东西,以获取作用域中定义的函数和变量,并反编译前者的代码,但是如何获得模块作用域代码的句柄呢?我可以完全访问服务器(根级别),谢谢,我会查的我觉得这是个好主意。一旦获得了一个吡咯石外壳,您就可以沿着
dir(sys.modules[\uuuu name\uuuu])
的路线运行一些东西,以获得范围中定义的函数和变量,并反编译前者的代码,但是如何获得模块作用域代码的句柄呢?Python不保持源代码或字节码文件的打开状态。Python不保持源代码或字节码文件的打开状态。
>>> 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