Linux Shell脚本部署应用:如何切换用户并运行指定脚本?
解决SSH切换用户执行脚本后无法获取反馈的问题
我来帮你搞定这个麻烦!你现在遇到的问题根源是sudo su - user2会启动一个交互式shell,导致脚本跑完后停留在user2的登录会话里,还拿不到脚本的执行结果。下面给你几个实用的解决办法:
方法1:直接用sudo指定用户执行命令
这是最简洁的方式,不用绕su,直接让sudo切换到user2执行脚本:
ssh -t myUser@$remotehost "sudo -u user2 /path/only/accessible/to/user2/someScript.sh"
- 这里的
-u user2告诉sudo以user2的身份执行后面的脚本 - 保留
-t参数是因为sudo可能需要你输入myUser的sudo密码,伪终端能确保密码输入流程正常
方法2:用su的-c参数执行命令(如果必须用su)
如果你一定要通过su切换用户,记得用-c参数让su执行完命令就退出,而不是停留在交互式shell:
ssh -t myUser@$remotehost "sudo su - user2 -c '/path/only/accessible/to/user2/someScript.sh'"
-c后面的单引号要包裹完整的脚本路径,避免本地shell解析路径里的特殊字符su -会加载user2的登录环境变量,和你手动切换的效果一致,执行完脚本就自动退出会话
方法3:模拟user2登录环境执行脚本
如果脚本依赖user2的完整登录环境(比如.profile里的配置),可以用sudo的-i参数:
ssh -t myUser@$remotehost "sudo -i -u user2 /path/only/accessible/to/user2/someScript.sh"
-i参数会模拟user2登录系统的环境,相当于手动执行su - user2的效果,执行完脚本直接退出
额外优化建议
如果要让脚本完全自动化(不用手动输密码),可以修改sudoers文件给myUser授权:
- 以root身份执行
visudo - 添加一行配置:
myUser ALL=(user2) NOPASSWD: /path/only/accessible/to/user2/someScript.sh
这样myUser就能无需密码,直接以user2身份执行该脚本了。
内容的提问来源于stack exchange,提问作者Anthony Garneau




