如何以其他用户身份以各种方式运行程序?

Spa*_*awk 12 users sudo gnome-keyring

背景

我正在尝试定期重新启动一些程序(mail-notificationstalonetray),因为它们似乎经常死机。我想设置在 NetworkManager 重新连接时重新启动它们。因此,我让它们由 中的脚本触发/etc/NetworkManager/dispatcher.d/

脚本编写

我可以创建一个脚本,如下所示。

#!/bin/bash
sudo -u foo_user pkill mail-notificati -x
sudo -u foo_user DISPLAY=:0 mail-notification &
Run Code Online (Sandbox Code Playgroud)

如果我直接以用户身份运行它,效果很好。但是,如果我从 root 的脚本调用它,它就会失败。系统提示我输入密码mail-notification;它无法读取 Gnome 密钥环。

我怎样才能以foo_user各种方式运行这个程序?

alm*_*ste 12

2021年

简而言之:

要以其他用户身份运行命令,您可以使用以下命令:

runuser -u user -- command
只能由 root 使用以作为另一个用户运行命令。
不需要身份验证。
不创建日志消息。
存在权限限制和问题。

su - user -c command
任何用户都可以使用。
需要作为目标用户进行身份验证。在或
中创建消息。/var/log/auth.log/var/log/secure

sudo -u user command
可由具有 root 权限的用户或文件中的用户使用sudoers
需要以当前用户(您)身份进行身份验证。在或
中创建消息。/var/log/auth.log/var/log/secure

pkexec --user user command
任何用户都可以使用。
需要作为目标用户进行身份验证。在或
中创建消息。 替代 GUI 工具,例如或。/var/log/auth.log/var/log/secure
gksugksudo

更多信息:

Linux 以另一个用户身份运行命令

以另一个用户身份运行 GUI 应用程序:

如果您想以其他用户身份运行 GUI 应用程序,则需要首先允许目标用户连接到您的显示器:
xhost +si:localuser:user
然后使用runuser///运行该应用程序, 然后使用阻止后续连接:susudopkexec
xhost
xhost -si:localuser:user

  • 很好的答案!我尝试使用它以非特权系统用户身份运行 Spotify。你的答案,特别是运行 GUI 应用程序的答案,对我有用。但是,我确实需要使用 -E 标志通过 sudo 传递我的 DISPLAY var。另外,我很无知,没有意识到“localuser”是那个文字字符串。最后,GUI 应用程序可能无法解决预期普通用户配置文件的各种其他问题。华泰 (2认同)

Gil*_*il' 1

如果您想从不是从 GUI 启动的进程与 GUI 进行交互,则需要设置一些环境变量:至少DISPLAY,如果它不在默认位置,并且对于许多现代环境来说,XAUTHORITY可能需要设置一些环境变量。您需要设置的DBUS_SESSION_BUS_ADDRESS程序。

\n\n

但解决您的问题的更可靠方法是不从 NetworkManager 重新启动这些程序。除了成功启动它们的困难之外,您还需要担心您是否已经登录,以及是否可能有其他用户和其他显示需要考虑,等等。相反,终止这些程序,但不要重新启动它们。在正常会话中,不要直接启动它们,而是从主管启动它们,如果它们死了,主管会重新启动它们。我认为 systemd 包含此功能(但我不知道如何使用它);或者您可以使用专用的管理程序,例如monitsupervise、\xe2\x80\xa6

\n