我正在尝试制作一个python脚本来安装aur包,比如googlechrome、sublime text等,用于archlinux的新版本。我可以很好地克隆git url,但是我在使用makepkg程序时遇到了问题。我不能以sudo的身份运行脚本,因为makepkg不允许sudo权限,因为它会对系统造成损害,但是我需要sudo权限来安装pacman。我将张贴我的功能到目前为止,如果有人能帮助我,我将不胜感激。如果我在谷歌上找不到答案的话,我会提前几个小时找到答案的
def clone_and_makepkg(package_name, aur_folder_path, password):
git_url = "https://aur.archlinux.org/" + package_name + ".git"
new_package_path = os.path.join(aur_folder_path, package_name)
print("Cloning " + git_url + " to " + new_package_path)
Popen(["git", "clone", git_url, new_package_path]).wait()
os.chdir(new_package_path)
选项1:以用户身份执行脚本,将
pacman -U
的权限提升到root用户我认为这是个坏主意。脚本读取密码并在不安全的内存中拖拽一段时间,这有点低级,因为它们最终想以根用户身份执行某些东西。但是,如果你坚持的话,它的作用将类似于方案2。在
选项2:以根用户身份执行脚本,将
git clone
和makepkg
的子进程降级为用户您可以使用
subprocess.Popen
的preexec_fn
选项,根据help(subprocess.Popen)
,它可以:唯一棘手的事情就是交出论据。如果不需要这样做,我们可以在
Popen()
构造函数调用中将函数(os.setuid
)声明为preexec_fn
选项。不幸的是,当我们定义子流程时,它将被执行,而不是按预期运行它。因此,我们将最终降级主进程。在所以我们必须定义一个小包装函数:
然后可以定义我们的子流程:
^{pr2}$当然,这并不是一个好的方法-硬编码uid等等。但是,如果我们希望
demote()
接受参数,那么我们就回到原点了。因此,我们必须让它变得更加困难,并定义一个嵌套函数(函数中的函数),其中外部函数被调用来定义子进程,接受参数,定义uid和gid,并返回应用降级的内部函数。听起来很复杂?严格地说,您不必这样做,但是假设我们想要灵活,所以我们开始:第二个选项是使用
^{4}$su -c (command) (user)
,可以使用os.system()
函数从python调用它:为了保持一致性,您可能希望使用相同的方法同时运行
git clone
和makepkg
命令。在一个有效的例子
相关问题 更多 >
编程相关推荐