从 ssh 启动的 shell 脚本中的 su 可在其他终端上运行

从 ssh 启动的 shell 脚本中的 su 可在其他终端上运行

抱歉,我的问题很愚蠢,但我不知道如何描述我的情况。

以下是来自詹金斯的日志:

ssh www.myserver.com '/var/lib/tomcat7/webapps/deploy_webapp.sh'
+ id
uid=1004(jenkins) gid=1004(jenkins) groups=1004(jenkins),107(tomcat7)
+ sudo su tomcat7
+ id
uid=1004(jenkins) gid=1004(jenkins) groups=1004(jenkins),107(tomcat7)

由于安全原因,我无法使用 tomcat7 用户访问 myserver。“sudo su tomcat7”不需要密码就可以工作,因为我已经使用 NOPASSWD 将此命令添加到 /etc/sudoers。

那么问题是:为什么我不能致我的tomcat7用户?

答案1

我认为该脚本deploy_webapp.sh包含以下命令序列:

id
sudo su tomcat7
id

那里发生了什么事?

  1. sshdeploy_webapp.sh在用户拥有的进程中启动脚本jenkins
  2. sudo作为新进程启动,并将进程所有者更改为root
  3. sudosuroot另一个进程一样启动。
  4. su尝试以用户tomcat7身份启动用户的登录 shell tomcat7
  5. tomcat7很可能没有配置交互式 shell(请检查grep tomcat7 /etc/passwd)。
  6. su退出。(在此会话中不再拥有tomcat7任何进程。)
  7. sudo退出。(在此会话中不再拥有root任何进程。)
  8. 最后id在与整个脚本相同的用户下执行deploy_webapp.sh- jenkins。整个脚本在同一个用户下执行。sudonor都不会su改变这一点。

你可以做什么?

  1. 使用你需要的 shell进行调用su。例如:su -s /bin/bash
  2. id在 拥有的进程中运行第二个tomcat7。例如:su tomcat7 -c id

完整示例脚本:

id
sudo su tomcat7 -s /bin/bash -c id

概括

所有要在 下执行的命令都应该在由(通过选项)tomcat7启动的进程中运行,并注意用户的登录shell。su-c

相关内容