2013-12-19 2 views
0

У меня есть файл python в папке \ tmp \ этот файл печатает что-то и возвращается с кодом возврата 22. Я могу отлично выполнить этот скрипт с помощью замазка, но не в состоянии сделать это с помощью модуля paramiko.как выполнить скрипт python или bash через ssh-соединение и получить код возврата

это мой код

import paramiko  
def main(): 
    remote_ip = '172.xxx.xxx.xxx' 
    remote_username = 'root' 
    remote_password = 'xxxxxxx' 
    remote_path = '/tmp/ab.py' 
    sub_type = 'py' 
    commands = ['echo $?'] 
    ssh_client = paramiko.SSHClient() 
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh_client.connect(remote_ip, username=remote_username,password=remote_password) 
    i,o,e = ssh_client.exec_command('/usr/bin/python /tmp/ab.py') 
    print o.read(), e.read() 
    i,o,e = ssh_client.exec_command('echo $?') 
    print o.read(), e.read() 


main() 

исполнения это мой питон скрипт для выполнения на удаленном компьютере

#!/usr/bin/python 
import sys 
print "hello world" 
sys.exit(20) 

Я не в состоянии понять, что на самом деле не так в моей логике. Также, когда я делаю cd \ tmp, а затем ls, я все равно буду в корневой папке.

ответ

2

Следующий пример питона запускает команду через SSH, а затем получить команду стандартный вывод, STDERR и код возврата:

import paramiko 

client = paramiko.SSHClient() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(hostname='hostname', username='username', password='password') 

channel = client.get_transport().open_session() 
command = "import sys; sys.stdout.write('stdout message'); sys.stderr.write(\'stderr message\'); sys.exit(22)" 
channel.exec_command('/usr/bin/python -c "%s"' % command) 
channel.shutdown_write() 

stdout = channel.makefile().read() 
stderr = channel.makefile_stderr().read() 
exit_code = channel.recv_exit_status() 

channel.close() 
client.close() 

print 'stdout:', stdout 
print 'stderr:', stderr 
print 'exit_code:', exit_code 

надеюсь, что это помогает

+0

за идею. Я выполнил это, используя конвейер и перенаправляя вывод скрипта python в файл, а затем прочитал скрипт следующей команды. – Hemant

0

Каждый раз, когда вы запускаете exec_command, запускается новый подпроцесс bash.

Вот почему, когда вы запускаете что-то вроде:

exec_command("cd /tmp"); 
exec_command("mkdir hello"); 

реж «привет» создан в директории, а не внутри TMP.

Попробуйте выполнить несколько команд в одном вызове exec_command.

Другой способ заключается в использовании os.chdir()

+0

хорошо я что excec_command не поможет мне выполнить то, что я пытаюсь сделать, но почему мой скрипт python/batch не работает? Также, если я в любом случае могу это сделать, как бы получить код выхода или код возврата сценария – Hemant

Смежные вопросы