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

readstdin から読み取り、bashsudo から stdin を継承しています。これはヒアドキュメントから来ています。他の場所から取得したい場合は、明示する必要があります。例えば:

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 に答える