sudo/suid 非根嵌套失败
sudo/suid non-root nesting fails
我有一个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
测试:
#!/bin/bash
sudo ls -la /root
然后 运行 为:
sudo ./tezt.py
有谁知道为什么这不起作用?一般情况下用户可以运行 sudo。为什么 "user -sudo-> root -suid-> user" 工作正常,但是当您尝试从那里执行 sudo 时却失败了?
我建议使用 sudo
来放弃特权而不是自己这样做——这在可能的情况下更彻底一些,修改 effective 而不是仅修改真实的 uid 和 gid。 (要自己修改完整集,您可以尝试将 setuid()
更改为 setreuid()
,同样地,将 setgid()
更改为 setregid()
)。
...这意味着将类似于以下内容的内容传递给 Popen:
["sudo", "-u", "your_username_here", "--"] + cmd_args
我有一个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
测试:
#!/bin/bash
sudo ls -la /root
然后 运行 为:
sudo ./tezt.py
有谁知道为什么这不起作用?一般情况下用户可以运行 sudo。为什么 "user -sudo-> root -suid-> user" 工作正常,但是当您尝试从那里执行 sudo 时却失败了?
我建议使用 sudo
来放弃特权而不是自己这样做——这在可能的情况下更彻底一些,修改 effective 而不是仅修改真实的 uid 和 gid。 (要自己修改完整集,您可以尝试将 setuid()
更改为 setreuid()
,同样地,将 setgid()
更改为 setregid()
)。
...这意味着将类似于以下内容的内容传递给 Popen:
["sudo", "-u", "your_username_here", "--"] + cmd_args