Ответ 1
Можно использовать ssh. Python принимает дефис (-) в качестве аргумента для выполнения стандартного ввода,
cat hello.py | ssh [email protected] python -
Запустите python --help для получения дополнительной информации.
Я отлаживаю некоторый python script, который должен запускаться на моей виртуальной машине. И я предпочитаю редактировать скрипты локально (за пределами виртуальных машин). Таким образом, я нахожу его утомительным до scp
измененных сценариев для виртуальных машин каждый раз. Может ли кто-нибудь предложить эффективный способ?
В частности, мне интересно, можно ли выполнять скрипты python на удаленном PVM. Что-то вроде этого:
python --remote [email protected] hello.py //**FAKED**, served to explain ONLY
Можно использовать ssh. Python принимает дефис (-) в качестве аргумента для выполнения стандартного ввода,
cat hello.py | ssh [email protected] python -
Запустите python --help для получения дополнительной информации.
Хотя этот вопрос не совсем новый, и ответ уже выбран, я хотел бы поделиться другим приятным подходом.
Использование библиотеки 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 файлами вам, вероятно, придется поместить все эти файлы (и другие зависимости) на удаленный хост.
ssh [email protected] python < script.py - arg1 arg2
Потому что cat |
обычно не требуется
Вы можете сделать это через ssh.
ssh [email protected] "python ./hello.py"
Вы также можете отредактировать script в ssh с помощью текстового редактора или пересылки X11.
Мне пришлось сделать это, прежде чем использовать 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.