我正在尝试转换以获取执行的命令,该命令将传递给print语句。例如:
print "exec(raw_input())"
我可以以某种方式运行exec()吗?
答案 0 :(得分:1)
这样做
command = raw_input("Command: ")
exec(command)
你为什么要打印它?如果这不是你想要的,那就更清楚了
答案 1 :(得分:0)
你要求的东西很简单吗
aString = "raw_input()"
print "exec(" + aString + ")"
exec(aString)
答案 2 :(得分:0)
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
答案 3 :(得分:0)
从您应用的代码中,您似乎正在寻找一个魔术字符串,当Python将该字符串传递给print
语句时,您可以运行任意代码。
没有这样的已知字符串。你可以尝试很长的字符串,只是在明显的边界上,寻找传统的堆栈和堆溢出情况,但如果你在Python X.Y.Z中找到它,很可能它已经在X.Y.Z + 1中修复了。
如果Python脚本实际上在您的字符串上执行exec
或eval
,那么这很容易被利用;如果只是做print
,内容甚至都不会被编译,更不用说了;它们只是一根古老的字符串。字符串碰巧看起来像exec
这样看似危险的东西是无关紧要的;它比利用Python打印字符串"rm -rf /"
更具可利用性。
当然,如果您可以安排一个Python解释器的输出作为另一个解释器中的交互式会话的输入,那么无论您获得第一个要打印的解释器,都将在第二个解释器中执行...但是无论如何,你不需要字符串中间的exec
。
答案 4 :(得分:0)
默认情况下,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
>
答案 5 :(得分:0)
我猜这就是你要找的东西?
>>> exec("x = raw_input()")
23
>>> x
'23'
>>>