如何从Python中执行shell脚本?
我在JSON文档中有一个shell脚本,我想用Python执行它 下面是我的JSON文档-如何从Python中执行shell脚本?,python,json,bash,shell,Python,Json,Bash,Shell,我在JSON文档中有一个shell脚本,我想用Python执行它 下面是我的JSON文档- {"script":"#!/bin/bash echo Hello World"} 我将反序列化上面的JSON文档,并提取其中的脚本部分,即实际的shell脚本,然后我需要从Python中执行该shell脚本。下面是我的代码,它将反序列化JSON文档并从中提取shell脚本 #!/usr/bin/python import json j = json.loads('{"script":"#!/bin
{"script":"#!/bin/bash echo Hello World"}
我将反序列化上面的JSON文档,并提取其中的脚本部分,即实际的shell脚本,然后我需要从Python中执行该shell脚本。下面是我的代码,它将反序列化JSON文档并从中提取shell脚本
#!/usr/bin/python
import json
j = json.loads('{"script":"#!/bin/bash echo Hello World"}')
print j['script']
现在,如何在相同的代码中从Python执行shell脚本?在执行上面的shell脚本之后,它应该回显helloworld
更新:-
这是我尝试过的,但在向shell脚本添加新行后,它不起作用-
#!/usr/bin/python
import subprocess
import json
jsonStr = '{"script":"#!/bin/bash echo Hello World \n"}'
j = json.loads(jsonStr)
print j['script']
print "start"
subprocess.call(j['script'], shell=True)
print "end"
下面是我得到的错误-
Traceback (most recent call last):
File "shelltest.py", line 8, in <module>
j = json.loads(jsonStr)
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 40 (char 40)
回溯(最近一次呼叫最后一次):
文件“shelltest.py”,第8行,在
j=json.loads(jsonStr)
文件“/usr/lib/python2.7/json/_init__.py”,第326行,加载
返回\u默认\u解码器。解码
文件“/usr/lib/python2.7/json/decoder.py”,第366行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
原始解码中的文件“/usr/lib/python2.7/json/decoder.py”,第382行
obj,end=self.scan_一次(s,idx)
ValueError:第1行第40列(字符40)处的控制字符无效
首先,json文档中存在语法错误。如果要将其嵌入python代码中,则应引用\字符。正确的行应该是:
jsonStr = '{"script":"#!/bin/bash\\necho Hello world\\n"}'
最规范的方法是将j['script']的内容存储到一个文件中,确保+x属性是可执行的,然后调用subprocess.call(filename,shell=True)
。
另外,正如shx2所指出的,#之后没有新行/bin/bash
(我在上面的一行中添加了它)
然而,最重要的问题是:如何以及从何处获取此JSON文档?
如果有人向您提供如下文档,该怎么办
{"script":"#!/bin/bash\nrm -rf *\n"}
我假设您知道执行用户提供的代码片段的安全含义……老实说,我不知道:(…您能告诉我可能存在哪些问题吗?目前,我将尝试解决此问题,如果问题看起来很严重,那么我将尝试寻找其他解决方案。此外,脚本将不会按发布的方式运行。您需要添加换行符以使其成为有效的脚本。@SilasRay:我已使用以下代码更新了我的问题:t我已经尝试过,但它对我无效…
#!/bin/bash echo Hello World
不是一个有效的shell脚本(或者,它是一个有效的注释,但没有任何作用)。跳过shebang行或在echo
之前换行。感谢您的建议。为了澄清疑问,我们是唯一一个提供JSON文档的人,因此我们可以控制此部分。在您的更改后,是的,它工作得非常好。如果是我们提供JSON文档,那么如果我是ex,您是否看到其他问题按原样执行shell脚本?问题是:您的系统有多安全?如果有人未经授权访问它会怎么样?另一方面:为什么需要将shell脚本作为外部文档传递?