我正在处理一个脚本,该脚本在某个时候需要切换到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()
知道我在做什么错吗?谢谢。
答案 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
未设置选项。其他安全策略可能不支持此功能。
谢谢大家的回答:)