我正在查看此脚本以在创建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"
时。
答案 0 :(得分:-2)
如果您使用了大量参数,可以通过设置string
来更轻松地使用list of arguments
而不是shell=True
。这也很容易调试,因为相同的命令(你应该打印)将以相同的方式从本机shell运行。
coms = subprocess.Popen(com1, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
请记住,shell=True
可能存在安全问题,具体取决于运行方式。