sudo / suid非root嵌套失败

时间:2016-07-21 16:58:54

标签: python linux bash python-3.x sudo

我有一个python脚本(必须以root身份调用),它调用一个bash脚本(必须被称为非root),有时需要调用sudo。这不起作用 - " leaf" sudo调用给出消息" $ user不在sudoers文件中。将报告此事件。"我怎样才能做到这一点?

代码(插入非root用户名代替" your_username_here"):

tezt.py:

#!/usr/bin/python3

import os
import pwd
import subprocess

def run_subshell_as_user(cmd_args, user_name=None, **kwargs):
  cwd = os.getcwd()
  user_obj = pwd.getpwnam(user_name)

  # Set up the child process environment
  new_env = os.environ.copy()
  new_env["PWD"] = cwd
  if user_name is not None:
    new_env["HOME"] = user_obj.pw_dir
    new_env["LOGNAME"] = user_name
    new_env["USER"] = user_name

  # This function is run after the fork and before the exec in the child
  def suid_func():
    os.setgid(user_obj.pw_gid)
    os.setuid(user_obj.pw_uid)

  return subprocess.Popen(
    cmd_args, 
    preexec_fn=suid_func, 
    cwd=cwd,
    env=new_env,
    **kwargs).wait() == 0

run_subshell_as_user(["./tezt"], "your_username_here") # <-- HERE

tezt:

#!/bin/bash

sudo ls -la /root

然后将其运行为:

sudo ./tezt.py

有谁知道为什么这不起作用?用户可以在正常情况下运行sudo。为什么&#34; user -sudo-&gt; root -suid-&gt;用户&#34;工作正常,但是当你尝试从那里sudo时它会失败吗?

1 个答案:

答案 0 :(得分:1)

我建议使用sudo来删除权限而不是自己这样做 - 这在可能的情况下会更加彻底,修改有效而不是真正的uid和gid。 (要自行修改完整集,您可以尝试将setuid()更改为setreuid(),同样将setgid()更改为setregid()

......这意味着将一些东西传递给Popen,类似于以下内容:

["sudo", "-u", "your_username_here", "--"] + cmd_args