背景

背景

背景

我正在尝试定期重新启动一些程序(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 &

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

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

答案1

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

答案2

你总是可以使用旧的:

man 1 su

此命令将打开一个子 shell 作为您要模拟的用户。作为 root,您可以使用它,而不会提示您输入密码。

su foo_user -c whatevercommandyouwant

也可以通过脚本工作。

答案3

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

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

答案4

阅读、复制并安装 run-as、一个 Bash 和一个 Python 脚本,其中包含 管理运行和设置变量的用法machinectl,以便为您运行图形应用程序:xhostdbus

run-as <user> <command>

要运行图形应用程序,请执行以下操作

run-as -X <user> <command>

参考

相关内容