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 不能这样做。我更需要,如果我退出sudo
COMMAND;ipython 允许我这样做!!!!
请帮忙!谢谢!
答案1
以 root 身份启动解释器后,它必然具有 root 权限。为了放弃权限,您可以编写一个 shell 脚本包装器,在其中更改进程用户和组,并在没有权限的情况下启动解释器。
解决方案 1:shell 脚本包装器
- 您需要一个可以切换到的非特权用户(
sudo adduser --system --no-create-home [username]
如果需要,可以创建一个,但您的登录帐户应该没问题) 首先
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]gid
。python 文档在这种情况下是强制性的。
一般来说,你应该尽可能多地编写代码,而不必处理特权,并将此代码包装在放弃特权的函数中,即我不推荐这种sudo
方法,因为它使代码依赖于sudo
。