我正在运行 Ubuntu 14.04,用户名是 pandya。
pandya@pandya-desktop:~$ gnome-session-quit
当上述命令运行时没有在终端中执行 sudo ( sudo su
) 后,成功注销。
但是在以 sudo (以 root 身份)之后运行时,
root@pandya-desktop:/home/pandya# gnome-session-quit
它给出错误:
** (gnome-session-quit:3168): WARNING **: Failed to call logout: The name org.gnome.SessionManager was not provided by any .service files
因此,由于我是 root,我尝试以sudo -u pandya gnome-session-quit
pandya 用户身份运行命令。但它给出了相同的错误。
然后我尝试以 pandya 身份运行:
root@pandya-desktop:/home/pandya# su pandya
pandya@pandya-desktop:~$ gnome-session-quit
** (gnome-session-quit:3269): WARNING **: Failed to call logout: The name org.gnome.SessionManager was not provided by any .service files
但它给出了同样的错误。
因此,我的问题是:如何以 root 身份注销?因为我想输入gnome-session-quit
要以 root 身份运行的 sctipt. (我不想强制杀死进程但想要正常的注销提示)
进一步规范:-
我有一个要以 root 身份运行的脚本。
#! /bin/bash
....command to be executed.....
sudo -u pandya gnome-session-quit
答案1
我不完全确定您要做什么,但命令sudo
失败的原因是因为您已经启动了 X 服务器并且pandya
没有导出允许您与正在运行的 Gnome 会话进行通信的 pandya 环境变量。
因此,这将允许您终止您的 Gnome 会话:
sudo -E -u pandya gnome-session-quit
从man sudo
:
-E,--保留-环境
向安全策略表明用户希望保留其现有的环境变量。如果用户没有保留环境的权限,安全策略可能会返回错误。
如果您想要一个以 root 身份运行某些命令的脚本,然后希望它能够将您注销,您可以按如下方式进行:
创建脚本,不
sudo
包含特权命令,但和sudo
用于注销。例如:#!/bin/bash apt-get install firefox sudo -E -u pandya gnome-session-quit
使用以下命令运行脚本
sudo -E
:sudo -E /path/to/script
确保sudo -E script.sh
您的环境变量可用于脚本并确保sudo -E -u pandya
它们被传递给gnome-session-quit
调用。
答案2
我已经创建了这个脚本,它可以从 gnome-session 环境中设置 DBUS 会话变量,以防您想要注销其他用户/会话:
function logout() {
local USERNAME
export USERNAMES=( )
while [ -n "$1" ]; do case "$1" in
-* ) break ;;
*) USERNAMES+=( "$1" ); shift ;;
esac; done
for USERNAME in "${USERNAMES[@]}"; do
local SESSION_PID=$(pgrep -fu "$USERNAME" gnome-session|head -1)
if [ -n "$SESSION_PID" ]; then
(
sudo -u "$USERNAME" cat "/proc/$SESSION_PID/environ" | xargs -0 -n 1 echo export
echo "gnome-session-quit --logout $@"
) | sudo -u "$USERNAME" sh -;
fi
done
}