bashスクリプトでのsudoの使用に関するベストプラクティス


11

私は長い間実行されているbashスクリプトを持っていますが、少数のコマンドをrootとして実行する必要がありますが、ほとんどのコマンドはsudoの前に通常のユーザーとして実行する必要があります。

いくつかの方法を考えましたが、それぞれにいくつかの問題があります

方法1:ファイル内でsudoを使用する

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

コードの記述方法から、これは見栄えが良いでしょう。sudorootで実際に実行する必要のあるいくつかのステートメントの前に記述されていsudoますが、各呼び出し間の時間が長すぎる場合はsudo、パスワードを要求されます。また、sudo無効なパスワードなどにより、の最初の実行が失敗した場合でも、残りのスクリプトは実行されます。

方法2:sudoを使用してファイルを呼び出し、必要に応じて元のユーザーに戻す

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

su username -cほとんどすべての行の前に追加する必要があるので、これも面倒です。また、後で元のユーザー名を見つけることsudoは可能ですが、面倒です。

もっと良い方法はありますか?

編集:私が話していることを示すために、ここでは小さな無意味なスクリプトのみを投稿しました。実際のスクリプトには、sudo(サービスの開始と停止)を必要とする行と、sudoがなくても問題にならない行と、sudoなしで実行する必要のある行がたくさんあります。


4
これが必要になることはほとんどありません。ほとんどの場合、sudo昇格したアクセス許可が必要な場合は、スクリプトを実行するだけです。ただし、su username -cを実行するように切り替える意味はありませんecho。つまり、これは[XY]のように聞こえます。スクリプトを実際に実行して、ユーザーを頻繁に切り替える必要があると思われる理由を編集して説明できますか?
terdon 2017

1
@ElderGeek間違ったリンクを貼り付けましたか?それは関連しているようにも見えません。これはおそらく、スクリプト内で「sudo」コマンドを実行するにはどうすればよいですか?しかし、私はOPがもう少し説明できることを望みます。
terdon 2017

@terdonそう思われるでしょう。清掃。
オタク長老2017

これは単なるスクリプト例です。ここに200行以上のスクリプトを貼り付けたくありませんでした。詳細については回答を編集します。
ダッカロン2017

で説明されている検証オプションを検討しましたman sudoか?-v, --validate 'ユーザーのキャッシュされた資格情報を更新し、必要に応じてユーザーを認証します。sudoersプラグインの場合、これにより、デフォルトでsudoタイムアウトがさらに15分間延長されますが、コマンドは実行されません。すべてのセキュリティポリシーがキャッシュされた資格情報をサポートするわけではありません。(十分に頻繁に実行する場合、sudo認証はタイムアウトしないはずです。)
sudodus '25 / 07/25

回答:


5

方法2については、関数を使用する方が簡単です。例えば:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERsudoerのユーザー名です。$(logname)代わりに使用することもできます。

私のマシンで実行:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

を読むとman sudoers、次のようになります。

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

したがって、次のregularコマンドmachine1を使用するcommand1command2、パスワード認証なしで、ホスト上でrootとして実行することができます。

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

man -k sudo詳細については、それぞれをお読みください。


0

多分これは助けることができます:

chmod 775 yourscript.sh

次に、スクリプト内でsudoを使用できます(パスワードプロンプトなし)。また、スクリプト内の他のコマンドにsudoを使用できません。


私はそれがうまくいかないことを恐れています。chmod 775ファイルの実行のみを許可し、ファイルを実行しているユーザーまたはその権限を変更しません。
ダッカロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.