Tengo que ejecutar un script de shell (Windows / Linux) en una máquina remota.
Tengo SSH configurado en la máquina A y B. Mi script está en la máquina A, que ejecutará parte de mi código en una máquina remota, la máquina B.
Las computadoras locales y remotas pueden ser sistemas basados en Windows o Unix.
¿Hay alguna manera de ejecutar esto usando plink / ssh?
shell
ssh
sysadmin
remote-execution
alpha_989
fuente
fuente
Respuestas:
Si la Máquina A es un cuadro de Windows, puede usar Plink (parte de PuTTY ) con el parámetro -m, y ejecutará el script local en el servidor remoto.
Si la máquina A es un sistema basado en Unix, puede usar:
No debería tener que copiar el script al servidor remoto para ejecutarlo.
fuente
-s
opción? Esta página de manual me lleva a creer que procesará la entrada estándar cuando termine de procesar las opciones, ya-s
sea que se use o no.sudo
, ejecutessh root@MachineB 'echo "rootpass" | sudo -Sv && bash -s' < local_script.sh
.HISTCONTROL=ignoreboth or ignorespace
para que funcione)ssh root@MachineB ARG1="arg1" ARG2="arg2" 'bash -s' < local_script.sh
créditos van completamente a la respuesta de @chubbsondubs a continuación.Esta es una vieja pregunta, y la respuesta de Jason funciona bien, pero me gustaría agregar esto:
Esto también se puede usar con su y comandos que requieren la entrada del usuario. (tenga en cuenta el
'
heredoc escapado)Editar: Dado que esta respuesta sigue recibiendo fragmentos de tráfico, agregaría aún más información a este maravilloso uso de heredoc:
Puede anidar comandos con esta sintaxis, y esa es la única forma en que la anidación parece funcionar (de una manera sensata)
De hecho, puede tener una conversación con algunos servicios como telnet, ftp, etc. Pero recuerde que heredoc simplemente envía el stdin como texto, no espera la respuesta entre líneas
Editar: ¡Acabo de descubrir que puedes sangrar el interior con pestañas si lo usas
<<-END
!(Creo que esto debería funcionar)
Ver también http://tldp.org/LDP/abs/html/here-docs.html
fuente
<<'ENDSSH'
), las cadenas no se expandirán, las variables no se evaluarán. También puede usar<<ENDSSH
o<<"ENDSSH"
si desea expansión.Expect
se puede usar cuando necesita automatizar comandos interactivos como FTP.Pseudo-terminal will not be allocated because stdin is not a terminal.
mensaje. Uno tiene que usar ssh con-t -t
params para evitar eso. Ver este hilo en SOAdemás, no olvide escapar de las variables si desea recogerlas del host de destino.
Esto me ha pillado en el pasado.
Por ejemplo:
imprime / inicio / usuario2
mientras
imprime / inicio / usuario
Otro ejemplo:
imprime "hola" correctamente.
fuente
ssh user2@host 'bash -s' echo $HOME /home/user2 exit
for
bucles que se ejecutan en lassh
sesión, la variable del bucle no debe escaparse.ssh user2@host2 'echo hello world' | awk '{ print $1 }'
decir, ejecutar el script Awk localmente. Si el comando remoto produce una inmensa cantidad de resultados, debe evitar copiarlo todo en el servidor local, por supuesto. Por cierto, las comillas simples alrededor del comando remoto evitan la necesidad de escapar.Esta es una extensión de la respuesta de YarekT para combinar comandos remotos en línea con pasar variables ENV desde la máquina local al host remoto para que pueda parametrizar sus scripts en el lado remoto:
Encontré esto excepcionalmente útil al mantenerlo todo en un solo script, por lo que es muy fácil de leer y mantener.
¿Por qué esto funciona? ssh admite la siguiente sintaxis:
En bash podemos especificar variables de entorno para definir antes de ejecutar un comando en una sola línea de esta manera:
Eso facilita la definición de variables antes de ejecutar un comando. En este caso, echo es nuestro comando que estamos ejecutando. Todo antes de echo define variables de entorno.
Entonces combinamos esas dos características y la respuesta de YarekT para obtener:
En este caso, estamos configurando ARG1 y ARG2 a valores locales. Enviar todo después de user @ host como remote_command. Cuando la máquina remota ejecuta el comando ARG1 y ARG2, se establecen los valores locales, gracias a la evaluación de la línea de comando local, que define las variables de entorno en el servidor remoto, luego ejecuta el comando bash -s usando esas variables. Voila
fuente
ssh user@host "ARG1=\"$ARG1\" ARG2=\"$ARG2\"" 'bash -s' <<'ENDSSH'...
-s
es poder aplicar argumentos a los scripts que se obtienen a través de stdin. Quiero decir, también puedes omitirlo si no lo vas a usar. Si lo usa, no hay razón para usar variables de entorno:ssh user@host 'bash -s value1 value2' <<< 'echo "$@"'
Eso le solicitará una contraseña, a menos que haya copiado la clave pública de su usuario HostA en el archivo autorizado_claves en la página de inicio del directorio del usuario .ssh. Eso permitirá la autenticación sin contraseña (si se acepta como método de autenticación en la configuración del servidor ssh)
fuente
Empecé a usar Fabric para operaciones más sofisticadas. Fabric requiere Python y algunas otras dependencias, pero solo en la máquina cliente. El servidor solo necesita ser un servidor ssh. Considero que esta herramienta es mucho más poderosa que los scripts de shell entregados a SSH, y bien vale la pena la instalación (especialmente si disfrutas de la programación en Python). Fabric maneja la ejecución de scripts en múltiples hosts (o hosts de ciertos roles), ayuda a facilitar operaciones idempotentes (como agregar una línea a un script de configuración, pero no si ya está allí), y permite la construcción de una lógica más compleja (como Python el lenguaje puede proporcionar).
fuente
Intenta correr
ssh user@remote sh ./script.unx
.fuente
fuente
Suponiendo que quiere hacer esto automáticamente desde una máquina "local", sin iniciar sesión manualmente en la máquina "remota", debe buscar en una extensión TCL conocida como Expect, está diseñada precisamente para este tipo de situación. También proporcioné un enlace a un script para iniciar sesión / interactuar a través de SSH.
https://www.nist.gov/services-resources/software/expect
http://bash.cyberciti.biz/security/expect-ssh-login-script/
fuente
Utilizo este para ejecutar un script de shell en una máquina remota (probado en / bin / bash):
fuente
Muy recomendable para obtener el archivo de entorno (.bashrc / .bashprofile / .profile). antes de ejecutar algo en el host remoto porque las variables de entorno de los hosts de destino y de origen pueden diferirse.
fuente
si desea ejecutar un comando como este
temp=`ls -a` echo $temp
en `` causará errores.El siguiente comando resolverá este problema
ssh user@host ''' temp=`ls -a` echo $temp '''
fuente
La respuesta aquí ( https://stackoverflow.com/a/2732991/4752883 ) funciona muy bien si está intentando ejecutar un script en una máquina Linux remota usando
plink
ossh
. Funcionará si el script tiene varias líneaslinux
.** Sin embargo, si está intentando ejecutar un script por lotes ubicado en una
linux/windows
máquina local y su máquina remota lo estáWindows
, y consta de varias líneas usando **plink root@MachineB -m local_script.bat
no funciona
Solo se ejecutará la primera línea del script. Esto es probablemente una limitación de
plink
.Solución 1:
Para ejecutar un script por lotes multilínea (especialmente si es relativamente simple, que consta de unas pocas líneas):
Si su secuencia de comandos por lotes original es la siguiente
puede combinar las líneas juntas usando el separador "&&" de la siguiente manera en su
local_script.bat
archivo: https://stackoverflow.com/a/8055390/4752883 :Después de este cambio, puede ejecutar el script como se indica aquí por @ JasonR.Coombs: https://stackoverflow.com/a/2732991/4752883 con:
Solución 2:
Si su secuencia de comandos por lotes es relativamente complicada, puede ser mejor utilizar una secuencia de comandos por lotes que encapsule el comando plink, así como sigue, como se indica aquí por @Martin https://stackoverflow.com/a/32196999/4752883 :
fuente
Este script bash hace ssh en una máquina remota de destino, y ejecuta algún comando en la máquina remota, no olvide instalar esperar antes de ejecutarlo (en mac
brew install expect
)fuente
Puedes usar runoverssh :
-s
ejecuta un script local de forma remotaIndicadores útiles:
-g
use una contraseña global para todos los hosts (solicitud de contraseña única)-n
use SSH en lugar de sshpass, útil para la autenticación de clave públicafuente
Primero, copie el script en la Máquina B usando scp
Luego, solo ejecuta el script
Esto funcionará si ha dado permiso ejecutable al script.
fuente