注:个人笔记,并不详细,仅供参考。
如果遇到了错误(异常),如何去处理?
当程序运行时,因为遇到未知的错误而导致中止运行,便会出现Traceback 消息,打印异常。异常即是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。一般情况下,在Python 无法正常处理程序时就会发生一个异常。异常是Python 对象,表示一个错误。当Python 脚本发生异常时我们需要响应处理它,否则程序会终止执行。
异常 | 描述 |
---|---|
SyntaxError | 语法错误 |
NameError | 未声明/初始化对象 |
IndexError | 序列中没有此索引 |
KeyboardInterrupt | 用户中断执行(Ctrl+C) |
EOFError | 没有内建输入,到达EOF 标记(Ctrl+D) 不适用windows 系统 |
IOError | 输入/输出操作失败 |
ValueError | 当操作或函数接收到具有正确类型但值不适合的参数, 并且情况不能用更精确的异常,例如 IndexError来描述时将被引发。 |
TypeError | 字符串与整数相加时触发。 |
如果一个语句发生了错误或异常,跳过该语句的执行,执行另外的语句。
尝试执行try 语句,如果遇到异常(行不通)则执行except 语句。两个语句执行执行一个。
语法规则
try:
pass # 监控这里的异常
except Exception[, reason]:
pass # 异常处理代码
示例:
# 01 - 异常初探.py
try:
username = input("Please input your name: ")
print(f"Welcome, {username}")
except:
print("\nSomething Error!")
算命脚本:输入年龄,预测明年的年龄。
可以把多个except 语句连接在一起,处理一个try 块中可能发生的多种异常。
# 02 - 捕获多种异常.py
banner = '''
算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''
print(banner)
choice = input("Please input the number: ")
choice = int(choice)
if choice != 1:
print("好好学习...")
exit()
try:
age = input("Please input your age: ")
print(f"The next year your name: {int(age) + 1}")
except ValueError:
print("Please input a number!")
except KeyboardInterrupt:
print("\nCtrl + C")
except:
print("\nSomething Error!")
如果出现的异常没有出现在指定要捕获的异常列表中,程序仍然会中断。可以使用在异常继承的树结构中,BaseException 是在最顶层的,所以使用它可以捕获任意类型的异常。
except BaseException: # 捕获所有异常,相当于except
print("\nSomething Error!")
Pyhton 异常树
BaseException 所有异常的基类
|
|
+-- SystemExit 解释器请求退出
|
|
+-- KeyboardInterrupt 用户中断执行(通常是输入^C)
|
|
+-- GeneratorExit 生成器调用close();方法时触发的
|
|
+-- Exception 常规错误的基类,异常都是从基类Exception继承的。
|
+-- StopIteration 迭代器没有更多的值
|
+-- StandardError 所有的内建标准异常的基类
| +-- BufferError 缓冲区操作不能执行
| +-- ArithmeticError 所有数值计算错误的基类
| | +-- FloatingPointError 浮点计算错误
| | +-- OverflowError 数值运算超出最大限制
| | +-- ZeroDivisionError 除(或取模)零 (所有数据类型)
| +-- AssertionError 断言语句失败
| +-- AttributeError 访问未知对象属性
| +-- EnvironmentError 操作系统错误的基类
| | +-- IOError 输入输出错误
| | +-- OSError 操作系统错误
| | +-- WindowsError (Windows) 系统调用失败
| | +-- VMSError (VMS) 系统调用失败
| +-- EOFError 没有内建输入,到达EOF 标记
| +-- ImportError 导入模块/对象失败
| +-- LookupError 无效数据查询的基类,键、值不存在引发的异常
| | +-- IndexError 索引超出范围
| | +-- KeyError 字典关键字不存在
| +-- MemoryError 内存溢出错误(对于Python 解释器不是致命的)
| +-- NameError 未声明/初始化对象 (没有属性)
| | +-- UnboundLocalError 访问未初始化的本地变量
| +-- ReferenceError 弱引用(Weak reference)试图访问已经垃圾回收了的对象
| +-- RuntimeError 一般的运行时错误
| | +-- NotImplementedError 尚未实现的方法
| +-- SyntaxError 语法错误
| | +-- IndentationError 缩进错误
| | +-- TabError Tab 和空格混用
| +-- SystemError 一般的解释器系统错误
| +-- TypeError 对类型无效的操作
| +-- ValueError 传入无效的参数
| +-- UnicodeError Unicode 相关的错误
| +-- UnicodeDecodeError Unicode 解码时的错误
| +-- UnicodeEncodeError Unicode 编码时错误
| +-- UnicodeTranslateError Unicode 转换时错误
|
+-- Warning 警告的基类
+-- DeprecationWarning 关于被弃用的特征的警告
+-- PendingDeprecationWarning 关于特性将会被废弃的警告
+-- RuntimeWarning 可疑的运行时行为(runtime behavior)的警告
+-- SyntaxWarning 可疑的语法的警告
+-- UserWarning 用户代码生成的警告
+-- FutureWarning 关于构造将来语义会有改变的警告
+-- ImportWarning 关于模块进口可能出现错误的警告的基类。
+-- UnicodeWarning 有关Unicode警告的基类。
+-- BytesWarning 有关字节警告相关的基类。
try: # 尝试执行某个语句
num = int(input("The number:"))
except BaseException: # 如果遇到异常,执行的语句
print("something error!")
else: # 如果没有遇到异常,执行的语句
print(num)
finally: # 不管是否遇到异常,都要执行的语句。
print("This is finally")
# 03 - 处理异常.py
banner = '''
算命脚本
1. 预测年龄
2. 预测财运
3. 预测姻缘
'''
print(banner)
choice = input("Please input the number: ")
choice = int(choice)
if choice != 1:
print("好好学习...")
exit()
try:
age = input("Please input your age: ")
age = int(age)
except ValueError:
print("Please input a number!")
except KeyboardInterrupt:
print("\nCtrl + C")
except:
print("\nSomething Error!")
else:
print(f"The next year your name: {age + 1}")
finally:
print("脚本执行结束,祝你好运!")
with 语句是用来简化代码的。比如在将打开文件的操作放在with 语句中,代码块结束后,文件将自动关闭。用来简化文件操作的打开和关闭,其中closed 属性是判断文件是否被关闭的
>>> with open('foo.py') as f:
与scrapy 有非常大的区别。
scapy 是一个Python 的第三方模块,被称为“网络神器”。scapy 模块能够发送、捕获、分析和铸造网络数据包。
Windows 下安装scapy
python -m pip install scapy
Kali 中自带scapy 环境。
┌──(root㉿kali)-[~]
└─# scapy
aSPY//YASa
apyyyyCY//////////YCa |
sY//////YSpcs scpCY//Pp | Welcome to Scapy
ayp ayyyyyyySCP//Pp syY//C | Version 2.5.0
AYAsAYYYYYYYY///Ps cY//S |
pCCCCY//p cSSps y//Y | https://github.com/secdev/scapy
SPPPP///a pP///AC//Y |
A//A cyP////C | Have fun!
p///Ac sC///a |
P////YCpc A//A | We are in France, we say Skappee.
scccccp///pSP///p p//Y | OK? Merci.
sY/////////y caa S//P | -- Sebastien Chabal
cayCyayP//Ya pY/Ya |
sY/PsY////YCc aC//Yp
sc sccaCY//PCypaapyCP//YSs
spCPY//////YPSps
ccaacs
using IPython 8.5.0
>>>
构造数据包
>>> pkt = IP()/TCP()
>>> pkt.show()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = tcp
chksum = None
src = 127.0.0.1
dst = 127.0.0.1
\options \
###[ TCP ]###
sport = ftp_data
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = ''
>>> pkt = IP(src = "192.168.1.11", dst = "192.168.1.1")/TCP()
>>> pkt.show()
###[ IP ]###
version = 4
ihl = None
tos = 0x0
len = None
id = 1
flags =
frag = 0
ttl = 64
proto = tcp
chksum = None
src = 192.168.1.11
dst = 192.168.1.1
\options \
###[ TCP ]###
sport = ftp_data
dport = http
seq = 0
ack = 0
dataofs = None
reserved = 0
flags = S
window = 8192
chksum = None
urgptr = 0
options = ''
>>>
发送数据包
发送数据包的函数 | 说明 |
---|---|
sr(pkt) | 发送数据包,接收所有返回包 |
sr1(pkt) | 发送数据包,接收一个返回包 |
send(pkt) | 发送数据包,不等待返回包 |
srp(pkt) | 发送2 层数据包,等待回应 |
sendp(pkt) | 发送2 层数据包,不等待返回包 |
>>> res = sr1(pkt)
Begin emission:
Finished sending 1 packets.
.*
Received 2 packets, got 1 answers, remaining 0 packets
>>>
查看返回包
>>> res.show() # 查看返回包
###[ IP ]###
version = 4
ihl = 5
tos = 0x0
len = 44
id = 13990
flags =
frag = 0
ttl = 255
proto = tcp
chksum = 0x46a4
src = 10.9.21.1
dst = 10.9.21.111
\options \
###[ TCP ]###
sport = http
dport = ftp_data
seq = 1510518667
ack = 1
dataofs = 6
reserved = 0
flags = SA
window = 65535
chksum = 0x4f9c
urgptr = 0
options = [('MSS', 1460)]
###[ Padding ]###
load = '\x00\x00'
>>>
# 04 - 内网主机存活检测程序.py
from scapy.all import *
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
network = "192.168.1."
for host in range(1, 20):
ip = f"{network}{host}"
print(f"[-] Trying: {ip}")
pkt = IP(src = "192.168.1.11", dst = ip)/ICMP()
res = sr1(pkt, timeout = 0.2, verbose = False)
if res :
print(f"[+] Alive: {ip}")