Python 脚本不会切换到其他用户
我正在编写一个脚本,在某个时刻需要切换到root用户(在我们的服务器上执行“sudorootsh”是切换到root用户的唯一可接受的方式),然后它将执行某个命令 我不确定我遗漏了什么,但脚本只是忽略了应该切换到root并继续与启动脚本的用户一起执行命令的部分 如果检查生成的Python 脚本不会切换到其他用户,python,linux,subprocess,Python,Linux,Subprocess,我正在编写一个脚本,在某个时刻需要切换到root用户(在我们的服务器上执行“sudorootsh”是切换到root用户的唯一可接受的方式),然后它将执行某个命令 我不确定我遗漏了什么,但脚本只是忽略了应该切换到root并继续与启动脚本的用户一起执行命令的部分 如果检查生成的whoami.txt文件,您会注意到用户不是root用户。请记住,在执行sudorootsh命令时,执行脚本的用户可以切换到root而不会出现任何问题 以下是我正在使用的代码: import subprocess def sw
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
未设置选项。其他安全策略可能不支持此操作
谢谢大家的回答:)
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即可代码>应该足够,并且更健壮。