11

我正在尝试以另一个用户身份运行命令并以该用户身份读取输入。由于某种原因,脚本不会在read命令上暂停,我不确定为什么。这是脚本的一个示例:

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

4

2 回答 2

24

read正在从标准输入读取,并bash从来自heredoc 的sudo 继承其标准输入。如果您希望它来自其他地方,则需要明确。例如:

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

但是,这不适用于 sudo,因为 sudo 会关闭非标准文件描述符。但是 sudo 不会关闭 stderr,因此如果您可以重用该文件描述符,您可以这样做:

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

但这样做可能更安全:

sudo -H -u "$username" bash << 'END_COMMAND'
...
read email < /dev/tty
...
于 2012-08-09T22:29:11.070 回答
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
于 2012-08-09T22:36:57.390 回答