私は小さなbashスクリプトを持っています:
#!/bin/bash
touch dummy.txt
このスクリプトをSudo
で実行すると、dummy.txt
が作成され、root protectedになります。
私がやりたいことは:
このスクリプトがSudo
を使用して実行されるか、通常のユーザーを使用して実行されるかに関係なく、ファイルdummy.txt
はnotルート保護される必要があります。
Sudo
変数とSudo_USER
変数を使用してEUID
を介してスクリプトが実行されているかどうかをテストし、Sudo_USER
としてtouch
を実行できます。
#!/bin/bash
if [[ $EUID -eq 0 ]] && [[ -n $Sudo_USER ]]; then
Sudo -u "$Sudo_USER" touch dummy.txt
else
touch dummy.txt
fi
スクリプトがroot
として実行されることを意図していない場合、問題を解決する最も安全な方法は、最初からスクリプトの実行を中止することです。
if [ "$EUID" = 0 ]; then
echo "This script must NOT be run as root"
exit 1
fi
必要に応じて、単に中止する代わりに、フォールバックユーザー(たとえば、Sudo -u FALLBACK_USER "$0"
)としてスクリプトを再実行できます。
個々のコマンドの癖を修正しようとすると、スクリプトが不必要に複雑になり、デバッグが難しくなります。変更するたびに、すべてのテストを2回(通常のユーザーとして、次にroot
として)実行し、発生するroot
関連のバグをすべて修正する必要があります。それは言うまでもなく、将来性のあるソリューションではありません。
デフォルトでは、ルートaccoundで作成されたファイルには次のような権限があります。
-rw-r--r-- 1 root root 0 11月 17 23:25 rootfile.txt
ここで、ファイルはrootユーザーおよびrootグループに属し、rootによる読み取りおよび書き込みが可能ですが、他のユーザーによる読み取りのみ可能です。
最も単純なアプローチは、元のユーザーにファイルをchown
戻すだけです。
chown username:group_name dummy.txt
次のように、Sudo
が呼び出されたときにのみアクセス可能な$Sudo_USER
変数を使用できます。
chown "$Sudo_USER":"$Sudo_USER" dummy.txt
通常のユーザーとしてスクリプトを実行している場合は、chown
部分はまったく必要ないため、if-statementまたは&&
testを使用して、スクリプトがルート、およびこれらの行に沿って何かをする:
#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$Sudo_USER":"$Sudo_USER" dummy.txt
上記の方法が推奨されます。 chmod
を使用してユーザーとグループの読み取り/書き込み/実行権限を変更するなど、他にもありますが、お勧めしません。