我正在创建一个应该在Linux上运行的图形安装程序。安装应包括将文件复制到/usr
中的某些位置。目前,安装程序是用Python编写的。
当我需要复制文件时,如何升级安装程序的权限?我看了PolicyKit,但
我也看过PAM,我有使用libpam的代码,但我似乎无法用它做任何事情。在对我的用户进行身份验证后(通过提供用户名和密码),我没有/usr
的写入权限。我在验证后尝试使用os.setuid(0)
更改我的用户,但是我从操作系统收到错误。
另外,奇怪的是,我向pam_start
提供的服务似乎并不重要。只要用户名和密码正确,我就可以传递任何我想要的东西。我看到我有/etc/pam.d/sudo
。下面的代码被简化,密码正确存储在pam_conversation
对象中,我确实传递了一个句柄对象。
pam_start("my_user", "my_pass", "sudo_garbage_12345");
与
一样有效pam_start("my_user", "my_pass", "sudo");
也就是说,他们都成功了。
作为最后的手段,我可以执行gksudo
或kdesudo
,但我不想与这些程序绑定。要求用户使用sudo
调用我的安装程序是一个(非常)最后的手段。
答案 0 :(得分:9)
你可能最好用一个带有用户选项的前端包装RPM并调用RPM来完成艰苦的工作。这也为您提供了管理依赖关系的基础架构,并与现有的包管理系统很好地配合。如果你需要在基于.deb的系统(Debian或Ubuntu)上运行,你可能还需要构建一个.deb并在前端放置一些机制来解决哪个包管理系统处于活动状态。
授予随机用户对root权限的访问权限在Linux或Unix系统(或任何多用户系统)上通常被视为不良形式,因为这是一个重大的安全风险。但是,如果用户没有root访问权限或sudo权限允许用户写入系统区域,则可以选择让用户将其安装在其主目录(~/bin
)下。在这种情况下,如果他们想要安装在/ usr / bin中,则可以要求他们以root用户身份安装它,但如果他们没有root权限,则允许他们将其安装在他们的主目录下供自己使用。
答案 1 :(得分:2)
对于图形安装程序,请坚持使用图形环境。如果可用,请使用gksudo或kdesudo,否则会出现错误对话框,说明他们需要root。人员(特别是新手)将下载您的安装程序并双击以从他们的桌面启动它,您需要一种图形方式来询问他们的密码。你不想在它们上弹出一个终端。
鉴于此,即使他们从终端运行,也不要为他们做sudo。只输出一个错误,说你需要root并退出。如果用户已经处于命令提示符(就像我很可能那样),我已经知道如果我想这样做的话,如何sudo或su su into root。我向你保证,如果你试图让有经验的用户自己成功,你很可能会惹恼一些羽毛。
如果你坚持在安装程序中自己做一个sudo,为了上帝的缘故,请在你删除之前的时间戳之前强制使用'sudo -K'。如果你不这样做,我最近有sudo,你将在我不知情的情况下以root身份运行你的安装程序(因为我不希望发生这种情况)。 'sudo -K'将强制提示我然后可以决定是否要以root身份继续。
答案 2 :(得分:-1)
在这种情况下,最好的方法是在程序中使用su
。重定向输入/输出,你很高兴!