2015-11-22 5 views
2

Я могу выполнить скрипт из среды python локально, используя подпроцесс, но из-за проблем с кросс-платформой мне нужно выполнить его на удаленном сервере и вернуть результаты на моем локальном компьютере.выполнить программу на удаленной машине python

Параметр парсера каталога содержит некоторые сторонние модули, которые могут быть выполнены с использованием сценария run.sh, присутствующего в каталоге парсеррапа. Однако этот каталог парсерпатов присутствует на удаленном сервере. Это то, что у меня есть, но это будет работать, только если parserpath является локальным каталогом. Как я могу удалить ssh в удаленный каталог и запустить скрипт run.sh?

def run_parser(filename): 

    current_dir = os.getcwd() 
    parser_path="/parserpath" 
    os.chdir(parser_path) 
    subprocess.call("./run.sh " + filename, shell=True) 
    os.chdir(current_dir) 

ответ

4

В большинстве Линукс оболочек, вы можете запустить команду в другой рабочей директории, выполнив подоболочку как в

/home/usr> (cd /usr/local/bin;pwd) 
/usr/local/bin 
/home/usr> 

Вы можете сделать то же самое через ssh в удаленной системе. В зависимости от того, какой клиент ssh вы используете, вы можете немного похудеть. Например, с paramiko с exec_command для каждой команды создается новая удаленная оболочка, поэтому достаточно cd /path/on/remote/machine;./run.sh.

Минималистский пример для paramiko на Python 2.x является

import sys 
import paramiko 

try: 
    hostname, username, password, targetpath = sys.argv[1:5] 
except ValueError: 
    print("Failed, call with hostname username password targetpath") 

command = "cd {};pwd".format(targetpath) 
print("Command to send: {}".format(command)) 

ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect(hostname=hostname, username=username, password=password) 
stdin, stdout, stderr = ssh.exec_command("cd {};pwd".format(targetpath)) 
print(stdout.read()) 
ssh.close() 

python3 должны быть одинаковыми. Существуют другие варианты, такие как привязки libssh2 для python, pexpect s s поддержка и т. Д.

+0

Спасибо, особенно за указание на библиотеку paramiko. – AMisra

1

Используйте SSH-ключи для автоматизации процесса входа в систему через SSH. Ниже приведен код для выполнения сценария удаленно.

ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 
        shell=False, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
+0

, но мне нужно сменить рабочий каталог на каталог на удаленной машине. Как я могу это сделать? – AMisra

+0

Для простоты я просто выполнил бы строгую проверку в вашем домашнем каталоге. Однако, если вы не хотите этого делать, я предлагаю передать абсолютный путь к скрипту, который вы хотите запустить, что отрицает необходимость изменения каталогов. Посмотрите на эту ссылку для большего направления: https://gist.github.com/bortzmeyer/1284249. Библиотеки, необходимые для управления активным SSH-соединением, излишне сложны для вашего конкретного случая использования. –

0

Try, SSH пользователь @ хост ш путь/run.sh

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