tonijanssen-sec/port-scanner
GitHub: tonijanssen-sec/port-scanner
一个用 Python 学习项目编写的简单 TCP 端口扫描器,通过 Socket 连接探测 IPv4 目标上的开放端口。
Stars: 0 | Forks: 0
# 端口扫描器
一个用 Python 编写的端口扫描器。它搜索 IPv4 上的开放端口并将其输出。
### 为什么以及为了什么?
这是一个关于循环的练习,因为在接下来的职业再培训中马上要进行一场编程技术的考试。
我希望掌握更多技能,开发专门针对网络安全 / 攻击性安全的自定义工具和自动化脚本。
这也为我即将到来的 IT 安全实习做准备。
```
import socket
import argparse
portliste = (22, 23, 25, 53, 67, 68, 80, 110, 123, 143, 443, 445 ) #ein tuple, unveränderbar im Prozess
def main():
parser = argparse.ArgumentParser(description="Einfacher TCP-Port-Scanner. Prüft eine oder mehrere Ziel-IPs auf offene Ports. by tonijanssen-sec") #parser erstellen
parser.add_argument('ziele', type=str, nargs='+', help="Eine oder mehrere Ziel-IPs. Mehrere durch Leerzeichen trennen (kein Komma).") # Pflichtangabe: mindestens eine Ziel-IP (String), mehrere möglich = nargs'+'
parser.add_argument('--ports', type=int, nargs='*', default=portliste, help="Zu scannende Ports, durch Leerzeichen getrennt (kein Komma). Ohne Angabe: Standard Portliste.") #parser Argument erstellen, ports sind optional sonst default Wert
parser.add_argument('--timeout', type=float, default=1.0, help="Timeout pro Port in Sekunden (Standard 1.0). LAN: 0.1-0.2; über VPN höher.") #default timeout ist auf 1.0 gesetzt, kann im LAN auch auf 0.2 gesetzt werden
args = parser.parse_args() # parsed die Argumente
for ziel in args.ziele: # zieht sich die Ziele aus der Eingabe des Benutzers
for port in args.ports: # zieht die Zielports aus der Eingabe des Benutzers
fStringOffen = f"Ziel-IP: {ziel} mit der Portnummer {port} ist offen." #fString = formattierter String
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Modul socket → Funktion socket(), AF_INET = IPv4, SOCK_STREAM = TCP
s.settimeout(args.timeout) #socket timeout nach 1.0 sek
ergebnis = s.connect_ex((ziel, port)) # 0 = offen, sonst Fehlercode (errno) = zu/gefilter
if ergebnis == 0: # also wenn ergebnis offen ist, printe es
print(fStringOffen)
s.close() # schließt alle Sockets, WICHTIG, bei sehr vielen sprich 65.535 Ports scans kann System sonst abschmieren!
if __name__ == "__main__": #prüft: wird das skript direkt aufgerufen? Wenn ja rufe main() funktion auf
main()
```
### 作为 CLI 工具使用
#### 使用示例 1
**显示帮助和所有选项**
```
python port_scanner.py -h
```
#### 使用示例 2
**扫描多个目标**
```
python port_scanner.py [weitere IPs] [--ports ...] [--timeout ...]
```
#### 使用示例 3
**自定义端口和较短的 LAN 超时时间**
```
python port_scanner.py --ports 22 23 25 80 443 --timeout 0.2
```
#### 使用示例 4
**两个目标并带有更高的超时时间**
```
python port_scanner.py --timeout 1.5
```
### 我从这个项目中学到了什么
- Python 中的变量和数据类型(str, int, float, bool)
- Tuple 与 List 的区别以及何时使用它们
- if 分支在没有 else 的情况下也能工作
- 对 Tuple 进行 for 循环(单个和嵌套)
- f-strings 用于格式化输出
- Sockets:
- 创建 Socket
- 如何设置超时时间
- 如何进行连接
- 如何关闭 Socket
- `connect_ex` 在成功时返回 0,否则返回错误代码
- 嵌套循环,多个目标 × 多个端口
- argparse – 命令行参数,使得该工具无需修改代码即可配置
- 必需参数 vs 可选参数(位置参数不带 `--` 编程,可选参数带 `--` 并且通过声明和初始化的值设置 default)
- main() 函数以及 if __name__ == "__main__": 干净地封装代码并仅在直接调用时启动
标签:Python, 云原生安全, 学习项目, 插件系统, 数据统计, 无后门, 端口扫描, 网络安全, 逆向工具, 隐私保护