预警,问题可能更多地是由于缺少对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
。有没有办法打印这条路径?
顺便说一下,我认为'shlex.split()'在这里是非常糟糕的做法。当然,'''yourcommand','-f',filename]'会处理每一个可能的文件名,'shlex.split'('yourcommand -f%s'%文件名)'不会(对于* some *命令,其中额外的参数将被解析为代码,仍然可以允许注入攻击)。 –
如果我正在关注,你会说用户在某种程度上使'filename =“文件的execute_bad_code”',那里的第二个命令“execute_bad_code”是一个注入攻击。因此,在'shlex.split('yourcommand -f%s'%'文件execute_bad_code“)vs'['yourcommand','-f','file execute_bad_code']','shlex.split()'运行攻击,而你的方法会抛出错误,阻止攻击? –
好吧,没有那么多“抛出一个错误”(本身),因为“传递一个无效的文件名给'yourcommand',而'yourcommand'负责将错误视为错误” - 但是这比传递一个单独的更好参数'execute_bad_code'到'yourcommand',它可能实际上读作一个有效的参数,然后执行所需的操作。例如,如果你的命令是'sed',如果你注入一个'-e'后跟另一个参数,那么这个其他的参数将被解析为代码。 –