背景
我正在尝试定期重新启动一些程序(mail-notification
和stalonetray
),因为它们似乎经常死机。我想设置在 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
gksu
gksudo
更多信息:
以另一个用户身份运行 GUI 应用程序:
如果您想以其他用户身份运行 GUI 应用程序,则需要首先允许目标用户连接到您的显示器:
xhost +si:localuser:user
然后使用///runuser
运行该应用程序, 然后使用阻止后续连接:su
sudo
pkexec
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
,以便为您运行图形应用程序:xhost
dbus
run-as <user> <command>
要运行图形应用程序,请执行以下操作
run-as -X <user> <command>