2012-08-09 92 views
8

我试图以另一个用户的身份运行命令并以该用户的身份读取输入。由于某些原因,脚本不会在read命令中暂停,我不确定原因。下面是脚本的例子:Bash脚本不等待阅读

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

任何想法,这是为什么不停止在read nameread email

回答

20

read正在从stdin读取,bash正在从hedooc继承其来自sudo的stdin。如果你想让它来自其他地方,你需要明确。例如:

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

这不适用于sudo,但是,因为sudo关闭了非标准的文件描述符。但须藤不关闭标准错误,所以如果你能摆脱重复使用的文件描述符,你可能能够做到:

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

但它可能是更安全的事:

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

很好的答案,谢谢。 – alukach 2012-08-09 22:36:20

0

你能让这个脚本检查它是否以sudo方式运行,如果不是,使用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