¿Hay alguna forma de ejecutar un script de shell de varias líneas atornillándolo a la entrada estándar del shell remoto en fabric? ¿O debo escribirlo siempre en el sistema de archivos remoto, luego ejecutarlo y luego eliminarlo? Me gusta enviar a stdin ya que evita el archivo temporal. Si no hay una API de estructura (y parece que no se basa en mi investigación), presumiblemente puedo usar el módulo ssh
directamente. Básicamente deseo fabric.api.run
no se limitaba a un comando de 1 línea que pasa al shell como un argumento de línea de comando, sino que toma un script completo de múltiples líneas y lo escribe en la entrada estándar del shell remoto.Ejecutar script de shell utilizando texto de script de fabric y de canal en stdin de shell
Para aclarar Quiero el equivalente de tejido de esta línea de comandos:
ssh somehost /bin/sh < /tmp/test.sh
Excepto en el pitón coude fuente del script no vendría de un archivo en el sistema de archivos local, no sería más que una cadena de varias líneas de memoria. Tenga en cuenta que esta es una operación lógica única y que no hay ningún archivo temporal en el lado remoto, lo que significa que los fallos inesperados y los bloqueos no dejan archivos huérfanos. Si hubiera una opción en el tejido (que es lo que estoy preguntando), no habría necesidad de un archivo temporal en ninguno de los lados y esto solo requeriría una sola operación ssh.
¿Por qué no hacer algo como 'run ('comando1 && comando2 && comando2' ')? – Tshepang
Porque A) no es fácil de leer o escribir o mantener como código shell-in-python, B) el && afecta el flujo de código en formas que puede o no desear y C) el mundo ya está lleno de shell existente scripts que quiero ejecutar a través de fabric sin convertirlos a una sola línea. –