脚本不会切换到其他用户

时间:2019-08-06 17:09:27

标签: python linux subprocess

我正在处理一个脚本,该脚本在某个时候需要切换到root用户(执行“ sudo rootsh”是在我们的服务器上切换到root的唯一可接受的方法),之后它将执行某个命令。

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

如果您检查生成的whoami.txt文件,您会注意到该用户不是root用户。请记住,执行脚本的用户在执行sudo rootsh命令时可以毫无问题地切换到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()

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

2 个答案:

答案 0 :(得分:1)

不是Popen子例程来运行bash,而是从打开单独的特权shell,直接Popen命令sudo rootsh 。如果成功(要求允许用户sudo rootsh 不提供密码),则通过与子流程进行通信来传递其余命令。

这是遵循以下原则的东西:

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命令位于其他位置,则可能需要修改其路径。我再次强调,这种方法取决于能否获得root shell而无需提供密码。可以通过这种方式配置Sudo,但这不是默认设置。

答案 1 :(得分:1)

在与操作系统团队的成员进行了更彻底的调查之后,我终于设法完成了这项工作。我将其发布,也许将来对某人有用:

import os
os.system("sudo rootsh -i -u root 'sysctl -a | grep kernel.msgmni' > parameter_value.txt")

关键是插入-i-u选项:

  

-i [命令]

     

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

 
  

-u用户

     

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

谢谢大家的回答:)