如何运行作为不同用户(本地用户)然后返回root用户运行的python脚本

时间:2017-03-23 01:12:10

标签: python linux

我有一个与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

1 个答案:

答案 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用户身份继续运行其余的应用程序。