我正在尝试制作一个python脚本,用于安装aur软件包,例如google-chrome,sublime-text等,以用于Arch Linux的新版本。我可以很好地克隆git url,但是使用makepkg程序遇到问题。我不能以sudo身份运行脚本,因为makepkg不允许使用sudo权限,因为它可能会损坏系统,但是我需要sudo权限才能将其与pacman一起安装。到目前为止,我将发布该函数的功能,如果有人可以帮助我,我将不胜感激。 (如果是一个愚蠢的问题或答案很简单,请提前道歉,但我在Google上花费了几个小时,却找不到答案)
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)
答案 0 :(得分:0)
选项1:以用户身份执行脚本,将特权pacman -U
升级为root用户
我认为这是一个坏主意。脚本读取密码并将密码拖入不安全的内存中会花费相当长的一段时间,因为它们最终希望以root用户身份执行某些操作。但是,如果您坚持,它将类似于选项2。
选项2:以root用户身份执行脚本,将git clone
和makepkg
的子进程降级给用户
根据subprocess.Popen
,您可以使用preexec_fn
的{{1}}选项:
preexec_fn :(仅适用于POSIX)要在子进程执行之前在子进程中调用的对象。
唯一棘手的事情是交出参数。如果不必这样做,则可以在help(subprocess.Popen)
构造函数调用中简单地将函数(os.setuid
)声明为preexec_fn
选项。不幸的是,它将在我们定义子流程时执行,而不是在按预期方式运行时执行。因此,我们最终将主进程降级。
所以我们必须定义一个包装函数:
Popen()
然后可以定义我们的子流程:
def demote():
os.setuid(1000)
当然,这不是一个好方法-硬编码uid以及所有。但是,如果我们希望process = Popen(["git", "clone", git_url, new_package_path], preexec_fn=demote)
process.wait()
接受参数,那么我们回到第一个平方。因此,我们必须使其变得更加困难,并定义一个嵌套函数(函数中的一个函数),其中调用外部函数以定义子进程,接受参数,定义uid和gid并返回应用降级的内部函数。听起来复杂吗?严格来说,您不必这样做,但是假设我们要变得灵活,所以我们开始:
demote()
第二种选择是使用def demote(user_uid, user_gid):
def apply_demotion():
os.setgid(user_gid)
os.setuid(user_uid)
return apply_demotion
,可以使用su -c (command) (user)
函数从python调用它:
os.system()
您可能希望使用相同的方法同时运行os.system("su -c makepkg " + user)
和git clone
命令。
工作示例
makepkg