我是 python 新手,我有一個問題,我幾天都無法解決,我根本不明白錯誤是什么。我正在撰寫一個基于 Nmap 程式和同名庫的程式,其功能是掃描某些 IP 地址串列的開放埠。我正在嘗試通過字典來實作這一點,當我對埠的靜態變數執行所有操作時,一切都很好,但是當程式掃描每個地址的埠時,會在掃描周期的第二次迭代中發出這樣的錯誤。
'dict' object is not callable
File "C:\Users\Duoksi\Desktop\codes\python\NmapScanPy\test.py", line 47, in ScanPorts
result = nmap.scan_command(ip, arg = attribute)
下面是功能代碼。您還可以使用以下命令安裝庫: pip install python3-nmap
import nmap3
def Portscan():
nmap = nmap3.Nmap()
attribute = "-p "
port = input("Enter ports(ex. 80,443)\n")
attribute = str(port)
ipport = dict()
IPrange = ['93.187.72.82', '93.187.72.94', '93.187.72.115', '93.187.72.241', '93.187.72.19', '93.187.72.59', '93.187.72.208',
'93.187.72.179', '93.187.72.24', '93.187.72.137', '93.187.72.136', '93.187.72.130']
for ip in IPrange:
result = nmap.scan_command(ip, arg = attribute)
resultclean = re.findall('\'protocol\': \'\w \', \'portid\': \'\w \', \'state\': \'\w \'', str(result))
for res in resultclean:
ipport.setdefault(ip, []).append(res)
return ipport
我期望 的輸出:輸出圖片
uj5u.com熱心網友回復:
未修改的scan_command方法回傳一個代表 XML 樹的xml.etree.ElementTree.Element物件,如下所示:
<nmaprun scanner="nmap" args="/usr/bin/nmap -oX - -p 80 93.187.72.82" start="1648151628" startstr="Thu Mar 24 20:53:48 2022" version="7.80" xmloutputversion="1.04">
<scaninfo type="connect" protocol="tcp" numservices="1" services="80" />
<verbose level="0" />
<debugging level="0" />
<host starttime="1648151628" endtime="1648151629">
<status state="up" reason="syn-ack" reason_ttl="0" />
<address addr="93.187.72.82" addrtype="ipv4" />
<hostnames>
</hostnames>
<ports>
<port protocol="tcp" portid="80">
<state state="open" reason="syn-ack" reason_ttl="0" />
<service name="http" method="table" conf="3" />
</port>
</ports>
<times srtt="64487" rttvar="50416" to="266151" />
</host>
<runstats>
<finished time="1648151629" timestr="Thu Mar 24 20:53:49 2022" elapsed="1.28" summary="Nmap done at Thu Mar 24 20:53:49 2022; 1 IP address (1 host up) scanned in 1.28 seconds" exit="success" />
<hosts up="1" down="0" total="1" />
</runstats>
</nmaprun>
這是獲取protocol,portid并state從中獲取的代碼:
import nmap3
IP_RANGE = [
'93.187.72.82', '93.187.72.94', '93.187.72.115', '93.187.72.241', '93.187.72.19', '93.187.72.59',
'93.187.72.208', '93.187.72.179', '93.187.72.24', '93.187.72.137', '93.187.72.136', '93.187.72.130',
]
def scan_one_ip(ip: str, port: str) -> list[str]:
result = nmap3.Nmap().scan_command(ip, arg=f"-p {port}")
port_element = result.find("./host/ports/port")
return [
port_element.get("protocol"),
port_element.get("portid"),
port_element.find("state").get("state"),
]
def scan_port(port: str) -> dict[str, list[str]]:
return {ip: scan_one_ip(ip, port) for ip in IP_RANGE}
def main():
port = input("Enter ports (ex. 80,443)\n")
print(scan_port(port))
if __name__ == '__main__':
main()
(也可在https://gist.githubusercontent.com/md2perpe/5cca3471e3f866e77915796197d1e070/raw/cfdab2d99926030a61201748b3ec2cbbc429b7cf/main.py獲得)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449214.html
