script run remote password automatico and linux bash ssh

linux - run - ¿Cómo ejecutar un comando remoto sobre ssh con argumentos?



ssh execute command on remote server (3)

Este es un ejemplo que funciona en AWS Cloud. El escenario es que alguna máquina que arrancó desde autoscaling necesita realizar alguna acción en otro servidor, pasando el DNS de la instancia recién generada a través de SSH

# Get the public DNS of the current machine (AWS specific) MY_DNS=`curl -s http://169.254.169.254/latest/meta-data/public-hostname` ssh / -o StrictHostKeyChecking=no / -i ~/.ssh/id_rsa / [email protected] / << EOF cd ~/ echo "Hey I was just SSHed by ${MY_DNS}" run_other_commands # Newline is important before final EOF! EOF

En mi .bashrc defino una función que puedo usar en la línea de comando más adelante:

function mycommand() { ssh [email protected] cd testdir;./test.sh "$1" }

Al usar este comando, solo el comando cd se ejecuta en el host remoto; el comando test.sh se ejecuta en el host local. Esto se debe a que el punto y coma separa dos comandos diferentes: el comando ssh y el comando test.sh

Intenté definir la función de la siguiente manera (fíjese en las comillas simples):

function mycommand() { ssh [email protected] ''cd testdir;./test.sh "$1"'' }

Traté de mantener juntos el comando cd y el comando test.sh , pero el argumento $1 no se resuelve, independientemente de lo que le dé a la función. Siempre se intenta ejecutar un comando

./test.sh $1

en el host remoto.

¿Cómo puedo definir mycommand correctamente, por lo que el script test.sh se ejecuta en el host remoto después de cambiar al directorio testdir , con la capacidad de pasar el argumento dado a mycommand a test.sh ?


Hazlo de esta manera en su lugar:

function mycommand { ssh [email protected] "cd testdir;./test.sh /"$1/"" }

Todavía tiene que pasar el comando completo como una sola cadena, pero en esa cadena necesita expandir $1 antes de que se envíe a ssh, por lo que debe usar "" para ello.

Actualizar

Otra forma adecuada de hacerlo es usar printf %q para citar correctamente el argumento. Esto haría que el argumento sea seguro de analizar incluso si tiene espacios, comillas simples, comillas dobles o cualquier otro carácter que pueda tener un significado especial para el shell:

function mycommand { printf -v __ %q "$1" ssh [email protected] "cd testdir;./test.sh $__" }

  • Al declarar una función con function , () no es necesario.
  • No hagas comentarios al respecto solo porque eres un POSIXist.

Revivir un hilo antiguo, pero este enfoque bastante limpio no estaba en la lista.

function mycommand() { ssh [email protected] <<+ cd testdir;./test.sh "$1" + }