2012-08-09 15 views
8

Próbuję uruchomić polecenia jako inny użytkownik i odczytać dane wejściowe jako ten użytkownik. Z jakiegoś powodu skrypt nie zatrzymuje się na komendzie read, nie jestem pewien, dlaczego. Oto przykład skryptu:Skrypt Bash nie czeka na odczyt

#!/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" 

Wszelkie pomysły, dlaczego nie jest to zatrzymanie na read name lub read email?

Odpowiedz

20

read czyta ze stdin, a bash dziedziczy jego stdin z sudo, który pochodzi z heredoc. Jeśli chcesz, aby pochodziła gdzie indziej, musisz być jednoznaczna. Na przykład:

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

To nie działa z sudo, ponieważ sudo zamyka niestandardowe deskryptory plików. Ale sudo nie zamyka stderr, więc jeśli można uciec z ponownym że deskryptor pliku, może być w stanie to zrobić:

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

ale to chyba o wiele bezpieczniejsze zrobić:

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

Świetna odpowiedź, dzięki. – alukach

0

Można czy ten skrypt sprawdza, czy działa on jako sudo, a jeśli nie, czy uruchamia się za pomocą 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