我创建了一些基本上可以工作的 systemd 服务:
地点:
/etc/systemd/system/multi-user.target.wants/publicapi.service
内容:
[Unit]
Description=public api startup script
[Service]
Type=oneshot
RemainAfterExit=yes
EnvironmentFile=-/etc/environment
WorkingDirectory=/home/techops
ExecStart=/home/techops/publicapi start
ExecStop=/home/techops/publicapi stop
[Install]
WantedBy=multi-user.target
当我尝试在命令行中以 techops 用户身份重新启动服务时,我得到以下输出:
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to start 'publicapi.service'.
Multiple identities can be used for authentication:
1. Myself,,, (defaultuser)
2. ,,, (techops)
Choose identity to authenticate as (1-2):
我希望只有 techops 可以重新启动服务,并且我希望在以 techops 身份登录时不会出现此提示。我怎样才能做到这一点?
我读到 polkit-1 或 sudoers 有不同的方法,但我不确定。
[更新] 2019-01-27 4:40pm
感谢您对 Thomas 和 Perlduck 的全面回答。它帮助我提高了我对 systemd 的了解。
根据在没有密码提示的情况下启动服务的方法,我很抱歉我没有足够强调真正的问题:
实际上,对我来说最重要的是,除了 techops 之外,没有其他用户应该停止或启动该服务。但至少前两种方法我仍然可以运行service publicapi stop
并且我再次得到提示==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
。当我选择默认用户并知道密码时,我可以停止所有服务。我想拒绝这个用户这样做,即使他有密码。重要的背景信息,以更好地理解为什么这对我来说更重要:
默认用户是唯一暴露于 ssh 的用户,但该用户不能做任何其他事情(如果您拥有这些其他用户的密码,则更改为其他用户除外) . 但此时,他可以启动或停止服务,但该用户不得这样做。
如果有人得到defaultuser的密码并通过ssh登录,那么他现在可以停止所有服务。这就是我所说的“我希望只有技术人员可以重新启动服务”的意思。抱歉,我最初的问题并不那么准确。我认为对 techops 用户进行 sudo 可能会绕过这个问题,但事实并非如此。问题本身不是在没有密码提示的情况下运行命令。(当我刚刚执行时,我可以很容易地以 techops 用户的身份做到这一点/home/techops/publicapi start
)。问题本身是阻止默认用户启动这些服务。
我希望任何解决方案都能做到这一点。
我从托马斯的方法开始。当我按照说明执行命令时,不想被询问用户 techops 的密码时,使用 sudo 的方法有效,例如
sudo systemctl start publicapi.service
sudo systemctl stop publicapi.service
第二种方法对我还不起作用。我无法在没有密码提示的情况下启动服务,==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
并且当我拥有该用户的密码时,我可以以默认用户身份登录。
使用第三种方法,服务甚至不再在启动过程中启动,所以我不确定这种方法是否适合我。我什至无法使用它,systemctl enable publicapi.service
这导致我出现以下错误:
Failed to enable unit: Unit file mycuisine-publicapi.service does not exist.
当我将所有服务移回 /etc/systemd/system/ 并执行时,不会发生错误systemctl enable publicapi.service
。然后服务在启动时再次启动。
所有这些方法或多或少都有助于绕过 techops 用户的密码提示,但是当我运行service publicapi stop
或systemctl stop publicapi
使用 defaultuser 时,如果我有密码,我可以停止服务。但我的目标是完全阻止默认用户启动或停止服务。