Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.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中执行shell脚本?_Python_Json_Bash_Shell - Fatal编程技术网

如何从Python中执行shell脚本?

如何从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

我在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/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脚本作为外部文档传递?