Python 脚本不会切换到其他用户

Python 脚本不会切换到其他用户,python,linux,subprocess,Python,Linux,Subprocess,我正在编写一个脚本,在某个时刻需要切换到root用户(在我们的服务器上执行“sudorootsh”是切换到root用户的唯一可接受的方式),然后它将执行某个命令 我不确定我遗漏了什么,但脚本只是忽略了应该切换到root并继续与启动脚本的用户一起执行命令的部分 如果检查生成的whoami.txt文件,您会注意到用户不是root用户。请记住,在执行sudorootsh命令时,执行脚本的用户可以切换到root而不会出现任何问题 以下是我正在使用的代码: import subprocess def sw

我正在编写一个脚本,在某个时刻需要切换到root用户(在我们的服务器上执行“sudorootsh”是切换到root用户的唯一可接受的方式),然后它将执行某个命令

我不确定我遗漏了什么,但脚本只是忽略了应该切换到root并继续与启动脚本的用户一起执行命令的部分

如果检查生成的
whoami.txt
文件,您会注意到用户不是root用户。请记住,在执行sudorootsh命令时,执行脚本的用户可以切换到root而不会出现任何问题

以下是我正在使用的代码:

import subprocess
def switch_user():
 commands = '''
 sudo rootsh
 whoami > whoami.txt
 sysctl -a | grep kernel.msgmni'''
 process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, 
 stdout=subprocess.PIPE)
 out, err = process.communicate(commands.encode('utf-8'))
switch_user()

知道我做错了什么吗?谢谢。

而不是
Popen
调用子进程来运行
bash
,并从中打开一个单独的特权shell,
Popen
直接使用命令
sudorootsh
。如果成功(要求允许用户在不提供密码的情况下
sudorootsh
),则通过与子流程通信来传递其余命令

这将是以下几点:

import subprocess

def switch_user():
    # These shell commands will be used as input to the root shell
    commands = '''whoami > whoami.txt
    sysctl -a | grep kernel.msgmni'''

    # Launch the root shell
    process = subprocess.Popen('/usr/bin/sudo rootsh',
            stdin=subprocess.PIPE, stdout=subprocess.PIPE)

    # Send the shell's input to it and receive back its output
    out, err = process.communicate(commands.encode('utf-8'))

switch_user()

出于您的目的,您可能需要对其进行修改。特别是,如果
sudo
命令位于不同的位置,则可能需要修改其路径。我再次强调,这种方法依赖于在不提供密码的情况下获得根shell。Sudo可以这样配置,但不是默认配置。

在与操作系统团队的成员进行了更彻底的调查后,我终于成功地实现了这一点。我会发布这篇文章,也许它对将来的人有用:

import os
os.system("sudo rootsh -i -u root 'sysctl -a | grep kernel.msgmni' > parameter_value.txt")
关键是插入
-i
-u
选项:

-i[命令]
-i
(模拟初始登录)选项将目标用户的密码数据库条目指定的shell作为登录运行 壳 这意味着shell将读取特定于登录的资源文件,如
.profile
.login
。如果命令是 具体来说,就是 通过shell的
-c
选项传递给shell执行。如果未指定命令,则执行交互式shell。
sudo
尝试在运行shell之前更改到该用户的主目录。安全策略应初始化 环境 最小变量集,类似于用户登录时出现的变量集。中的命令环境部分
sudoers(5)
手册记录了当使用
sudoers
策略时,
-i
选项如何影响命令运行的环境

-u用户
-u
(用户)选项使
sudo
以root以外的用户身份运行指定的命令。改为指定uid 对于用户名,
#uid
。 当以uid形式运行命令时,许多shell要求用反斜杠(“
\
”)转义
\
)。安全策略可能会 限制UID 密码数据库中列出的密码。
sudoers
策略允许不在密码数据库中的UID作为 只要
targetpw
未设置选项。其他安全策略可能不支持此操作


谢谢大家的回答:)

生成一个具有root权限的新shell会话。它不会影响当前的shell会话。如果要影响当前进程,您必须使用类似于
os.seteuid()
。这似乎是个好主意,您能给我一个代码示例吗?我尝试将命令添加到一个变量中(variable=[“command”],然后调用subprocess.Popen(['sudorootsh']+“variable”shell=True stdin=subprocess.PIPE,stdout=subprocess.PIPE,但不幸的是,我仍然得到了相同的结果。谢谢!@CatalinS.,我添加了一个原始代码的修改版本,显示了我描述的更改。嘿,John,谢谢你的回答,我刚刚尝试了你的方法,但在执行代码后,我得到了以下错误:File“/usr/lib64/python2.6/subprocess.py”,第642行,在init errread,errwrite)文件中“/usr/lib64/python2.6/subprocess.py”,第1238行,在_execute_child raise child_exception OSError:[Errno 2]没有这样的文件或目录
-u root
实现不了任何功能-默认情况下是以root身份运行命令。您所做的真正帮助是将命令传递给
sudo
作为参数运行,而不是在
sudo
完成后作为单独的命令运行。顺便说一句,您不需要
grep
-只需
sysctl kernel.msgmni即可应该足够,并且更健壮。