我正在做一个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,但没有用
答案 0 :(得分:1)
在类似Unix的系统中,通常有一个进程需要一次成为root用户,例如侦听1024以下的端口,但是出于安全原因,然后将其作为常规的非特权用户执行。无论使用哪种语言,设计都如下:
这就是您应该在这里执行的操作
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 -u
或sudo --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
错误:将脚本中的所有标签更改为空格,反之亦然。