Bash技巧:主脚本以sudo运行时如何避免指定子脚本继承sudo权限
实现子脚本降权运行的解决方案
你当前使用.(即source命令)加载子脚本的方式,是将目标脚本的代码放到当前主脚本的shell进程中直接执行,而主脚本是通过sudo以root身份启动的,同一进程的运行身份无法中途变更,因此必须调整script3的调用方式,改为以子进程的方式单独执行,再切换回触发sudo的原始普通用户身份。
具体修改方案
修改后的main_script.sh内容如下:
#! /bin/bash set -e . /script1.sh . /script2.sh # 以执行sudo命令前的原始普通用户身份运行script3 sudo -u "$SUDO_USER" bash /script3.sh . /script4.sh
注意事项
- 如果script3本身已经配置了可执行权限,也可以省略bash前缀,直接写为
sudo -u "$SUDO_USER" /script3.sh - 子进程运行的script3默认不会继承主脚本中未export的变量,如果需要传递参数或变量,可以先export对应的变量再调用,示例:
# 主脚本中先导出需要传递的变量 export SHARED_PARAM="测试参数" sudo -u "$SUDO_USER" bash /script3.sh
- 若需要兼容主脚本不是通过sudo启动的场景,可以增加身份判断逻辑,避免运行报错:
# 优先取sudo触发前的用户,不存在则取当前运行用户 TARGET_USER="${SUDO_USER:-$USER}" sudo -u "$TARGET_USER" bash /script3.sh
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

