【发布时间】:2019-11-22 20:58:09
【问题描述】:
我有一段看起来像这样的代码。真正的代码当然要长得多。我已将其缩短以将其浓缩为这个想法。
#!/usr/bin/python
from sys import argv
class Base():
def whoami(self):
print(self.__class__.__name__)
def foo(self, a, b):
print(a+b)
class A(Base):
def bar(self, a):
print(a)
class B(Base):
def fizz(self, a, b):
print(a+b)
def main():
eval(argv[1] + '().' + argv[2] + '(' + ', '.join(argv[3:]) + ')')
if __name__ == "__main__":
main()
预期输出:
$ ./myScript.py A whoami
A
$ ./myScript.py B fizz 5 7
12
$ ./myScript.py B fizz '5' '7'
57
但最后一行的实际输出是:
$ ./myScript.py B fizz '5' '7'
12
引号没有通过。我的目标是能够从命令行轻松调用各种类方法进行调试。我不知道我的做法是不是一开始就错了。
是的,我知道eval 存在安全风险。我打算在代码投入生产时将其删除。
【问题讨论】:
-
引号永远不会被保留,因为这些是shell如何解释参数的“指令”。它通常用于在参数中添加空格,例如
command 'foo bar' qux,而不是command foo bar qux -
可能是this answer 会有所帮助。
-
您可以在参数中添加引号,例如
myscripty.py B fizz '"5"' '"7"'。 -
像这样使用
eval会让安全工程师心脏病发作,让渗透测试员在现场度过一天 -
@WillemVanOnsem 这是一个可行的解决方案。您可以将其发布为答案。
标签: python bash command-line-interface command-line-arguments