основная парамико exec_command справка - PullRequest
7 голосов
/ 10 августа 2011

Я новый пользователь paramiko и испытываю трудности с выполнением команд на удаленном сервере с paramiko. Я хочу экспортировать путь, а также запустить программу с именем tophat в фоновом режиме. Я могу нормально войти в систему с paramiko.sshclient(), но мой код для exec_command не дает результатов.

stdin, stdout, sterr = ssh.exec_command('export PATH=$PATH:/proj/genome/programs
/tophat-1.3.0/bin:/proj/genome/programs/cufflinks-1.0.3/bin:/proj/genome/programs/
bowtie-0.12.7:/proj/genome/programs/samtools-0.1.16')

stdin, stdout, sterr = ssh.exec_command('nohup tophat -o /output/path/directory -I 
10000 -p 8 --microexon-search -r 50 /proj/genome/programs/bowtie-0.12.7/indexes
/ce9 /input/path/1 /input/path/2 &')

файл nohup.out отсутствует, и python просто переходит на следующую строку без сообщений об ошибках. Я пробовал и без nohup, и результат тот же. Я пытался следовать этому уроку по paramiko .

Я неправильно использую exec_command?

Ответы [ 3 ]

8 голосов
/ 12 февраля 2016

Я также столкнулся с той же проблемой, и после просмотра этой статьи и этого ответа я вижу, что решение состоит в том, чтобы вызвать recv_exit_status() метод Канала.Вот мой код:

import paramiko
import time

cli = paramiko.client.SSHClient()
cli.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
cli.connect(hostname="10.66.171.100", username="mapping")
stdin_, stdout_, stderr_ = cli.exec_command("ls -l ~")
# time.sleep(2)    # Previously, I had to sleep for some time.
stdout_.channel.recv_exit_status()
lines = stdout_.readlines()
for line in lines:
    print line

cli.close()

Теперь мой код будет заблокирован до завершения удаленной команды.Этот метод объяснен здесь , и, пожалуйста, обратите внимание на предупреждение.

7 голосов
/ 26 июня 2012

exec_command () не является блокирующим и просто отправляет команду на сервер, после чего Python выполнит следующий код.

Я думаю, вам следует дождаться окончания выполнения команды и выполнить оставшуюся работу после этого.

Может помочь "time.sleep (10)", для которого требуется "время импорта". Некоторые примеры показывают, что вы можете прочитать из объекта stdout ChannelFile или просто с помощью stdout.readlines () , кажется, что он читает все ответы от сервера, но это может помочь.

Ваш код, указанные выше две строки exec_command , на самом деле они выполняются в разных сеансах exec. Я не уверен, оказывает ли это какое-то влияние на ваше дело.

Я бы посоветовал вам взглянуть на демонстрации в папке demos, они используют класс Channel , который имеет лучший API для выполнения блокирующей / неблокирующей отправки как для оболочки, так и для exec.

0 голосов
/ 31 декабря 2014

Вам лучше загрузить bash_profile перед запуском вашей команды. В противном случае вы можете получить исключение «команда не найдена».

Например, , я пишу команду command = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql' в целях вывода таблицы Mysql

Затем я должен загрузить bash_profile вручную перед командой сброса, набрав . ~/.profile; .~/.bash_profile;.

Пример

my_command  = 'mysqldump -uu -pp -h1.1.1.1 -P999 table > table.sql;'

pre_command = """
. ~/.profile;
. ~/.bash_profile;
"""

command = pre_command + my_command

stdin, stdout, stderr = ssh.exec_command(command)
...