Estoy escribiendo un script bash para instalar un pequeño software que estoy desarrollando. Ese script se ejecuta sudo
(como root), pero algunos de los comandos que ejecuta el script deben (o deberían) ejecutarse con un usuario normal cuyo nombre mantengo en la $userName
variable. La mayoría de los comandos son sencillos y su -c "/what/ever/command" $userName
funcionan bastante bien.
Sin embargo, uno de esos comandos que no quiero ejecutar root
me va a preguntar cosas (en realidad, solo una cosa, pero muchas veces: si debe sobrescribir un archivo existente o no). Ese comando al que puedo llamar " baaad_command
" no tiene ninguna opción para proporcionar una respuesta predeterminada (no hay " --assume-no
" ni nada por el estilo).
La única opción que veo factible es utilizar elesperarcomando y responda " n\r
" cada vez que el comando genere una cadena que comience con " Overwrite
", quiero que mi secuencia de comandos responda no (es decir, " n\r
") tantas veces como baaad_command solicite"Overwrite... ? [y/n]"
He probado muchas combinaciones diferentes de su, spawn, expect... sin suerte.
Este es mi último intento hasta ahora:
#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
if [[ -n "$userName" ]] ; then
spawned=$(su -c expect -c "
spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
expect {
Overwrite: { send \"n\r\"; exp_continue }
eof { exit }
}
" )
else
echo "Don't have a non-root username to install baaad_command with. Skipping"
exit 3
fi
else
echo "$destinationFolder directory not found in $(pwd). Can't continue"
exit 2
fi
No tiene nada destacable respecto a los otros 200 intentos... simplemente resulta que es el último.
Cualquier pista será muy apreciada. Gracias de antemano.
Respuesta1
Probablemente necesites usar su -c 'expect -c "spawn ..."'
-- ten en cuenta las comillas adicionales.