我有一个与pkexec
一起运行的python程序,我想因为我很难让os.environ.get('XDG_CURRENT_DESKTOP')
或os.environ.get('DESKTOP_SESSION')
输出任何东西。该程序的一个功能是获得Linux桌面环境,这主要是我现在正在努力实现的目标。我决定使用os.setupid('my_username')
从pwd获取它以切换到我的用户并尝试获取环境变量因为不再是root但问题是我无法返回并以root用户身份运行脚本功能。在这之后我怎么能回到根?
为了获取环境变量,我正在尝试这个:
def getDesktopEnvironment(self):
os.seteuid(self.uidChange)
desktops = subprocess.Popen(['bash', 'desktopenv.sh'], stdout=subprocess.PIPE)
desktops.wait()
a = desktops.stdout.read()
print a
if a == "X-Cinnamon":
#do this
elif a == "Unity":
#do that
bash脚本位于
之下#!/bin/bash
echo $XDG_CURRENT_DESKTOP
尝试回到root,告诉我这个:os.seteuid(0)OSError: [Errno 1] Operation not permitted
答案 0 :(得分:1)
我建议进行以下更改:
修改代码,将您想要的用户的UID设置为与您想要的UID相对应的用户名。
将getDesktopEnvironment修改为如下代码。 注意:脚本路径不必位于用户主目录中,只需用户名指定的用户即可读取。
def getDesktopEnvironment(self):
# You can set the script_path can be located anywhere you want.
# as long as the user you want to invoke the script has permission
# to read the file.
script_path = os.path.join('~', self.username, 'desktopenv.sh')
args = args = ['sudo', '--login', '-u', self.username, '/bin/bash', script_path]
desktops = subprocess.Popen(args, stdout=subprocess.PIPE)
desktops.wait()
a = desktops.stdout.read()
print a
if a == "X-Cinnamon":
#do this
elif a == "Unity":
#do that
仅仅因为您更改当前进程的UID并不意味着您继承了与该UID关联的环境。将 sudo 与-i
选项一起使用可确保运行用户的启动脚本并确保设置所有相关的环境变量。
使用sudo还可以确保您可以继续以root用户身份继续运行其余的应用程序。