Ya tengo un agente ssh configurado, y puedo ejecutar comandos en un servidor externo en el script Bash haciendo cosas como:
ssh blah_server "ls; pwd;"
Ahora, lo que realmente me gustaría hacer es ejecutar muchos comandos largos en un servidor externo. Encerrar todo esto entre comillas sería bastante feo, y realmente preferiría evitar hablar varias veces solo para evitar esto.
Entonces, ¿hay alguna manera de hacer esto de una vez encerrada entre paréntesis o algo así? Estoy buscando algo en la línea de:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Básicamente, estaré contento con cualquier solución siempre que esté limpia.
Editar
Para aclarar, estoy hablando de que esto sea parte de un script bash más grande. Es posible que otras personas necesiten lidiar con el script más adelante, por lo que me gustaría mantenerlo limpio. No quiero tener un script bash con una línea que se vea así:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
porque es extremadamente feo y difícil de leer.
ssh
invocación?scp
,ssh
y correr. Esta será la forma más limpia, creo.Respuestas:
¿Qué tal un documento Bash Here :
Para evitar los problemas mencionados por @Globalz en los comentarios, puede (dependiendo de lo que esté haciendo en el sitio remoto) salirse con la suya al reemplazar la primera línea con
Tenga en cuenta que puede hacer la sustitución de variables en el documento Aquí, pero es posible que tenga que lidiar con problemas de citas. Por ejemplo, si cita la "cadena de límite" (es decir,
EOF
en lo anterior), entonces no puede hacer sustituciones variables. Pero sin citar la cadena límite, las variables se sustituyen. Por ejemplo, si ha definido$NAME
anteriormente en su script de shell, podría hacery crearía un archivo en el destino
otherhost
con el nombre de lo que le haya asignado$NAME
. También se aplican otras reglas sobre las citas de script de shell, pero son demasiado complicadas para entrar aquí.fuente
Edite su script localmente, luego póngalo en ssh, por ejemplo
donde se
commands-to-execute-remotely.sh
parece a tu lista de arriba:fuente
( echo $mycmd $myvar ; ...) | ssh myhost
, al igual que con el uso de cat, usted sabe exactamente lo que está pasando en el flujo de comandos ssh. Y, por supuesto, la subshell en el script puede ser de varias líneas para facilitar lacommands-to-execute-remotely.sh
?$localvar
para interpretar una variable definida localmente,\$remotevar
para interpretar remotamente una variable definida remotamente,\$(something with optionnal args)
para obtener la salida de algo ejecutado en el servidor remoto. Un ejemplo que puede enviar a través de 1 (o, como se muestra aquí, múltiples comandos ssh):echo " for remotedir in /*/${localprefix}* ; do cd \"\$remotedir\" && echo \"I am now in \$(pwd) on the remote server \$(hostname) \" ; done " | ssh user1@hop1 ssh user2@hop2 ssh user@finalserver bash
ssh blah_server < commands-to-execute-remotely.sh
?Para que coincida con su código de muestra, puede ajustar sus comandos dentro de qoutes simples o dobles. Por ejemplo
fuente
Veo dos formas:
Primero haces un socket de control como este:
y ejecuta tus comandos
De esta manera, puede escribir un comando ssh sin volver a conectarse al servidor.
El segundo sería generar dinámicamente el script,
scp
ejecutarlo y ejecutarlo.fuente
Esto también se puede hacer de la siguiente manera. Ponga sus comandos en una secuencia de comandos, nombremos comandos-inc.sh
Guarda el archivo
Ahora ejecútelo en el servidor remoto.
Nunca me ha fallado.
fuente
bash -s
necesario?#!/bin/bash
usa realmente?ssh user@remote < /path/to/commands-inc.sh
(parece funcionar para mí). Bueno, supongo que su versión garantiza que usemos elbash
shell, y no otro shell, ese es el propósito, ¿no?Ponga todos los comandos en un script y se puede ejecutar como
fuente
bash -s
?man
páginasIf the -s option is present, or if no arguments remain after option processing, then commands are read from the standard input. This option allows the positional parameters to be set when invoking an interactive shell.
bash
comando por completo, es decirssh remote-user@remote-host <./remote-commands.sh
. Lo intenté a mi manera y pareció funcionar, aunque no estoy seguro de si es deficiente de alguna manera.SSH y ejecutar múltiples comandos en Bash.
Comandos separados con punto y coma dentro de una cadena, pasados a echo, todos canalizados al comando ssh. Por ejemplo:
fuente
Para cualquiera que tropezó aquí como yo, tuve éxito al escapar del punto y coma y la nueva línea:
Primer paso: el punto y coma. De esta manera, no rompemos el comando ssh:
Enumeró el directorio host / home remoto (conectado como root), mientras que
enumeró el directorio de trabajo actual.
Siguiente paso: romper la línea:
Esto nuevamente enumeró el directorio de trabajo remoto - formato mejorado:
Si realmente es mejor que el documento o las citas alrededor de las líneas discontinuas, bueno, no debo decidirlo ...
(Usando bash, Ubuntu 14.04 LTS.)
fuente
ssh host "echo test && ls"
Las respuestas publicadas utilizando cadenas de varias líneas y múltiples secuencias de comandos bash no me funcionaron.
Aquí hay una forma funcional de ssh y ejecutar múltiples comandos mientras se mantiene el contexto local.
fuente
No estoy seguro de si es el más limpio para comandos largos, pero ciertamente es el más fácil:
fuente
Esto funciona bien para crear scripts, ya que no tiene que incluir otros archivos:
fuente
-s
bandera, lo cito, es posible que pueda salirse con la suya reemplazando la primera línea con ... , y no pude salir con solo llamar a bash, lo recuerdo vagamente.La forma más fácil de configurar su sistema para usar sesiones ssh individuales de forma predeterminada con multiplexación.
Esto se puede hacer creando una carpeta para los sockets:
Y luego agregue lo siguiente a su configuración .ssh:
Ahora, no necesita modificar ninguno de sus códigos. Esto permite múltiples llamadas a ssh y scp sin crear múltiples sesiones, lo cual es útil cuando se necesita más interacción entre sus máquinas locales y remotas.
Gracias a la respuesta de @ terminus, http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/ y https://en.wikibooks.org / wiki / OpenSSH / Cookbook / Multiplexing .
fuente