Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Expect: Scripts para procesos interactivos

Algunos procesos no pueden automatizarse simplemente con bash, porque requieren la interacción con el usuario, por ejemplo un login de ssh.
En mi caso quería automatizar el montaje de comparticiones de Windows 2003, y aunque podía enviar la clave en el comando, esto queda grabado en los registros de sistema… no me gusta que se registre mi clave:

#!/bin/bash
#
# unidades_red 0.2 - GPL
# (c) 2007-05 Guimi
# http://guimi.net
#
# Ult mod: Guimi 2012-03
#

# Solicitamos la clave
echo  -n "Introduzca su clave de red: "
# Tomamos nota del estado de stty
oldmodes=`stty -g`
# Quitamos el echo para que no se muestre la clave
stty -echo
# Leemos la clave
read clave
# Volvemos a situar stty como estaba
stty $oldmodes
# Generamos un salto de linea
echo

# OJO: LA CLAVE SE REGISTRA
sudo mount -t cifs //SERVIDOR/RECURSO /MONTAJE/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777,password=$clave

Una solución pasa por expect.
# aptitude install expect

#!/usr/bin/expect -f
#
# unidades_red 0.3 - GPL
# (c) 2012-03 Guimi
# http://guimi.net
#
# Ult mod: Guimi 2012-03
#
# Tomamos el primer parametro como clave
#set clave [lrange $argv 0 0]

# Solicitamos la clave de red
send_user "Introduzca su clave de red: "
stty -echo
expect_user -re "(.*)\n" {set clave $expect_out(1,string)}
stty echo
send_user "\n"

# Anulamos la salida por terminal
log_user 0

# Conectamos las unidades de red
spawn sudo mount -t cifs //SERVIDOR/RECURSO /MONTAJE/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777
expect "*assword:"; send "$clave\r"
expect eof

spawn sudo mount -t cifs //SERVIDOR/RECURSO2 /MONTAJE2/ -o username=guimi,workgroup=MIRED,iocharset=utf8,file_mode=0777,dir_mode=0777
expect "*assword:"; send "$clave\r"
expect eof

expect, password
Categoría: GNU/Linux, Prompt