次の行を含むシェルスクリプトがあります。
CURRENT_USER=${USER}
echo $CURRENT_USER
su
echo switch to `who am i`
2行目を実行した後、シェルはrootパスワードの入力を求めます。正しいパスワードを入力して管理者としてログインした後、最後の行は実行されません。
この問題の原因は何ですか?
答え1
su
新しいシェルを起動します(または別のコマンドを実行します)。現在、シェルのUIDを魔法のように切り替えることはありません。パスワードを入力した後に入力すると、スクリプトがステートメントをexit
実行し続けることがわかりますecho
(ただし、ルートではなく元のユーザーとして)。
ルートとして実行する必要があるスクリプト部分を別のスクリプトに入れますsu
。
答え2
シェルに関する限り、su
これは他のコマンドと同じです。引数なしで実行すると、su
ルートパスワードの入力を求められ、通常どおりインタラクティブシェルが呼び出されます。対話型シェルが終了すると、スクリプトは次のコマンドに進みます。
あまりにも多くの引用問題なしでコマンドを渡すsu
最も簡単な方法は、次を使用することです。ここのドキュメント。引用が面倒なことを避けるには、リテラルheredoc(引用符が閉じるタグを入力する場所)を使用してください。親スクリプトのシェル変数は、ルートとして実行されるスクリプトでは使用できません。環境変数(エクスポート)のみ使用できます。例:
ADD_USER=john
ADD_TO_GROUP=fiddlers
export ADD_USER ADD_TO_GROUP
su <<'EOF'
adduser "$ADD_USER" "$ADD_TO_GROUP"
EOF
# more commands executed as the original user
答え3
実行すると、su
新しいコマンドが開始されます(デフォルトではシェル)。
これを行うには、次の手順を試してください。
#!/bin/bash
if [ `id -u` = 0 ]; then
# Do our real work as root
else
su -c $0
fi