加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在使用sudo运行的脚本中停止root

发布时间:2020-12-14 01:19:48 所属栏目:Linux 来源:网络整理
导读:有一个命令列表只有在以sudo开头时才会成功. 还有另一个命令列表,只有当用户在没有sudo的情况下运行它们时才会成功. 我想从同一个脚本执行所有这些命令. 我想避免做以下事情: #!/usr/bin/env bashsudo sudo_command_one;sudo sudo_command_two;sudo sudo_co
有一个命令列表只有在以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文档.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读