使用 sudo 运行部分命令行命令

使用 sudo 运行部分命令行命令

我执行这个

time sudo nice -n -20 bash myscript.sh

然后 myscript.sh 处理一些文件并使用结果创建文件。

这样做有两个问题:

  • 该脚本以 root 身份运行
  • 生成的文件归 root 所有

我不希望脚本以 root 权限运行(以防我在其中犯了一个错误,它开始删除重要的内容等),并且输出应该归我所有。

我需要 sudo 来更改脚本的优先级,但如何以普通用户身份运行脚本?

答案1

您必须将 uids 和 gids 切换回来。您可以使用zsh分配来将$USERNAME所有 uid、euid、gids 等更改为相应用户的用户,就好像该用户刚刚登录而没有进行任何其他更改一样。

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,$EGID变量,除了 gid 还具有有关补充 gids 的信息(并且还可以执行通过它自己):zsh-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相反的方法,尽管要注意其参数的处理非常不可移植(并且通常无法按照我的经验记录),有些人将数字视为增量,一些作为新值:

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

将更改进程运行的良好性sh,然后在同一进程中继续运行bash,而无需更改 uids/gids 或进程sh。这里reniceutil-linux 2.38.1 开始,最好不要-20将其减少 20喜欢nice -nnice()做。

答案2

您可以使用 更改用户模式下脚本的友好性sudo renice,这应该会更改脚本及其随后创建的任何子进程的友好性(感谢@StéphaneChazelas 纠正我的问题)。

请注意 的-g(进程组)选项renice。由于脚本已经在运行,我们还需要将良好性应用于可能已经启动的任何 C++ 子进程。

$ cat nicely
#! /bin/bash

for (( j = 0; j < 10; j++ )); do
    printf 'Pid %d nice %d\n' $$ $( nice )
    sleep 3
done

$ ./nicely & Pid=$!; sudo renice -n -14 -g "${Pid}"; wait
[1] 5665
Pid 5665 nice 0
[sudo] password for paul: Pid 5665 nice 0
Pid 5665 nice 0
*******Pid 5665 nice 0
 
5665 (process ID) old priority 0, new priority -14
Pid 5665 nice -14
...
Pid 5665 nice -14
[1]+  Done                    ./nicely
paul@paul-RV415-RV515 ~ $ 

相关内容