Shell 在 PYQT5 GUI 的子进程中使用更复杂的 nmap 命令时不断重启

Shell keeps restarting while using a more complicated nmap command in subprocess in a PYQT5 GUI

我正在开发 Raspberry Pi 3,目前,我正在尝试在 PyQt5 中为一些 nmap 命令创建一个 GUI。

或多或少,我从列表中获取输入,编辑子实体,然后使用各种命令,它不起作用。我正在使用 subprocess 来实现这一点,因为我只需要终端的输出。

nmap 库中的某些命令运行良好,没有任何问题,我设法获取了结果,但对于其他命令,结果仍在进行中。

我尝试打印此命令的结果:

sudo nmap -p 80,443 192.168.1.1/24 -oG -

而且,我正在使用的方法:

def nmapHttScan(self):
    subnet = str(self.leNmap.text())
    result = ' '
    res= subprocess.Popen(['sudo','nmap','-p 80,443',''+subnet,'-oG -'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True,encoding = 'utf-8')
     while True:
        output=res.stdout.readline()
        if output =='' and res.poll() is not None:
            break;
        if output:
            print('output',output.strip())
        rc=res.poll()
     print(str(rc))

每次我按下 GUI 中的按钮以便看到结果时,我的 shell 都会重新启动,我真的不知道该怎么做。

我想我可能用错了process.poll()方法,但是我一直在研究这个问题大约4-5天,我一直在到处寻找。所以,如果你有任何想法,我愿意尝试任何事情。

谢谢,祝你有愉快的一天!

您正在做的事情似乎不必要地复杂。这是一个更好的方法:

import sys
import os
from PyQt5.Qt import QApplication, QClipboard
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QWidget, QPlainTextEdit, QPushButton
from PyQt5.QtCore import QSize

class ExampleWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 440))    
        self.setWindowTitle("PyQt5 NMAP example") 

        # Add text field
        self.b = QPlainTextEdit(self)
        self.b.move(10,10)
        self.b.resize(600,300)

        # Create a button in the window
        self.button = QPushButton('Show text', self)
        self.button.move(120,380)

        # connect button to function on_click
        self.button.clicked.connect(self.functionnmap)

    def functionnmap(self):
        p = os.popen('sudo nmap -p 80,443 192.168.1.1/24 -oG -')
        output = p.read()
        self.b.insertPlainText(output)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = ExampleWindow()
    mainWin.show()
    sys.exit( app.exec_() )