linux - 停止在使用 sudo 运行的脚本中间成为 root

标签 linux bash shell root sudo

有一个命令列表,只有在它们以 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 运行的脚本中,使用:

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

在该脚本中以调用 sudo 的普通用户身份执行命令。

这是有效的,因为 sudo 将环境变量 SUDO_USER 设置为原始用户名。

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

这是一个示例脚本文件作为概念证明:

我的脚本.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 身份运行。小心避免这种情况,它应该可以正常工作。

关于linux - 停止在使用 sudo 运行的脚本中间成为 root,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27853808/

相关文章:

linux - 运行 db2icrt 时 DB2 实例创建失败

linux - 通过从原始 svn 仓库中获取所有 svn 部分来克隆一个 git-svn 仓库

c - 如何在 Linux 上实现字符串命令输出以及执行同一二进制文件

bash - 将文件的内容通过管道传输到 ls

bash - 如何将第一个参数与 getopts 的参数分开?

arrays - 在 shell 脚本中使用 awk 内的数组

php - 我如何知道命令行中的任务何时完成?

bash - 如何在 bash/batch 脚本中递减浮点变量

java - 如何从 Java 调用 Linux shell 命令

linux - 了解 LFS 环境设置