2012-08-09 16 views
8

Estoy intentando ejecutar comandos como otro usuario y leer la entrada como ese usuario. Por alguna razón, el script no se detiene en el comando read, no estoy seguro de por qué. Aquí está un ejemplo de la secuencia de comandos:La secuencia de comandos de Bash no está en espera en leer

#!/bin/bash 
username='anthony' 
sudo -H -u "$username" bash << 'END_COMMAND' 

# Commands to be run as new user 
# ------------------------------- 

echo "#! Running as new user $USER..." 


echo "#! Gathering setup information for $USER..." 
echo -n "Enter your name and press [ENTER]: " 
read name 
echo -n "Enter your email and press [ENTER]: " 
read email 
END_COMMAND 

echo "Done" 

¿Alguna idea de por qué esto no se detiene en read name o read email?

Respuesta

20

read está leyendo de stdin, y bash hereda su stdin de sudo, que proviene del heredoc. Si quieres que venga de otro lado, debes ser explícito. Por ejemplo:

bash 3<&0 << 'END_COMMAND' 
... 
read <&3 
... 

Esto no funciona con sudo, sin embargo, ya que sudo cierra los descriptores de archivos no estándar. Pero sudo no se cierra stderr, lo que si puede salirse con la reutilización de ese descriptor de archivo, es posible que pueda hacer:

sudo -H -u "$username" bash 2<&0 << 'END_COMMAND' 
... 
read -u 2 email 
... 

pero es probable que sea mucho más seguro que hacer:

sudo -H -u "$username" bash << 'END_COMMAND' 
... 
read email < /dev/tty 
... 
+0

Gran respuesta, gracias. – alukach

0

Puede usted hacer que este script verifique si se está ejecutando como sudo, y si no es así, ¿se ejecuta él mismo con sudo?

#!/bin/bash 
username='anthony' 

if [[ -z "${SUDO_USER}" ]]; then 
    exec sudo -H -u "${username}" -- $0 
fi 

echo " 
# Commands to be run as new user 
# ------------------------------- 
" 
echo "#! Running as new user $USER..." 

echo "#! Gathering setup information for $USER..." 
echo -n "Enter your name and press [ENTER]: " 
read name 
echo -n "Enter your email and press [ENTER]: " 
read email 
Cuestiones relacionadas