2015-08-24 3 views
3

Я пытаюсь вызвать ssh из программы Python, но, похоже, игнорирует аргументы.Параметры, проигнорированные в вызове()

Это программа Python:

#!/usr/bin/python 

from subprocess import Popen, PIPE, call 

vm_name = 'vmName with-space' 
vm_host = '[email protected]' 

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: "[email protected]" 
ssh "[email protected]" 

Это выход.

$ scripts/vm_test.py 
vm_host = [email protected] 
['scripts/ssh_wrapper', '-v', '-v', '-v', '[email protected]', '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]] [[email protected]]hostname [command] 

Это на Python 2.5.

+0

Полу-шуточный ответ: попробуйте обновить Python и, возможно, проблема исчезнет. :-) – Kevin

+0

Мы хотели бы обновить Python, но мы находимся на очень старой версии Ubuntu, и на нем много зависимостей. Мы работаем над этим. –

ответ

2

Когда вы используете shell=True, вам необходимо передать строку, а не список аргументов. Попробуйте -

return call(' '.join(vbm_args), shell=True) 

Кроме того, вы должны рассмотреть возможность построения строки из начала, а не списка.

Когда вы передаете список к call() или Popen() с shell=True, только первый элемент в списке на самом деле называется, и это является причиной того, вы видите обертку под названием с 0 аргументами.

Вы также должны попробовать сначала без использования shell=True, поскольку ее опасности безопасности, так как четко указано в documentation of subprocess -

Использование shell=True может быть угрозу безопасности. См. Предупреждение под номером Frequently Used Arguments.

+3

Опция OP также может не учитывать использование 'shell = True' в первую очередь, так как эта команда не похожа на оболочку в любом случае (у нее есть shebang). – Kevin

+0

Правильно, добавлено, что ответ, со ссылкой на документацию. Спасибо. –

+1

Устранение проблемы «shell = True» устраняет проблему. Благодарю. –

0

Я думаю, что это может быть его:

prefix_list = ssh_prefix_list(vm_host) 
prefix_list.append(["VBoxManage startvm %s" % vm_name]) 

однако я настоятельно рекомендую использовать paramiko - это делает вещи намного проще.

0

При использовании call с shell=True, вам нужно пройти одну строку, а не массив строк. Итак:

call("scripts/ssh_wrapper -v -v -v "+host+" VBoxManage startvm "+vmname) 
Смежные вопросы