Jenkins控制台sudo命令失效,切换用户后Python命令执行异常求助
问题1:sudo su - admin后仍显示jenkins用户
你遇到的这个情况很典型——Jenkins的Execute Shell步骤里,每条命令都是在原shell进程上下文里按顺序执行的。当你单独跑sudo su - admin时,它会启动一个新的admin用户登录shell,但这个shell执行完就直接退出了,后续的whoami又回到了原来的jenkins用户shell里,自然不会显示admin。
要让命令真正在admin用户环境下执行,你需要把所有需要admin权限的操作,用sudo su - admin -c包裹成一个命令块一次性执行:
# 正确写法:将所有admin用户下的命令放在-c的引号内 sudo su - admin -c "whoami && hostname"
这样执行的话,whoami就会返回admin了,因为整个命令块都在admin的登录shell环境中运行。
问题2:切换用户后找不到python命令
从日志能看出来,jenkins用户的PATH环境变量里没有python的路径,但admin用户的PATH里有。你之前单独切换bash的操作,并没有让后续命令继承admin的环境变量,所以才会报错。
这里有两种可靠的解决方式:
通过
-c命令块继承admin的完整环境su -参数会加载admin用户的登录shell配置(比如~/.bash_profile、~/.bashrc),所以用-c执行命令时,会自动继承admin的PATH等环境变量:sudo su - admin -c " export ADMIN_HOME=/home/admin python /home/admin/scripts/bin/script.py STG "如果你的脚本本身依赖admin的环境变量,也可以直接让admin用户执行脚本:
sudo su - admin -c "/home/admin/scripts/bin/script.py STG"小贴士:如果ADMIN_HOME是固定的,最好提前在admin用户的
~/.bashrc里定义,这样就不用每次手动export了。直接指定python的绝对路径
如果你不想依赖环境变量,可以先在admin用户下用which python找到python的绝对路径(比如/usr/bin/python3),然后直接用路径执行:sudo su - admin -c "/usr/bin/python3 /home/admin/scripts/bin/script.py STG"
完整的Jenkins Execute Shell示例
把所有需要admin执行的逻辑整合到一个命令块里,避免上下文切换的问题:
# 验证当前初始用户 whoami hostname # 切换到admin用户执行所有目标操作 sudo su - admin -c " whoami export ADMIN_HOME=/home/admin python /home/admin/scripts/bin/script.py STG "
这样整个命令块都会在admin用户的登录shell环境下运行,既解决了用户切换失效的问题,也能正确找到python命令。
内容的提问来源于stack exchange,提问作者Ashu

