我正在尝试转换以执行传递给 print 语句的命令。例如:
print "exec(raw_input())"
我可以以某种方式运行 exec() 吗?
这样做
command = raw_input("Command: ")
exec(command)
你为什么要打印它?如果这不是你要找的,请更清楚
我想这就是你要找的?
>>> exec("x = raw_input()")
23
>>> x
'23'
>>>
您是否要求一些简单的东西,例如
aString = "raw_input()"
print "exec(" + aString + ")"
exec(aString)
from __future__ import print_function
def foo(x):
exec x
print = foo
print("exec(raw_input())")
运行
% test.py
kaboom
结果在:
NameError: name 'kaboom' is not defined
从您应用的标签来看,您似乎正在寻找一个魔术字符串,当 Python 将该字符串传递给 print
语句时,该字符串将允许您运行任意代码。
没有这样的已知字符串。你可能会尝试非常长的字符串,就在明显的边界上,寻找传统的堆栈和堆溢出情况,但如果你在Python X.Y.Z中找到一个,很可能它已经在X.Y.Z + 1中修复了。
如果Python脚本实际上正在对字符串进行exec
或eval
,那当然很容易被利用;如果它只是做一个print
,内容甚至永远不会被编译,更不用说运行了;它们只是一个普通的旧字符串。字符串碰巧有看起来像exec
这样危险的东西这一事实是无关紧要的;它并不比让 Python 打印字符串"rm -rf /"
更容易被利用。
当然,如果你可以安排一个 Python 解释器的输出作为另一个解释器中交互式会话的输入,那么你让第一个解释器打印的任何内容都将在第二个解释器中执行......但在这种情况下,无论如何都不需要字符串中间的exec
。
print 语句默认写入 sys.stdout,sys.stdout 就像一个文件。 您可以使用 write 方法创建一个看起来像文件的类,该方法将由 print 语句调用。 我整理了一个脚本来演示这一点,print_exec.py。 另请注意,如果 print 语句中的代码包含 print 本身,则这不起作用。 即,print "print 'foo'"
不起作用。 因此,在示例中,我必须打印到 sys.stderr 才能实际看到正在发生的事情。 希望这有帮助。
print_exec.py
import sys
class file_like(object):
def write(self, x):
exec(x)
sys.stdout = file_like()
y = "exec(raw_input())"
print "exec(y)"
运行print_exec.py的示例:
>python print_exec.py
print "import sys; print >> sys.stderr, 'hi'"
hi
>