我试图使用subprocess.Popen从另一个非特权的脚本启动一些python脚本。在大多数情况下工作得很好,但是那些需要root权限的人不能工作,我已经把问题缩小到了pkexec,那不是停留在工作目录中也不是接受它作为参数,那是因为 这样:
subprocess.Popen(['kdesudo','pwd'],cwd=sys.path[0])
#also works with sudo
有效地打印cwd,而:
subprocess.Popen(['pkexec','pwd'],cwd=sys.path[0])
始终保持在/ root。 (也尝试通过env = os.environ无济于事) 我需要用gui提示用户,以及pkexec提供的可移植性超过kdesudo / gksu。有什么想法吗?
编辑:由于无法更改pkexec的工作目录,因此可以使用以下命令在gtk和kde环境中提示用户输入root密码:
try:
check_call('which gksu',shell=True)
sudo = 'gksu'
except:
print "gksu frontend not found, using kdesudo instead"
sudo = 'kdesudo'
prompt = Popen([sudo, '<privileged command/script to run>'])
答案 0 :(得分:1)
在调用它的命令时,没有办法让pkexec
保留旧目录,因为它always changes to the target user's home directory。
它更改为pw->pw_dir
,这是目标用户的主目录,并且没有替代它。
我无法看到记录在案的原因,但可能只是尝试确保执行程序的用户可以访问其当前的工作目录。它自pkexec创建以来一直存在,我没有看到任何与此行为相关的错误。
答案 1 :(得分:0)
我使用pkexec
从当前目录中以特权用户身份运行pcmanfm文件管理器,如下所示:
pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY pcmanfm $PWD
用户必须属于sudo组。