En Ubuntu 16.04, usando VS Code, quiero ejecutar un script local en un servidor remoto con sudo
privilegios.
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.sh
script que uso para ejecutar local.sh
de 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.sh
en sudo
el 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 -t
como 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 expect
y 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"
expect
simula una sesión interactiva. El spawn
comando se ejecuta ssh -l $user $remote
y los siguientes comandos interactúan con él. El expect
comando espera hasta que el texto especificado aparezca en la salida y luego send
envía el texto al host remoto. Puede encontrar más en el enlace especificado en la otra respuesta.