<p>您的代码中有一些拼写错误。代码不执行任何操作,因为检查输入参数的所有<code>if</code>都是错误的。例如:</p>
<pre><code>if len(sys.argv) == 1 in sys.argv:
</code></pre>
<p>应该是:</p>
<pre><code>if len(sys.argv) == 2:
</code></pre>
<p>sys.argv始终具有您正在运行的脚本的路径,因此sys.argv的len至少为1。
另外,请检查变量名,因为<code>destIPs</code>不存在</p>
<p>我修复了所有代码(仅当只有1个ip设置为输入时的部分):</p>
<pre><code>import sys
import random
from scapy.all import Net, sr, sr1
from scapy.layers.inet import IP, TCP
if len(sys.argv) < 1 or "-help" in sys.argv:
print('''
Welcome to the port scanner
To use this program enter a IP address, address range or domain.
And it must also be used in CLI or Powershell
How to use this program:
Enter the destination IP, address range or domain into
the CLI or Powershell window
''')
sys.exit()
# User inputs an IP address, address or domain into a CLI or Powershell
destIP = Net(sys.argv[1])
# Ports that will be scanned:
# 21 - FTP
# 22 - SSH
# 23 - Telnet
# 25 - SMTP
# 53 - DNS
# 80 - HTTP
# 110 - POP3
# 135 - Windows RPC
# 137 - Windows NetBIOS over TCP
# 138 - Windows NetBIOS over TCP
# 139 - Windows NetBIOS over TCP
# 443 - HTTPS
# 1433 - Microsoft SQL Server
# 1434 - Microsoft SQL Server
# 8080 - HTTP Alternative
PortRange = [21, 22, 23, 25, 53, 80, 110, 135, 137, 138, 139, 443, 1433, 1434, 8080]
# If user inputs one value this if statement will execute
if len(sys.argv) == 2:
for destPort in PortRange:
# Source port is randomized using the random module from port 1025 to 65334.
srcport = random.randint(1025, 65534)
tcp_connect_scan_resp = sr1(IP(dst=destIP) / TCP(sport=srcport, dport=destPort, flags="S"), timeout=10)
# If there is not answer from the port scanned the program will print
# # The port is filtered
if tcp_connect_scan_resp is None:
print(f"{destIP}:{destPort} is filtered.")
elif tcp_connect_scan_resp.haslayer(TCP):
# If the port scanned give answers with a SYN ACK the program will print the port is open
if tcp_connect_scan_resp.getlayer(TCP).flags == 0x12:
send_rst = sr(IP(dst=destIP) / TCP(sport=srcport, dport=destPort, flags="AR"), timeout=10)
print(f"{destIP}:{destPort} is open.")
# If the port gives an answer but resets the connection the program will print the port is closed.
elif tcp_connect_scan_resp.getlayer(TCP).flags == 0x14:
print(f"{destIP}:{destPort} is closed.")
</code></pre>