在使用sudo运行的脚本中,停止使用root身份。

4

有一些命令只有在前面加上sudo时才能成功执行。
也有一些命令只有在用户不使用sudo时才能成功执行。

我想从同一个脚本中执行所有这些命令。
我希望尽可能避免以下操作:

#!/usr/bin/env bash
sudo sudo_command_one;
sudo sudo_command_two;
sudo sudo_command_three;
non_sudo_command;
sudo sudo_command_four;

原因是sudo有时间限制,而这些命令可能需要很长时间。我不想时不时地重新输入sudo密码。我可以无限期地延长sudo的超时时间,但如果有更简单的方法,我也宁愿避免这样做。

因此,我将以以下方式运行脚本:

sudo ./script

但这将阻止非sudo命令的工作。
我需要哪些缺失的命令:

#!/usr/bin/env bash
sudo_command_one;
sudo_command_two;
sudo_command_three;
[turn sudo off for a moment]
non_sudo_command;
[ok, turn sudo back on]
sudo_command_four;

很不幸,命令的顺序不能重排,以便我先运行所有sudo命令,然后再运行所有非sudo命令(或者反过来)。


你可以添加 sudo -v 命令来更新 sudo 凭证的时间戳。 - Paul
2个回答

7
在由sudo运行的脚本中使用:

su -c "shell command; shell command" $SUDO_USER 

在该脚本中,可以作为调用sudo命令的普通用户执行命令。

这是因为sudo会将环境变量SUDO_USER设置为原始用户名。

如果您有一堆要以原始用户身份运行的命令,则可以使用hereis文档。

以下是一个示例脚本文件,仅供参考:

myscript.sh

#!/bin/bash
echo "Part 1"
echo "now running as:"
whoami
echo "SUDO_USER is:"
echo $SUDO_USER
su $SUDO_USER <<EOF
echo "Part 2"
echo "now running as:"
whoami
echo "SUDO_USER is:"
env | grep ^SUDO_USER
sleep 5
EOF
echo "Part 3"
echo "now running as:"
whoami
echo "SUDO_USER is:"
echo $SUDO_USER

以下是在执行sudo ./myscript.sh命令后的输出结果:

Part 1
now running as:
root
SUDO_USER is:
paul
Part 2
now running as:
paul
SUDO_USER is:
SUDO_USER=paul
Part 3
now running as:
root
SUDO_USER is:
paul

警告:此技术在嵌套sudo时效果不佳。 如果sudo被嵌套两次,例如:

sudo su

echo $SUDO_USER
---> me

sudo su
echo $SUDO_USER
---> root

SUDO_USER会返回root,而不是原始用户名。 su $SUDO_USER将继续以root身份运行。要避免这种情况,请小心操作,这样就可以正常工作。


1
这是我在脚本中运行它的方式。
#! /bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root";
   exit 1;
else
    NON_ROOT_USER=$(who am i | awk '{print $1}');
    echo "root ran this echo.";
    sudo -u $NON_ROOT_USER echo "$NON_ROOT_USER ran this echo.";
fi

sudo ./script.sh


很酷。有趣的是,“who am i”和“whoami”返回不同的结果。 - Trevor Hickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接