%20en%20un%20servidor%20remoto.png)
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 myuser
necesaria para autenticar la sesión ssh.
Mis necesidades
También tengo que ejecutar un cp
comando como el anterior, pero el destino del archivo es una subcarpeta /etc
y necesito sudo
privilegios. 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 sudo
contraseñ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 file1
sin /etc/sub/folder/
pedir la sudo
contraseñ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 sudo
el 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
echo
comando; se llama al archivopassword.txt
y contiene sólo la contraseña ("mypassword"
) del usuariomyuser
. - el archivo
password.txt
es directo como entrada alsudo
comando por parte del operador<
. - ejecución del comando
sudo -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 -S
que se envía desde ssh al sistema local.
Basta utilizar el operador &>
y el /dev/null
dispositivo 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