启动 ipython 但不像 root

启动 ipython 但不像 root

ipython 以 root (UID) 身份启动;好的,但我需要在 ipython 无法运行并且不允许之后,可以获得 root 权限的脚本/代码。例如

我启动了 ipython,确定 UID 是 root。然后在我的 visudo 文件中我进行了更改:

root ALL=NOEXEC:/usr/bin/sudo
user ALL=NOEXEC:/usr/bin/sudo

并取消这两个用户的 sudoers。

所以...我运行下一个代码:

import subprocess
from subprocess import Popen, PIPE
COMMAND = "sudo apt-get install g++ -y" #In this line, you put the code that you want to run
proccess = Popen(COMMAND, shell=True, executable="/bin/bash", stdout=PIPE, stderr=PIPE)
result = proccess.communicate()
o, e = result

print "*"*100
print "Output"
print "*"*100
for i in o.split("\n"):
    print i

print "*"*100
print "Errors"
print "*"*100
for i in e.split("\n"):
    print i

我需要 ipython 不能这样做。我更需要,如果我退出sudoCOMMAND;ipython 允许我这样做!!!!

请帮忙!谢谢!

答案1

以 root 身份启动解释器后,它必然具有 root 权限。为了放弃权限,您可以编写一个 shell 脚本包装器,在其中更改进程用户和组,并在没有权限的情况下启动解释器。

解决方案 1:shell 脚本包装器

  1. 您需要一个可以切换到的非特权用户(sudo adduser --system --no-create-home [username]如果需要,可以创建一个,但您的登录帐户应该没问题)
  2. 首先python检查sudo su -c ipython [username]它是否没有权限

    import os
    os.getuid() # should be [username]'s UID
    os.geteuid() # should be [username]'s UID
    import subprocess
    subprocess.check_call(["sudo", "-i"]) # should raise CalledProcessError
    

此解决方案仅为启动解释器提供了足够的灵活性。如果您想编写代码并处理特权和非特权部分,请考虑解决方案 2。

解决方案 2:在 Python 中放弃权限

如果您想管理python解释器中的权限:

决定在代码中放弃权限的位置并非易事,需要考虑舒适性(您不想一直输入密码)、安全性(尽可能少的代码应该以权限运行)和可维护性(尽可能多的代码不应该关心权限)之间的权衡。

方法:

  • sudo提供了一种在非特权解释器中获取命令特权的方法,但需要用户交互,并且很难在没有特权的情况下运行代码(因为您sudo在所有命令中都有该语句)。
  • 如果你以特权启动解释器,你可以使用os.set[/e/r/s]uid和删除特权os.set[/e/r/s]gidpython 文档在这种情况下是强制性的。

一般来说,你应该尽可能多地编写代码,而不必处理特权,并将此代码包装在放弃特权的函数中,即我不推荐这种sudo方法,因为它使代码依赖于sudo

相关内容