Мне пришлось сделать это до использования Paramiko в случае, когда я хотел запустить динамический локальный скрипт PyQt4 на хосте, на котором запущен ssh-сервер, который подключил мой сервер OpenVPN и попросил их предпочтение маршрутизации (сплит-туннелирование).
До тех пор, пока сервер ssh, к которому вы подключаетесь, имеет все необходимые зависимости вашего сценария (PyQt4 в моем случае), вы можете легко инкапсулировать данные, закодировав его в base64 и используя встроенную функцию exec()
декодированное сообщение. Если я правильно помню, как мой один вкладыш для этого было:
stdout = client.exec_command('python -c "exec(\\"' + open('hello.py','r').read().encode('base64').strip('\n') + '\\".decode(\\"base64\\"))"')[1]
Это трудно читать, и вы должны избежать управляющие последовательности, так как они интерпретируются дважды (один раз отправителем, а затем снова приемником). Также может потребоваться некоторая отладка, я собрал свой сервер на PCS, или я просто ссылаюсь на свой скрипт маршрутизации OpenVPN.
Разница в том, чтобы сделать это таким образом, в отличие от отправки файла, заключается в том, что он никогда не касается диска на сервере и запускается прямо из памяти (если, конечно, они не регистрируют команду). Вы обнаружите, что инкапсуляция информации таким образом (хотя и неэффективная) может помочь вам упаковать данные в один файл.
Например, вы можете использовать этот метод для включения необработанных данных из внешних зависимостей (то есть изображения) в ваш основной скрипт.
Разве вы не можете оставить «-'? Это нормально для меня. –
Что делать, если код имеет подмодули, расположенные в подпапках? –
Где вы могли бы добавить аргументы командной строки в этом случае? – ubundows