[?] Bash Script SSH

Iniciado por MeCraniDOS, 14 Diciembre 2013, 12:00 PM

0 Miembros y 1 Visitante están viendo este tema.

MeCraniDOS

Buenas, pues tengo un pequeño problemilla, estoy intentando ejecutar un comando en otro pc sin ser root vía SSH, con "sudo $Comando", pero no se como modificar el script  :rolleyes:

Código (bash) [Seleccionar]
#!/bin/bash
HOST="Aqui la IP"
USER="Aqui el Usuario"
PASS="Aqui la Contraseña del Usuario"
CMD=$@
VAR=$(expect -c "
spawn ssh -o StrictHostKeyChecking=no $USER@$HOST sudo $CMD
match_max 100000
expect \"*?assword:*\"
send -- \"$PASS\r\"
send -- \"\r\"
send -- \"$PASS\r\"
send -- \"\r\"
expect eof
")
echo "==============="
echo "$VAR"


La salida que da es:

Citar?@Ubuntu:/home/?/Desktop$ ./System.sh "reboot"
===============
spawn ssh -o StrictHostKeyChecking=no Usuario@IP sudo reboot
Usuario@IP password:
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
Sorry, try again.
sudo: 3 incorrect password attempts

A ver si me pueden ayudar...  :huh: :huh:

PD: Para que funcione tenemos que tener expect instalado  :silbar:


Citarapt-get install expect

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

jdomgo3

#1
Mmm... efectivamente, tienes que tener instalado spawn. Yo para hacer esto que tu dices simplemente uso una conexión SSH o RSH en shell script, tan sencillo como esto:

Código (BASH) [Seleccionar]
MAQUINA="123.123.123.123"
echo "Mi Linux remoto es: $(rsh $MAQUINA cat /etc/redhat-release)"


Si quieres hacerlo con SSH en vez de con RSH es igual pero le tienes que pasar password y/o puerto, y mi recomendación es que se lo pases como argumentos, y jamás almacenes un dato así a fuego en un script.

Sin embargo, yo en mi trabajo suelo utilizar mucho mas lenguajes como C o como Tcl para hacer estas cosas, sobre todo si el script ha de interactuar en función de la respuesta del último comando lanzado en remoto, y para ello uso la librería "expect", sobre todo en Tcl, que me gusta un montón, por ejemplo:

lista_maquinas.txt
Código (TXT) [Seleccionar]

maquina1
maquina2
maquina3


run.sh
Código (BASH) [Seleccionar]

#!/usr/bin/ksh

if [ $# -ne 1 ]
then
echo " ERROR: Falta especificar la password de tu usuario personal."
exit
fi

for i in `cat lista_maquinas.txt`
do
./expect.tcl $i $1 > /dev/null 2>&1
done


expect.tcl
Código (TCL) [Seleccionar]

#!/usr/bin/expect -f

set host [lindex $argv 0]
set password [lindex $argv 1]
set prompt "(%|% | %|~|~ | ~|#|# | #|>|> | >|\\$|\\$ | \\$)$"
spawn ssh $host
expect {
"assword:" {
send "$password\n"
}
-re $prompt {
send "echo \" - Estoy haciendo un \\\"uname\\\": \$(uname)\"\n"
expect -re $prompt
send "banner \"Prueba\"\n"
expect -re $prompt
}
}
set tpid [exp_pid -i $spawn_id]
exec kill -9 $tpid
wait -i $spawn_id


No te asustes con la declaración de la variable prompt en mi ejemplo Tcl, simplemente contemplo todas las posibilidades de prompt que me puedo encontrar en casi cualquier máquina Unix. Espero que te sirva, la verdad es que el Tcl y el Shell Script lo utilizo muchisimo por que es super fácil.

Un saludo.