Python 如何将存在于变量中的shell脚本传递给函数

Python 如何将存在于变量中的shell脚本传递给函数,python,Python,我试图将一系列shell脚本命令传递给python函数 我以前在子流程内调用script.sh文件,但现在我希望在函数中包含脚本本身,因此我不必担心后续脚本 给出一个想法的过于简单的例子: def myfunc() script = "ls -la; cd /; ls -la" runscript_output = subprocess.call(script) print runscript_output 这样做正确吗 我看到一些示例,其中shell命令被包装在EOF

我试图将一系列shell脚本命令传递给python函数

我以前在子流程内调用script.sh文件,但现在我希望在函数中包含脚本本身,因此我不必担心后续脚本

给出一个想法的过于简单的例子:

def myfunc()
    script = "ls -la; cd /; ls -la"
    runscript_output = subprocess.call(script)
    print runscript_output
这样做正确吗


我看到一些示例,其中shell命令被包装在EOF包装器中;尽管我不确定原因。

在这个用例中使用
shell=True
。另外,我强烈建议将脚本文本设置为常量,并将任何变量替换作为单独的参数:

script_text=r'''
ls -la
cd "$1" || exit
ls -la
'''

# for /bin/sh
def myfunc_sh():
    runscript_output = subprocess.check_output(
        [script_text,       # /bin/sh script text here
         '/'],              # add values for $1 and on as list elements
        shell=True)
    print runscript_output

# for /bin/bash
def myfunc_bash():
    runscript_output = subprocess.check_output(
        ['bash',            # interpreter to run
         '-c', script_text, # script to invoke
         '_',               # value for $0
         '/'])              # add values for $1 and on as extra list elements here
    print runscript_output

遵循这种做法——将传递给shell的内容作为脚本文本保持不变——可以避免出现shell注入漏洞,其中数据被解析为代码。

在本用例中使用
shell=True
。另外,我强烈建议将脚本文本设置为常量,并将任何变量替换作为单独的参数:

script_text=r'''
ls -la
cd "$1" || exit
ls -la
'''

# for /bin/sh
def myfunc_sh():
    runscript_output = subprocess.check_output(
        [script_text,       # /bin/sh script text here
         '/'],              # add values for $1 and on as list elements
        shell=True)
    print runscript_output

# for /bin/bash
def myfunc_bash():
    runscript_output = subprocess.check_output(
        ['bash',            # interpreter to run
         '-c', script_text, # script to invoke
         '_',               # value for $0
         '/'])              # add values for $1 and on as extra list elements here
    print runscript_output

遵循这种做法——将传递给shell的内容作为脚本文本保持不变——可以避免出现shell注入漏洞,其中数据被解析为代码。

Re:EOF wrappers,可能是另一种语言——Python不支持heredocs。EOF wrappers可能是bash重定向。您应该让您的函数接受命令作为参数,这样您就可以在其他地方使用它了。@CharlesDuffy:该示例在python函数中运行的字符串中使用它;类似于string=“cat>”之类的东西;我相信这就是shell脚本语法是的,heredocs是shell语法,但是其他语言(包括Ruby)也有这种语法。Re:“EOF wrappers”,这可能是另一种语言——Python不支持heredocs。EOF wrappers可能是bash重定向。您应该让您的函数接受命令作为参数,这样您就可以在其他地方使用它了。@CharlesDuffy:该示例在python函数中运行的字符串中使用它;类似于string=“cat>”之类的东西;我相信这就是shell脚本语法是的,herdocs是shell语法,但是其他语言(包括Ruby)也有这种语法;这主要是在我的解析套件中本地运行的代码;我从分光计的输出中获取了大量日志并对其进行了操作,因此我认为注入恶意代码的风险非常低。试试看!有些东西不必故意恶意破坏工作。在我以前的一位雇主那里,由于缓冲区溢出,文件名中出现了随机垃圾流,包括一个环绕星号的空格和一个写得很差的脚本(其中作者遗漏了一些其他必要的引用),我们丢失了多TB的账单数据试图删除该文件。顺便说一句——请注意,使用
shell=True
运行的任何内容都将被
/bin/sh
调用,而不是
bash
ksh
或诸如此类。因此,您可能会考虑一些类似于“代码>(BASH)、‘-C’、Script文本、‘-S’+ + AguMutTyList</代码>之类的东西,如果您想编写代码由一个更有能力的shell执行。我是为bash编写的,所以我必须将其更改为注释中的示例。实际上,使用
-s
对于
-c
并不是绝对必要的;您可以简单地为
$0
提供一个显式占位符,例如
\
,并在后面放置其他位置参数(对于
$1
等)。我在这里修改了答案;这主要是在我的解析套件中本地运行的代码;我从分光计的输出中获取了大量日志并对其进行了操作,因此我认为注入恶意代码的风险非常低。试试看!有些东西不必故意恶意破坏工作。在我以前的一位雇主那里,由于缓冲区溢出,文件名中出现了随机垃圾流,包括一个环绕星号的空格和一个写得很差的脚本(其中作者遗漏了一些其他必要的引用),我们丢失了多TB的账单数据试图删除该文件。顺便说一句——请注意,使用
shell=True
运行的任何内容都将被
/bin/sh
调用,而不是
bash
ksh
或诸如此类。因此,您可能会考虑一些类似于“代码>(BASH)、‘-C’、Script文本、‘-S’+ + AguMutTyList</代码>之类的东西,如果您想编写代码由一个更有能力的shell执行。我是为bash编写的,所以我必须将其更改为注释中的示例。实际上,使用
-s
对于
-c
并不是绝对必要的;您可以简单地为
$0
提供一个显式占位符,例如
\
,并在后面放置其他位置参数(对于
$1
等)。我在这里修改了答案。