bash - programas - programacion shell linux ejemplos
¿Cuál es la forma más limpia de ssh y ejecutar varios comandos en Bash? (12)
¿Qué tal un documento de Bash Here ?
ssh otherhost << EOF
ls some_folder;
./someaction.sh ''some params''
pwd
./some_other_action ''other params''
EOF
Para evitar los problemas mencionados por @Globalz en los comentarios, puede (dependiendo de lo que esté haciendo en el sitio remoto) librarse de reemplazar la primera línea con
ssh otherhost /bin/bash << EOF
Tenga en cuenta que puede realizar la sustitución de variables en el documento Aquí, pero es posible que deba lidiar con los problemas de cotización. Por ejemplo, si cita la "cadena de límite" (es decir, EOF
en lo anterior), entonces no puede hacer sustituciones de variables. Pero sin citar la cadena de límite, las variables se sustituyen. Por ejemplo, si ha definido $NAME
arriba en su script de shell, podría hacer
ssh otherhost /bin/bash << EOF
touch "/tmp/${NAME}"
EOF
y crearía un archivo en el otro lugar de destino con el nombre de lo que haya asignado a $NAME
. También se aplican otras reglas sobre las citas de shell script, pero son demasiado complicadas para entrar aquí.
Ya tengo configurado un agente ssh 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 preferiría evitar ssh''ing varias veces solo para evitar esto.
Entonces, ¿hay alguna manera de hacer esto de una vez 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é feliz con cualquier solución siempre que esté limpia.
Editar
Para aclarar, estoy hablando de que esto sea parte de un script de bash más grande. Es posible que otras personas necesiten lidiar con el script en la línea, así que me gustaría mantenerlo limpio. No quiero tener un script de bash con una línea que parezca:
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.
Edite su script localmente, luego canalícelo a ssh, por ejemplo
cat commands-to-execute-remotely.sh | ssh blah_server
donde los commands-to-execute-remotely.sh
ejecutar-remotely.sh se parecen a su lista anterior:
ls some_folder
./someaction.sh
pwd;
Esto funciona bien para crear scripts, ya que no tiene que incluir otros archivos:
#!/bin/bash
ssh <my_user>@<my_host> "bash -s" << EOF
# here you just type all your commmands, as you can see, i.e.
touch /tmp/test1;
touch /tmp/test2;
touch /tmp/test3;
EOF
Esto también se puede hacer de la siguiente manera. Ponga sus comandos en una secuencia de comandos, llamémoslos comandos-inc.sh
#!/bin/bash
ls some_folder
./someaction.sh
pwd
Guarda el archivo
Ahora ejecútalo en el servidor remoto.
ssh user@remote ''bash -s'' < /path/to/commands-inc.sh
Nunca fallé por mí.
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:
mkdir ~/.ssh/controlmasters
Y luego agregando lo siguiente a su configuración .ssh:
Host *
ControlMaster auto
ControlPath ~/.ssh/controlmasters/%r@%h:%p.socket
ControlMaster auto
ControlPersist 10m
Ahora, no es necesario 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 una mayor 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 .
Las respuestas publicadas utilizando cadenas multilínea y múltiples scripts de bash no funcionaron para mí.
- Las cuerdas largas multilínea son difíciles de mantener.
- Los scripts de bash separados no mantienen variables locales.
Esta es una forma funcional de ssh y ejecutar múltiples comandos mientras se mantiene el contexto local.
LOCAL_VARIABLE=test
run_remote() {
echo "$LOCAL_VARIABLE"
ls some_folder;
./someaction.sh ''some params''
./some_other_action ''other params''
}
ssh otherhost "$(set); run_remote"
No estoy seguro de si es el más limpio para los comandos largos, pero ciertamente el más fácil:
ssh user@host "cmd1; cmd2; cmd;3"
Para cualquiera que se haya topado 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:
ssh <host> echo test/;ls
^ backslash!
Listó los hosts remotos / directorio de inicio (registrado como root), mientras que
ssh <host> echo test;ls
^ NO backslash
listado el directorio de trabajo actual.
Siguiente paso: romper la línea:
v another backslash!
ssh <host> echo test/;/
ls
Esto nuevamente enumeró el directorio de trabajo remoto - formato mejorado:
ssh <host>/
echo test/;/
ls
Si realmente es mejor que aquí, documente o cita alrededor de líneas discontinuas, bueno, no yo decida ...
(Usando bash, Ubuntu 14.04 LTS.)
Para hacer coincidir su código de muestra, puede ajustar sus comandos dentro de preguntas simples o dobles. Por ejemplo
ssh blah_server "
ls
pwd
"
Ponga todos los comandos en un script y puede ejecutarse como
ssh <remote-user>@<remote-host> "bash -s" <./remote-commands.sh
Veo dos maneras:
Primero haces un zócalo de control como este:
ssh -oControlMaster=yes -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip>
y ejecuta tus comandos
ssh -oControlMaster=no -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip> -t <yourcommand>
De esta manera, puede escribir un comando ssh sin volver a conectarse al servidor.
El segundo sería generar dinámicamente el script, scp
y ejecutándolo.
SSH y ejecutar varios comandos en Bash.
Comandos separados con punto y coma dentro de una cadena, pasados a echo, todos ingresados al comando ssh. Por ejemplo:
echo "df -k;uname -a" | ssh 192.168.79.134
Pseudo-terminal will not be allocated because stdin is not a terminal.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 18274628 2546476 14799848 15% /
tmpfs 183620 72 183548 1% /dev/shm
/dev/sda1 297485 39074 243051 14% /boot
Linux newserv 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux