私は長い間実行されている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なしで実行する必要のある行がたくさんあります。
man sudoか?-v, --validate 'ユーザーのキャッシュされた資格情報を更新し、必要に応じてユーザーを認証します。sudoersプラグインの場合、これにより、デフォルトでsudoタイムアウトがさらに15分間延長されますが、コマンドは実行されません。すべてのセキュリティポリシーがキャッシュされた資格情報をサポートするわけではありません。(十分に頻繁に実行する場合、sudo認証はタイムアウトしないはずです。)
sudo昇格したアクセス許可が必要な場合は、スクリプトを実行するだけです。ただし、su username -cを実行するように切り替える意味はありませんecho。つまり、これは[XY]のように聞こえます。スクリプトを実際に実行して、ユーザーを頻繁に切り替える必要があると思われる理由を編集して説明できますか?