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_() )
我正在开发 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_() )