Bash脚本切换用户后无法继续执行后续命令的问题解决
解决su切换用户后脚本中断问题,优化Linux用户管理脚本
问题原因
你脚本里的su $username会启动一个交互式登录shell,原脚本会暂停执行,直到你手动退出这个新用户的shell,才会继续跑后面的pwd——这就是为啥切换后脚本停住、看不到pwd输出的原因。
核心需求的两种解决方式
根据你要“切换后持续在新用户环境执行”的需求,分两种场景处理:
场景1:执行指定命令后回到原脚本
如果只是想以新用户身份执行几个命令(比如pwd、查看环境变量),执行完回到原脚本,用su - $username -c来批量执行命令:
read -p "切换到用户$username吗?[yn]" answer if [[ $answer =~ ^[Yy]$ ]] ; then # 用-c参数指定要执行的多个命令,用分号分隔 su - "$username" -c "pwd; echo 当前用户: \$USER; echo 家目录: \$HOME" else echo "未切换到用户$username" fi
注意:
-参数会加载新用户的环境变量,和直接登录该用户的环境一致;命令里的变量要加转义符\,避免被原脚本提前解析。
场景2:直接进入新用户交互式shell,后续脚本(若有)在新环境执行
如果想直接进入新用户的交互式shell,并且让脚本后续代码都在该用户身份下执行,用exec su - $username——这个命令会替换当前脚本进程为新用户的shell,后续脚本代码(如果有的话)都会以新用户身份运行:
read -p "切换到用户$username吗?[yn]" answer if [[ $answer =~ ^[Yy]$ ]] ; then echo "即将切换到用户$username,退出shell会回到原环境" exec su - "$username" # 下面的代码会在新用户shell退出后才执行(如果需要的话) echo "已退出用户$username" else echo "未切换到用户$username" fi
完整优化后的用户管理脚本
顺便把你脚本里的其他问题也优化了:
- 删掉多余的
$foo变量(脚本里这个变量未定义,属于无效内容) useradd加-m参数自动创建家目录- 用
sudo passwd $username避免普通用户无权限修改其他用户密码 - 输入判断支持大小写Y/y
- 增加命令执行失败的提示
#!/bin/bash # 创建用户 read -p "请输入要创建的用户名: " username if sudo useradd -m "$username"; then echo "用户$username创建成功" else echo "用户$username创建失败,请检查权限或用户名是否已存在" exit 1 fi # 添加到wheel组(sudo权限组) read -p "是否将$username添加到wheel组?[yn]" answer if [[ $answer =~ ^[Yy]$ ]] ; then if sudo usermod -aG wheel "$username"; then echo "$username已添加到wheel组" else echo "添加到wheel组失败" fi else echo "$username未加入wheel组" fi # 设置密码 read -p "是否为$username设置密码?[yn] " answer if [[ $answer =~ ^[Yy]$ ]] ; then sudo passwd "$username" else echo "未为用户$username设置密码" fi # 切换用户 read -p "是否切换到用户$username?[yn]" answer if [[ $answer =~ ^[Yy]$ ]] ; then echo "正在切换到用户$username..." exec su - "$username" else echo "未切换到用户$username" fi
内容的提问来源于stack exchange,提问作者tryhardnoob
相关产品推荐
相关产品推荐

