Подтвердить что ты не робот

Запустить локальный python script на удаленном сервере

Я отлаживаю некоторый python script, который должен запускаться на моей виртуальной машине. И я предпочитаю редактировать скрипты локально (за пределами виртуальных машин). Таким образом, я нахожу его утомительным до scp измененных сценариев для виртуальных машин каждый раз. Может ли кто-нибудь предложить эффективный способ?

В частности, мне интересно, можно ли выполнять скрипты python на удаленном PVM. Что-то вроде этого:

python --remote [email protected] hello.py //**FAKED**, served to explain ONLY
4b9b3361

Ответ 1

Можно использовать ssh. Python принимает дефис (-) в качестве аргумента для выполнения стандартного ввода,

cat hello.py | ssh [email protected] python -

Запустите python --help для получения дополнительной информации.

Ответ 2

Хотя этот вопрос не совсем новый, и ответ уже выбран, я хотел бы поделиться другим приятным подходом.

Использование библиотеки paramiko - чистая реализация SSH2 на основе python - ваш python script может подключаться к удаленному хосту через SSH, копировать себя (!) на этот хост, а затем выполнить эту копию на удаленном хосте. Stdin, stdout и stderr удаленного процесса будут доступны на вашем локальном запуске script. Таким образом, это решение практически не зависит от IDE.

На моей локальной машине я запускаю script с параметром cmd-строки "deploy", который запускает удаленное выполнение. Без такого параметра запускается фактический код, предназначенный для удаленного хоста.

import sys
import os

def main():
    print os.name

if __name__ == '__main__':
    try:
        if sys.argv[1] == 'deploy':
            import paramiko

            # Connect to remote host
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            client.connect('remote_hostname_or_IP', username='john', password='secret')

            # Setup sftp connection and transmit this script
            sftp = client.open_sftp()
            sftp.put(__file__, '/tmp/myscript.py')
            sftp.close()

            # Run the transmitted script remotely without args and show its output.
            # SSHClient.exec_command() returns the tuple (stdin,stdout,stderr)
            stdout = client.exec_command('python /tmp/myscript.py')[1]
            for line in stdout:
                # Process each line in the remote output
                print line

            client.close()
            sys.exit(0)
    except IndexError:
        pass

    # No cmd-line args provided, run script normally
    main()

Обработка исключений исключена, чтобы упростить этот пример. В проектах с несколькими script файлами вам, вероятно, придется поместить все эти файлы (и другие зависимости) на удаленный хост.

Ответ 3

ssh [email protected] python < script.py - arg1 arg2

Потому что cat | обычно не требуется

Ответ 4

Вы можете сделать это через ssh.

ssh [email protected] "python ./hello.py"

Вы также можете отредактировать script в ssh с помощью текстового редактора или пересылки X11.

Ответ 5

Мне пришлось сделать это, прежде чем использовать Paramiko в случае, когда я хотел запустить динамический локальный PyQt4 script на хосте, на котором запущен ssh-сервер, который подключил мой сервер OpenVPN и попросил их настройки маршрутизации (split туннелирования).

Пока сервер ssh, к которому вы подключаетесь, имеет все необходимые зависимости вашего script (PyQt4 в моем случае), вы можете легко инкапсулировать данные, закодировав его в base64 и используя встроенный exec() в функции декодированного сообщения. Если я правильно помню, мой однострочный для этого был:

stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"' )[1]

Трудно читать, и вам нужно избегать escape-последовательностей, потому что они интерпретируются дважды (один раз отправителем, а затем снова получателем). Также может потребоваться некоторая отладка, я собрал свой сервер на PCS, или я просто ссылаюсь на свою маршрутизацию OpenVPN script.

Разница в том, чтобы сделать это таким образом, в отличие от отправки файла, заключается в том, что он никогда не касается диска на сервере и запускается прямо из памяти (если, конечно, они не заносят команду). Вы обнаружите, что инкапсуляция информации таким образом (хотя и неэффективная) может помочь вам упаковать данные в один файл.

Например, вы можете использовать этот метод для включения необработанных данных из внешних зависимостей (например, изображения) в ваш основной script.