带参数运行 su -s

带参数运行 su -s

我运行使用命令来运行su -s命令来启动进程。因为我不希望 root 用户拥有该进程。

我尝试通过发出命令来做到这一点

su -s "$CATALINA_HOME/bin/catalina.sh run" tomcat

返回su: /opt/apache-tomcat/bin/catalina.sh run: No such file or directory

如何运行su -s带有参数的命令而不生成此错误?

答案1

如果你正在跑步suas root,您可以用来-s指定不同的 shell(root此处根据需要运行,因为您的tomcat用户没有有效的 shell),并-c指定要运行的命令:

su -s /bin/sh -c "$CATALINA_HOME/bin/catalina.sh run" tomcat

你可能会发现start-stop-daemon有用;它有很多选项来指定要使用的用户和组、如何启动守护进程等。tomcat8初始化脚本在 Debian 中使用可能会提供有用的灵感。或者您可以考虑编写一个 systemd 单元或任何适合您系统 init 的单元。

答案2

-s命令的开关是su改变指定用户的shell。您要运行的命令前面必须带有-cswitch。

所以你正在寻找的命令是这样的:

su -s /bin/bash -c "$CATALINA_HOME/bin/catalina.sh run" tomcat

答案3

您的其他问题请访问https://stackoverflow.com/questions/37753783/有没有办法判断 shell 脚本是否被信号 9 杀死表明您的问题缺少的是您正在尝试在 upstart 下运行 Tomcat。

在这种情况下:

  • start-stop-daemon不合适。
  • 也不是su
  • Poor Man's Daemon Supervisor 也不会在 shell 脚本中进行 PID 文件管理。

所有这些都试图复制暴发户所做的事情直接地。使用起来su特别糟糕,因为它不是删除特权的工具。它是一个工具添加权限,在登录会话中。如今,它在幕后参与了各种登录会话管理子系统,这使得它特别不适合在守护程序中删除超级用户权限的(简单得多)任务。 start-stop-daemon只是多余的。和新贵知道进程 ID它的孩子。

在 upstart 作业文件中,使用setuid和 (如果适用)setgid节来删除非特权用户的特权:

setuid 雄猫

如果您确实调用了catalina.shvia sh -c(这并不是真正必要的),请不要陷入 systemd House of Horror 领域。 (当这些事情由 upstart 完成时,情况只会稍微不那么可怕。)以 daemontools 的方式做事,并将 shell 链连接到脚本,通过 shell 的exec命令调用它,以便 upstart 将守护进程视为其直接子进程。 (并确保暴发户expect也知道这一点并使用正确的节。)

不过,显式 shell 并不是必需的,因为 upstart 可以catalina.sh直接调用自身,就像 systemd 和其他服务管理工具一样。因此,您不必担心确保该解释器/bin/bash实际上是该脚本的正确解释器。

执行 $CATALINA_HOME/bin/catalina.sh 运行

进一步阅读

相关内容