0

我正在查看此脚本以在创建 ova 时禁用 shell=True。

它在 shell=True 时有效,但在 shell=False 时给我一个 TypeError。我很确定问题出在命令的这一部分" vi:\//" + username + ":" + encodedPassword + "@" + hostname"——因为当我从列表中删除这个元素(即命令)时,脚本会向前移动。我已经尝试过硬编码值,例如"vi:\//user:password@70.60.70.90"并且也删除了,但我仍然收到这种类型的错误。

Python版本是2.7

com1 = "/usr/bin/ovftool --acceptAllEulas --disableVerification --noSSLVerify --datastore=" + datastore +
           " --network=\"" + network + "\" --name=" + name + " " + ovalocation + " vi:\//" +  username +
          ":" + encodedPassword + "@" + hostname

#prior to disabling shell=True
# coms = subprocess.Popen(com1, shell=True,
  #                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)

# set shell=False - now it requires the command to be a list rather than a string.
coms = subprocess.Popen(com1.split(), shell=False,
                       stdout=subprocess.PIPE, stderr=subprocess.PIPE)

错误:

'unsupported operand type(s) for +: 'Popen' and 'str''

我究竟做错了什么?

编辑:我知道这是 vi 命令的问题,因为当"vi:\//" + username + ":" + encodedPassword + "@" + hostname"用硬编码替换时"hello",脚本会向前移动。

4

1 回答 1

-2

如果您使用了很多参数,则使用 astring而不是 a可能更容易list of arguments,您可以通过设置shell=True. 这也很容易调试,因为相同的命令(您应该打印)将以相同的方式从本机 shell 运行。

coms = subprocess.Popen(com1, shell=True,
                   stdout=subprocess.PIPE, stderr=subprocess.PIPE)

请记住,这shell=True可能存在安全问题,具体取决于它的运行方式。

于 2018-06-18T07:25:23.143 回答