You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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授权:

  1. 以root身份执行visudo
  2. 添加一行配置:
myUser ALL=(user2) NOPASSWD: /path/only/accessible/to/user2/someScript.sh

这样myUser就能无需密码,直接以user2身份执行该脚本了。

内容的提问来源于stack exchange,提问作者Anthony Garneau

火山引擎 最新活动