web-dev-qa-db-ja.com

bashスクリプトでSudoを無視する

私は小さなbashスクリプトを持っています:

#!/bin/bash

touch dummy.txt

このスクリプトをSudoで実行すると、dummy.txtが作成され、root protectedになります。

私がやりたいことは:

このスクリプトがSudoを使用して実行されるか、通常のユーザーを使用して実行されるかに関係なく、ファイルdummy.txtnotルート保護される必要があります。

9
Anonymous

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
22
steeldriver

スクリプトが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関連のバグをすべて修正する必要があります。それは言うまでもなく、将来性のあるソリューションではありません。

10

デフォルトでは、ルート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を使用してユーザーとグループの読み取り/書き込み/実行権限を変更するなど、他にもありますが、お勧めしません。

6