2017-07-16 34 views
1

预警,问题可能更多地是由于缺少对bsub命令和登录shell的了解而不是python的Popen()通过python的subprocess.Popen()提交一个LSF脚本,而不使用shell = True


我试图使用subprocess.Popen()

pipe = subprocess.Popen(shlex.split("bsub < script.lsf"), 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

这似乎是一个子进程正常启动和命令执行的python脚本内提交LSF脚本,但我从BSUB得到一个错误的stderr命令显示“空白作业,作业未提交”。

我担心它与启动登录shell的子进程有关,因此我试图在Popen命令中使用shell=True来缓解该问题。

pipe = subprocess.Popen("bsub < script.lsf", shell=True, 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

这成功地按预期提交工作。所以我的问题是如何在不使用shell=True的情况下提交此作业?


我使用一些bsub options

pipe = subprocess.Popen(shlex.split("bsub -L /bin/sh < script.lsf"), 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

用相同的尝试 “空工作。工作没有提交。”错误返回。我觉得这与我正在寻找的内容非常接近,但我并不完全了解“登录shell的名称(必须指定绝对路径”),或许我在使用的系统上不是/bin/sh。有没有办法打印这条路径?

+0

顺便说一下,我认为'shlex.split()'在这里是非常糟糕的做法。当然,'''yourcommand','-f',filename]'会处理每一个可能的文件名,'shlex.split'('yourcommand -f%s'%文件名)'不会(对于* some *命令,其中额外的参数将被解析为代码,仍然可以允许注入攻击)。 –

+0

如果我正在关注,你会说用户在某种程度上使'filename =“文件的execute_bad_code”',那里的第二个命令“execute_bad_code”是一个注入攻击。因此,在'shlex.split('yourcommand -f%s'%'文件execute_bad_code“)vs'['yourcommand','-f','file execute_bad_code']','shlex.split()'运行攻击,而你的方法会抛出错误,阻止攻击? –

+1

好吧,没有那么多“抛出一个错误”(本身),因为“传递一个无效的文件名给'yourcommand',而'yourcommand'负责将错误视为错误” - 但是这比传递一个单独的更好参数'execute_bad_code'到'yourcommand',它可能实际上读作一个有效的参数,然后执行所需的操作。例如,如果你的命令是'sed',如果你注入一个'-e'后跟另一个参数,那么这个其他的参数将被解析为代码。 –

回答

3

<>不是你的命令的参数(在这种情况下是bsub),而是在shell启动命令前分别指向stdin或stdout的指令。

因此,适当的更换是指定此重定向与单独的参数Popen

pipe = subprocess.Popen(['bsub', '-L', '/bin/sh'], 
         stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
         stdin=open('script.lsf', 'r')) 
相关问题