Ejecute un script local en un servidor remoto con privilegios sudo

Ejecute un script local en un servidor remoto con privilegios sudo

En Ubuntu 16.04, usando VS Code, quiero ejecutar un script local en un servidor remoto con sudoprivilegios.

Aquí está local.sh:

#!/usr/bin/env bash
echo $(ifconfig | grep -Eo "inet addr:([0-9]\.?)*")
echo $(whoami)
echo "$1"

Aquí hay una versión del test.shscript que uso para ejecutar local.shde forma remota:

#!/usr/bin/env bash
remote="example.com"
user="username"
password="remote_password"
ssh "$user@$remote" "bash -s" < ./local.sh "'argument 1'"

Esto funciona bien. Aquí está el resultado, como se esperaba:

$ ./test.sh 
inet addr:123.45.67.89 inet addr:127.0.0.1
username
argument 1

La primera dirección IP es de hecho la dirección IP del servidor.

Sin embargo, quiero ejecutarlo local.shen sudoel servidor remoto. Si reemplazo la última línea con la siguiente línea, se bloquea el acceso:

ssh -tt "$user@$remote" "echo $password | sudo bash -s" < ./local.sh "'argument 1'"

Producción:

$ ./test.sh 
[sudo] password for username: 
Sorry, try again.
[sudo] password for username: 

Si escribo una contraseña después del segundo mensaje, los caracteres aparecen en la Terminal y cuando presiono Enter, no sucede nada, así que uso ^C para cancelar.

Si solo lo uso -tcomo bandera ssh, obtengo el resultado:

Pseudo-terminal will not be allocated because stdin is not a terminal.
sudo: no tty present and no askpass program specified

Si no uso ninguna bandera, obtengo:

sudo: no tty present and no askpass program specified

Otras soluciones que he visto propuestas no han tenido más éxito. Cualquier idea sobre lo que debo hacer será bienvenida.

Respuesta1

Para lograr lo que desea hacer, intente expect
y para mantenerlo seguro, intente cifrar sus archivos.

http://manpages.ubuntu.com/manpages/bionic/man1/expect.1.html

Respuesta2

Instale expecty utilice el siguiente script (no probado, puede haber errores):

#!/usr/bin/expect
set remote "example.com"
set user "username"
set password "remote_password"
spawn ssh -l $user $remote
expect "$ "
send "sudo bash -s < ./local.sh 'argument 1'\r"
expect "password for $user:"
send "$password\r"
expect "$ "
send "exit\r"

expectsimula una sesión interactiva. El spawncomando se ejecuta ssh -l $user $remotey los siguientes comandos interactúan con él. El expectcomando espera hasta que el texto especificado aparezca en la salida y luego sendenvía el texto al host remoto. Puede encontrar más en el enlace especificado en la otra respuesta.

información relacionada