当需要以root用户身份运行主python文件时,以常规用户身份运行“子” python文件

时间:2019-05-27 07:27:48

标签: python ubuntu

我正在做一个python程序(并使用PyQt5用于GUI),需要以root身份运行(因为我正在为其编程套接字)。它具有一个按钮,当我单击它时,它将打开另一个python文件(“子”文件:chrometest.py,基于该库,鳗鱼:https://www.youtube.com/watch?v=2kbeBzEQfXE,它使我可以打开js文件)。问题在于,当以root用户身份运行时,鳗鱼将不起作用,所以我不知道如何切换用户以仅以常规用户身份运行此功能。

主要的python程序(示例,一个以root身份运行的程序)

import os
import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Window(QtWidgets.QMainWindow):
    def __init__(self, *args):
        super(Window, self).__init__()
        self.img = QtWidgets.QLabel()
        self.open_js= QtWidgets.QPushButton('Load')
        self.width = 400
        self.height = 150        
        self.init_ui()

    def init_ui(self):
        self.img.setPixmap(QtGui.QPixmap("someimage.png"))
        self.open_js.clicked.connect(self.openjs)
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        h_layout = QtWidgets.QHBoxLayout(central_widget)
        h_layout.addWidget(self.img)
        h_layout.addWidget(self.open_js)
        self.setWindowTitle('Main Window')
        self.setGeometry(600,150,self.width,self.height)

    def openjs(self):
        #here is where I think I need to switch to regular user
        exec(open("chrometest.py").read())

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = Window()
    main.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

chrometest.py(需要以普通用户身份运行的程序)

import eel
eel.init('webfiles')
eel.start('index.html')

我曾在评论行中尝试使用本教程https://www.tutorialspoint.com/python/os_chown.htm,但没有用

3 个答案:

答案 0 :(得分:1)

在类似Unix的系统中,通常有一个进程需要一次成为root用户,例如侦听1024以下的端口,但是出于安全原因,然后将其作为常规的非特权用户执行。无论使用哪种语言,设计都如下:

  • 特权部分(经过广泛的安全漏洞测试)仅执行需要root特权的代码
  • 必须执行不需要root的代码后,它会分叉并
    • 父母仍然享有特权,并继续运行特权代码
    • 将子级切换为普通用户(允许,因为它仍处于特权根级别)并执行常规代码

这就是您应该在这里执行的操作

def openjs(self):
    pid = os.fork()
    if 0 == pid:
        os.setuid(uid_of_non_priviledged_user)
        # you can now safely execute code from chrometest.
    else:
        # optionaly wait for child:
        os.waitpid(pid, os.WEXITED)

答案 1 :(得分:0)

哦,是的!。您可以将子python文件作为常规python文件运行。但是您需要在父python文件中添加此行。

import os
os.system("python  chrometest.py")

通过此行,您的父python文件可以运行您的子python文件。

答案 2 :(得分:0)

就像Mani Kandan说的那样,您可以通过os.system运行进程,但是如果您已经在root用户下工作,它将以相同的特权执行。

您可以使用sudo -usudo --user这样的参数在指定用户下运行程序

sudo -u regular_user "python3 chrometest.py"

因此,在Python中,它看起来像:

import os
os.system('sudo -u regular_user python3 chrometest.py')

以及您的TabError: inconsistent use of tabs and spaces in indentation错误:将脚本中的所有标签更改为空格,反之亦然。