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


9

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

#!/bin/bash

touch dummy.txt

このスクリプトを実行すると、ルート保護されるsudoものが作成されます。dummy.txt

私がやりたいことは:

このスクリプトが実行されるのsudoが通常のユーザーであるかどうかに関係なく、ファイルdummy.txtはrootで保護されるべきでありませ


4
「ルート保護」とはどういう意味でも、スクリプトでchownchmodを使用して、必要に応じて所有権と権限を設定できます。
fkraiem 2016年

1
「ルート保護」とはどういう意味かは明確ではありません。rootユーザーのみが読み取り/書き込みができる(たとえば、ファイルのアクセス許可が700のように設定されている)か、またはrootユーザーがファイルの所有者であるということですか?

1
@DoritoStyle混乱して申し訳ありません。ルートが保護され、私は意味rootユーザーがファイルの所有者です。
2016年

回答:


22

および変数をsudo使用してスクリプトが実行されているかどうかをテストし、trueのように実行できます。EUIDSUDO_USERtouchSUDO_USER

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi

2
==文字列の比較に使用されることに注意してください。$EUIDは整数値を返すことになっているので、-ed比較を使用することをお勧めします。 ユーザー名はスペースを使用できるため、$SUDO_USER変数を引用符で囲んでください。そうでなければ、良い答え-これは私が個人的に使用するものです。
Sergiy Kolodyazhnyy 2016年

@steeldriverこれは私が探していたものです。ありがとう!!
2016年

1
スクリプトがsudo -urootとして実行されていることを検出した場合、スクリプト自体を再実行させることができます。OPは、1つのスクリプトに複数のコマンドを含めることについて話しました。ただし、エラーで無限ループが発生しないように注意してください。
Peter Cordes 2016年

1
中に単語分割は[[...]]ないので、ifステートメント@Serg内で変数を引用するのに厳密には必要ありません。-ed誤字だったと思います-eq
Arronical

@Arronicalはい、それはのタイプミスでした-eq[[単語分割がないことを知りませんでした。ありがとう。個人的には、スクリプトの習慣を
守る

9

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


6

デフォルトでは、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_USERsudoが呼び出されたときにのみアクセス可能な変数を使用できます。

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

スクリプトを通常のユーザーとして実行している場合、そのchown部分はまったく必要ないため、&&スクリプトがrootとして実行されている場合のケースをテストするためにifステートメントまたはテストの使用を検討し、これらの行に沿って何かを行うことができます。

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

上記は推奨されるアプローチです。他にも、chmodユーザーとグループの読み取り/書き込み/実行権限を変更するために使用するものなどがありますが、お勧めしません。


お返事をありがとうございます。しかし、QIでは、単純なシナリオを実際に説明したところ、元のスクリプトが多くのファイルを作成することになります。Linuxでは、単にsudoを無視することはできませんか?
2016年

1
@Anonymousを使用してスクリプト全体を実行している場合はsudo、いいえ-無視できません。あなたのオプションは、通常のユーザーとしてスクリプトを実行する(あなたがここでユーザーのファイルを作成しているだけなので、なぜしないのか分かりません)か、私の回答に示すようにファイルの所有権を変更します。
Sergiy Kolodyazhnyy 2016年

これは最も正しい解決策であり、スケールアップがそれほど難しくないはずです。
ヒヨコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.