sudoを使用していくつかのコマンドラインコマンドを実行する

sudoを使用していくつかのコマンドラインコマンドを実行する

私はこれを実行します

time sudo nice -n -20 bash myscript.sh

その後、Myscript.shはいくつかのファイルを処理し、その結果を使用してファイルを作成します。

これには2つの問題があります。

  • このスクリプトはrootとして実行されます。
  • 生成されたファイルはルートが所有します。

私はスクリプトがroot権限で実行されることを望まず(誤って重要な内容を削除し始めた場合など)、出力は私のものでなければなりません。

スクリプトの優先順位を変更するにはsudoが必要ですが、通常のユーザーとしてスクリプトを実行するにはどうすればよいですか?

ベストアンサー1

uidとgidを再度切り替える必要があります。zsh割り当てを使用すると、$USERNAMEユーザーが他の変更なしでログインしたばかりのように、すべてのuid、euid、gidなどをそのユーザーのものに変更できます。

sudo nice -n -20 zsh -c 'USERNAME=$SUDO_USER; exec bash ./myscript.sh'

または:

sudo nice -n -20 su "$LOGNAME" -c 'exec bash ./myscript.sh'

または:

sudo nice -n -20 sudo -u "$LOGNAME" bash ./myscript.sh

ただし、これにはPAMスタックを再確認し、状態のリセットを含む環境への追加の変更(必要な場合も必要ない場合もあります)が含まれる場合があります。

それにもかかわらず、以前に持っていたGIDがユーザーデータベースのGIDでない場合は、別のGIDセットで終わることがあります。

リストをそのままリセットするには、別のオプションはの助けを借りてリストを渡すことです。たとえば、perl(with)と同じ変数があります$UID。ただし、 gid には追加の gid に関する情報も含まれています。自体):$GID$EGIDzsh-MEnglishnice

run_with_nice() (
  exec perl -MEnglish -e '
    exec qw(sudo perl -MEnglish -MPOSIX=nice -e), qq(
    nice(shift\@ARGV);
    \$GID = "$GID"; \$EGID = "$EGID"; \$UID = $UID; \$EUID = $EUID;
    exec \@ARGV), "--", @ARGV' -- "$@"
)

次に、次を実行します。

$ run_with_nice -20 ps -o pid,user,group,nice,args
    PID USER     GROUP     NI COMMAND
   6955 chazelas chazelas -20 ps -o pid,user,group,nice,args

またはあなたの場合:

run_with_nice -20 bash ./myscript.sh

この場合、好みを変更する別の方法は、renice反対の方法を使用することです。しかし、パラメータ処理は移植性が非常に低く(私の経験では一般的に文書化されていない)、一部の人々は次のように数字を扱います。 deltas 、一部は新しい値です。

sh -c 'sudo renice -n -20 -p "$$" && exec bash ./myscript.sh'

プロセスがどれだけうまく実行されるかを変更してから、uids / gidsまたはプロセスを変更せずにsh同じプロセスで実行を続けます。ここbashshreniceutil-linux 2.38.1から、セット-2020に減らさない方がいい好きでも、nice -nでもnice()

おすすめ記事