El siguiente ejemplo es un SCRIPT realizado con EXPECT para tomarlo como base para ejecutar script remotos y mostrar el resultado por pantalla. Suponiendo que al script lo grabamos con el nombre remoto.sh, para ejecutarlo sería :
bash remoto.sh «ps -fea | grep componente»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
!/bin/bash HOST="servidor" USER="usuario" PASS="password" CMD=$@ VAR=$(expect -c " spawn ssh -o StrictHostKeyChecking=no $USER@$HOST $CMD match_max 100000 expect \"?assword:\" send -- \"$PASS\r\" send -- \"\r\" expect eof ") echo "===============" echo "$VAR" |
Entre las comillas se debe ingresar el comando que se desee ejecutar en el servidor remoto.-
Excelente reseña funciona perfecto lo utilice para realizar monitoreo sobre equipos.
asi es funciona excelente.
Hola, buen aporte, yo utilice tu shell pero para conectarme a un SFTP, pero no logro ejecutar el comando get para copiar los archivos del servidor remoto a mi servidor local, ¿me pudieras hacer favor de indicarme como se puede hacer?, ya intente de varias formas, pero no lo he logrado. Si se conecta al server remoto.
VAR=$(expect -c »
spawn sftp -o «BatchMode=no» $USER@$HOST «:/ruta/»
expect -nocase \»?assword:\»
send — \»$PASS\r\»
send — \»get archivo.txt\r\»
send — \»\r\»
expect eof
«)
echo «===============»
echo «$VAR»
Saludos.
Puedes probar poniendo la ruta completa del comando Get.
Necesitas indicarle en el expect que prompt aparece cuando envias el password,
asi lo probe y funciono, tambien le quite la opcion “BatchMode=no” porque si espera un usuario y password
spawn sftp $USER@$HOST
match_max 100000
expect \»?assword:\»
send — \»$PASS\r\»
expect \»sftp>\» <—el expect espera este prompt y luego envia el get
send — \"get archivo.txt\r\"
#send — \"\r\"
expect eof
")
echo "==============="
echo "$VAR"
Necesitas indicarle en el expect que prompt aparece cuando envias el password,
asi lo probe y funciono, tambien le quite la opcion “BatchMode=no” porque si espera un usuario y password
spawn sftp $USER@$HOST
match_max 100000
expect \»?assword:\»
send — \»$PASS\r\»
expect \»sftp>\» <—el expect espera este prompt y luego envia el get
send — \"get archivo.txt\r\"
#send — \"\r\"
expect eof
")
echo "==============="
echo "$VAR"
o asi tambien te funciona
#!/bin/bash
HOST=»192.168.1.65″
USER=»amongus»
PASS=»pass1″
CMD=$@
VAR=$(expect -c »
spawn sftp $USER@$HOST
match_max 100000
expect \»?assword:\»
send — \»$PASS\r\»
expect \»sftp>\»
send — \»$CMD \r\»
#send — \»\r\»
expect eof
«)
echo «===============»
echo «$VAR»
y lo ejecutas con
bash remoto.sh «get archivo.txt»
Como puedo dejar abierta la conexion?
Se conecta al servidor, pero necesito que me de el acceso, no solo que ejecute un comando, sino que automatice la conexion a varios servidores
Me podrías mostrar como agregar varias conexiones a servidores? Y mantenerlas abiertas, quiero automatizar la conexión a varios servidores
La forma en que lo hago, cuando necesito trabajar en varios servidores es la siguiente:
En un archivo (servi.txt) pongo en una lista todos los servidores a los que deseo conectarme (uno por línea).
El primer script es el bash; lee el archivo de servidores y ejecuta el segundo Srcipt EXPECT pasándole como parámetros el servidor, usuario y password. Cuando finalizo de trabajar en uno; salgo con el comando “exit” y automáticamente me conecta al siguiente servidor. Esto hasta que lee completamente el archivo de servidores :
Espero sea de utilidad.
———————————————————————————————-
#!/bin/bash
servi=»/usr01/servi.txt»
for ser in $(cat $servi) ; do
echo «Conectado a $ser»
/usr/local/bin/expect /usr01/conecta2.exp $ser usuario password
echo «»
done
————————————————————————————————
#!/usr/local/bin/expect
set ip [lindex $argv 0]
set usuario [lindex $argv 1]
set contrasena [lindex $argv 2]
set timeout 3
log_user 0
spawn ssh -o StrictHostKeyChecking=no $usuario@$ip
expect «*?assword:*»
send «$contrasena\r»
expect «*»
interact