
以下のスクリプト(test1.sh)があります。前提条件としてこのスクリプトを入力している間に複数のパッケージをインストールする必要があるため、rootとして実行する必要があります。 $EUID 値は 0 であってはなりません。変更に役立つことができますか?この$ EUID値
test1.sh
#!/usr/bin/env bash
if [[ $EUID -eq 0 ]]; then
echo "This script must be run as nonroot user. Otherwise, couple of test
cases will fail."
exit 1
fi
答え1
zshシェルのみが有効なユーザー変更をサポートします。これは、$EUID
以下のシステムコールと呼ばれる特殊変数の値を変更することによって行われますsetresuid()
。またUID
、変数を設定して実ユーザー ID を設定したり、変数を割り当ててUSERNAME
ログインをシミュレートしたり、実ユーザーと実効 uid に加え、システム・ユーザーに基づいて実グループ ID と補助グループ ID リスト・データベースを設定したりできます。
Bash シェルでは$EUID
読み取り専用で、実行中のプロセスの実効ユーザー ID 値を反映bash
し、変更することはできません。
では、ユーザーIDを変更するには、bash
別のコマンド(たとえばperl
、、zsh
)を実行する必要があります。su
sudo
たとえば、
#! /usr/bin/env bash
if (( EUID == 0 )); then
exec zsh -c 'EUID=123; exec bash -p "$0" "$@"' "$0" "$@"
# or
exec perl -e '$> = 123; exec @ARGV' bash -p "$0" "$@"
fi
zsh
euid を変更すると、スクリプトは euid 123 で再度実行されます。
有効なユーザーIDのみを設定してください。したがって、この-p
オプションは、bash
有効なuidが実際のユーザーIDと異なるものを好まない。
UID=123
実際のuid()を変更したり、uid / gidがユーザーデータベース()と一致する通常の状況になるように実際のログインをシミュレートした方が良いでしょう。これには、またはUSERNAME=realuser
以下を使用することもできます。su
sudo
exec su realuser -c 'exec "$0" ${1+"$@"}' bash "$0" "$@"
(仮想ログインシェルはrealuser
Bourneに似ています)
exec sudo -u realuser bash "$0" "$@"
(sudo
単にuid / gidを変更する以上の可能性があります。)