我知道这个标题有点含糊。请允许我解释一下我们的问题。我们在 Ubuntu 上设计了一个安装程序脚本,因为基于 Debian 的系统是我们的主要核心,但是,我们的一些基于云的系统和一些客户使用非基于 Debian 的系统。结果,自从我们使用 sudo 以来,我们的脚本在一些关键地方失败了。我知道我们问题的答案非常基本,我只是不知道应该使用确切的语法来确保我们支持相当多的常见发行版(CentOS、RHEL、Fedora、Ubuntu、Debian 等)
好吧,这就是问题所在。我们的脚本是我们软件的安装程序。该脚本安装所需的文件、服务等。安装脚本必须以 root 身份运行,因此用户必须位于 root 控制台或使用 sudo。不管怎样,到目前为止一切都很好。在脚本结束时,安装程序必须退出根控制台并以软件用户的身份启动服务。为此,当我第一次编写脚本时,我使用了以下内容:
usermod -aG sudo <username> #Put the softwares user in the sudo group
sudo -u <username> service <software> start #Drop to the user and start the service
当然,当我尝试在非基于 Debian 的系统上部署此脚本时,脚本就会出错,因为 CentOS 不理解 sudo。解决方案不是启用 sudo,因为在我们无法打开和关闭此功能的某些客户系统上也可能出现这种情况。因此,我很自然地开始寻找一种使用旧的 su 命令来完成此操作的方法。我尝试了以下操作,但在更改用户后它要么出错,要么立即从脚本中退出:
su <username>
service <software> start
有没有关于正确语法的建议,以便我可以在大多数 Linux 发行版上使用它?
谢谢
* 更新 *
我尝试了以下方法:
su <username> -c 'service <software> start'
该命令将运行,但会失败,因为用户没有 root 权限。它特别说它找不到服务命令(同样没有root)。那么为什么上面的 sudo 命令会起作用呢?它是否以用户身份运行,但具有 root 权限?
答案1
您应该将命令直接传递给su
:
su <username> -c 'service <software> start'
如果您只是执行该行,su <username>
那么您将以该用户身份启动交互式 shell。
有点奇怪的是,启动服务应该以指定用户的身份来完成;更常见的是,启动脚本负责以所需用户身份运行任何内容,以便 root 可以简单地启动服务,而不必求助于sudo
或su
。
答案2
您的需求是 Ansible 的绝佳用例。它是一个开源配置管理/编排工具,可以为您解决这个问题。它是无代理的并且通过 SSH 工作,因此您通常不需要进行任何客户端设置。
答案3
您没有阅读su
联机帮助页!所需的用户名必须始终位于末尾。
su -c 'service <software> start' <username>