call() 中忽略的参数
Parameters ignored in call()
我正在尝试从 Python 程序中调用 ssh
,但它似乎忽略了参数。
这是 Python 程序:
#!/usr/bin/python
from subprocess import Popen, PIPE, call
vm_name = 'vmName with-space'
vm_host = 'user@192.168.21.230'
def ssh_prefix_list(host=None):
if host:
# return ["ssh", "-v", "-v", "-v", host]
return ["scripts/ssh_wrapper", "-v", "-v", "-v", host]
else:
return []
def start(vm_name, vm_host=None): # vm_host defaults to None
print "vm_host = ", vm_host
vbm_args = ssh_prefix_list(vm_host) + ["VBoxManage", "startvm", vm_name]
print vbm_args
return call(vbm_args, shell=True)
start(vm_name, vm_host)
包装器打印参数的数量、它们的值,并调用 ssh。
#!/bin/bash
echo Number of arguments: $#
echo ssh arguments: "$@"
ssh "$@"
这是输出。
$ scripts/vm_test.py
vm_host = stephen@192.168.21.230
['scripts/ssh_wrapper', '-v', '-v', '-v', 'stephen@192.168.21.230', 'VBoxManage', 'startvm', 'atp-systest Clone']
Number of arguments: 0
ssh arguments:
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-w local_tun[:remote_tun]] [user@]hostname [command]
这是在 Python 2.5.
我想可能是这样:
prefix_list = ssh_prefix_list(vm_host)
prefix_list.append(["VBoxManage startvm %s" % vm_name])
但是我强烈建议使用 paramiko - 它使事情变得容易得多。
当您使用 shell=True
时,您需要传入一个字符串,而不是参数列表。尝试-
return call(' '.join(vbm_args), shell=True)
此外,您应该考虑从头开始构建字符串,而不是列表。
当您使用 shell=True
将列表传递给 call()
或 Popen()
时,实际上仅调用列表中的第一个元素,这就是您看到包装器的原因使用 0 个参数调用。
您也应该先尝试不使用 shell=True
,因为它存在安全隐患,正如 documentation of subprocess -
中明确指出的
Using shell=True
can be a security hazard. See the warning under Frequently Used Arguments for details.
当您将 call
与 shell=True
一起使用时,您需要传递单个字符串,而不是字符串数组。所以:
call("scripts/ssh_wrapper -v -v -v "+host+" VBoxManage startvm "+vmname)
我正在尝试从 Python 程序中调用 ssh
,但它似乎忽略了参数。
这是 Python 程序:
#!/usr/bin/python
from subprocess import Popen, PIPE, call
vm_name = 'vmName with-space'
vm_host = 'user@192.168.21.230'
def ssh_prefix_list(host=None):
if host:
# return ["ssh", "-v", "-v", "-v", host]
return ["scripts/ssh_wrapper", "-v", "-v", "-v", host]
else:
return []
def start(vm_name, vm_host=None): # vm_host defaults to None
print "vm_host = ", vm_host
vbm_args = ssh_prefix_list(vm_host) + ["VBoxManage", "startvm", vm_name]
print vbm_args
return call(vbm_args, shell=True)
start(vm_name, vm_host)
包装器打印参数的数量、它们的值,并调用 ssh。
#!/bin/bash
echo Number of arguments: $#
echo ssh arguments: "$@"
ssh "$@"
这是输出。
$ scripts/vm_test.py
vm_host = stephen@192.168.21.230
['scripts/ssh_wrapper', '-v', '-v', '-v', 'stephen@192.168.21.230', 'VBoxManage', 'startvm', 'atp-systest Clone']
Number of arguments: 0
ssh arguments:
usage: ssh [-1246AaCfgKkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-i identity_file] [-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-w local_tun[:remote_tun]] [user@]hostname [command]
这是在 Python 2.5.
我想可能是这样:
prefix_list = ssh_prefix_list(vm_host)
prefix_list.append(["VBoxManage startvm %s" % vm_name])
但是我强烈建议使用 paramiko - 它使事情变得容易得多。
当您使用 shell=True
时,您需要传入一个字符串,而不是参数列表。尝试-
return call(' '.join(vbm_args), shell=True)
此外,您应该考虑从头开始构建字符串,而不是列表。
当您使用 shell=True
将列表传递给 call()
或 Popen()
时,实际上仅调用列表中的第一个元素,这就是您看到包装器的原因使用 0 个参数调用。
您也应该先尝试不使用 shell=True
,因为它存在安全隐患,正如 documentation of subprocess -
Using
shell=True
can be a security hazard. See the warning under Frequently Used Arguments for details.
当您将 call
与 shell=True
一起使用时,您需要传递单个字符串,而不是字符串数组。所以:
call("scripts/ssh_wrapper -v -v -v "+host+" VBoxManage startvm "+vmname)