Mediante un script bash ejecutado en una computadora local, ejecute un comando (con privilegios sudo) en un servidor remoto

Mediante un script bash ejecutado en una computadora local, ejecute un comando (con privilegios sudo) en un servidor remoto

Ejecute un comando en un sistema remoto desde una computadora local

Necesito ejecutar un comando en un sistema lubuntu 22.04 remoto mediante una conexión ssh, pero sin abrir un shell.Esta instrucción se ejecutará dentro de un script.El script se ejecuta en mi sistema local (que tiene instalada otra distribución de Ubuntu). Descubrí que puedo hacerlo con éxito ejecutando en el sistema local el siguiente script:

# define a variable which stored the password
MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

En el comando que he usado sshpass(que está instalado en mi sistema local) para evitar el ingreso de la contraseña del usuario myusernecesaria para autenticar la sesión ssh.

Mis necesidades

También tengo que ejecutar un cpcomando como el anterior, pero el destino del archivo es una subcarpeta /etcy necesito sudoprivilegios. Entonces el guión se convierte en:

MYPASSWORD='mypassword'

sshpass -p $MYPASSWORD ssh [email protected] "cp /home/myuser/file1 /path/to/dest/"

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S cp /home/myuser/file1 /etc/sub/folder/"

Si ejecuto el script, el último comando del script genera la siguiente solicitud:

[sudo] password for myuser:

Entonces el script detiene su ejecución y espera la sudocontraseña.
¡No quiero esto!

Un intento mio

Si ejecuto el comando:

> echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/

directamenteen un terminal del sistema remotoFunciona y copia file1sin /etc/sub/folder/pedir la sudocontraseña.

Pero si ejecuto el siguiente comandoen mi sistema local:

sshpass -p 'mypassword' ssh [email protected] "echo mypassword | sudo -S -s cp /home/myuser/file1 /etc/sub/folder/"

¡no funciona!

Mi pregunta

¿Hay alguna forma de evitar la introducción de la contraseña mediante sudoel teclado? ¿Es posible enviar la contraseña automáticamente?

Respuesta1

He encontrado una solución/solución.

Usar un archivo que almacene temporalmente la contraseña desudo

Modifiqué el script ejecutado en el sistema local agregando algunos comandos que se muestran a continuación:

  • creación de un archivo de texto en la carpeta del sistema remoto mediante el echocomando; se llama al archivo password.txty contiene sólo la contraseña ( "mypassword") del usuario myuser.
  • el archivo password.txtes directo como entrada al sudocomando por parte del operador <.
  • ejecución del comandosudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/
  • eliminación del archivo /home/myuser/password.txt del sistema remoto

Esta solución se utiliza en un entorno de desarrollo seguro, por lo que no infringe ninguna restricción de seguridad.

el nuevo guión

Con estas instrucciones el script ejecutado en el sistema local queda:

MYPASSWORD='mypassword'

# creation of the file password.txt on the home folder of the remote system
sshpass -p $MYPASSWORD ssh [email protected] "echo $MYPASSWORD > /home/myuser/password.txt"

# execution of the command which needs the sudo privileges (on remote system)
sshpass -p $MYPASSWORD ssh [email protected] "sudo -S < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/"
# The '<' directs file passowrd.txt as input to sudo   ===========================

# deletion of the file password.txt
sshpass -p $MYPASSWORD ssh [email protected] rm /home/myuser/password.txt

Suprimir la salida desudo -S

Encontré otra mejora que permite suprimir la salida ( [sudo] password for myuser:) del comando sudo -Sque se envía desde ssh al sistema local.
Basta utilizar el operador &>y el /dev/nulldispositivo como se muestra a continuación:

sshpass -p $MYPASSWORD ssh [email protected] "sudo -S \
  < /home/myuser/password.txt cp /home/myuser/file1 /etc/sub/folder/" &> /dev/null

NotaEn mi sistema local, la supresión de la salida [sudo] password for myuser:funciona mediante las siguientes redirecciones:

  • &>/dev/null
  • >&/dev/null

y esto es normal porque los operadores anteriores son equivalentes (veresta publicaciónen Superusuario).

la represionNo funcionamediante la siguiente redirección:

  • >/dev/null

información relacionada