1 | git rm -r --cached . # 不删除本地文件 |
已经被纳入了版本管理中,则修改 .gitignore
是无效的。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
1 | git rm -r --cached . |
1 | git rm -r --cached . # 不删除本地文件 |
已经被纳入了版本管理中,则修改 .gitignore
是无效的。
解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
1 | git rm -r --cached . |
在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下:
1 | GRANT priv_type [(column_list)] ON database.table |
实例:
1 | GRANT SELECT,INSERT,DELETE,UPDATE ON *.* TO 'root'@'192.125.30.123' IDENTIFIED BY '123456' WITH GRANT OPTION; |
取消权限:
revoke all on *.* from root@localhost;
WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
GRANT 语句中可用于指定权限级别的值有以下几类格式:
权限名称 | 对应user表中的字段 | 说明 |
---|---|---|
SELECT | Select_priv | 表示授予用户可以使用 SELECT 语句访问特定数据库中所有表和视图的权限。 |
INSERT | Insert_priv | 表示授予用户可以使用 INSERT 语句向特定数据库中所有表添加数据行的权限。 |
DELETE | Delete_priv | 表示授予用户可以使用 DELETE 语句删除特定数据库中所有表的数据行的权限。 |
UPDATE | Update_priv | 表示授予用户可以使用 UPDATE 语句更新特定数据库中所有数据表的值的权限。 |
REFERENCES | References_priv | 表示授予用户可以创建指向特定的数据库中的表外键的权限。 |
CREATE | Create_priv | 表示授权用户可以使用 CREATE TABLE 语句在特定数据库中创建新表的权限。 |
ALTER | Alter_priv | 表示授予用户可以使用 ALTER TABLE 语句修改特定数据库中所有数据表的权限。 |
SHOW VIEW | Show_view_priv | 表示授予用户可以查看特定数据库中已有视图的视图定义的权限。 |
CREATE ROUTINE | Create_routine_priv | 表示授予用户可以为特定的数据库创建存储过程和存储函数的权限。 |
ALTER ROUTINE | Alter_routine_priv | 表示授予用户可以更新和删除数据库中已有的存储过程和存储函数的权限。 |
INDEX | Index_priv | 表示授予用户可以在特定数据库中的所有数据表上定义和删除索引的权限。 |
DROP | Drop_priv | 表示授予用户可以删除特定数据库中所有表和视图的权限。 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 表示授予用户可以在特定数据库中创建临时表的权限。 |
CREATE VIEW | Create_view_priv | 表示授予用户可以在特定数据库中创建新的视图的权限。 |
EXECUTE ROUTINE | Execute_priv | 表示授予用户可以调用特定数据库的存储过程和存储函数的权限。 |
LOCK TABLES | Lock_tables_priv | 表示授予用户可以锁定特定数据库的已有数据表的权限。 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 表示以上所有权限/超级权限 |
权限名称 | 对应user表中的字段 | 说明 |
---|---|---|
SELECT | Select_priv | 授予用户可以使用 SELECT 语句进行访问特定表的权限 |
INSERT | Insert_priv | 授予用户可以使用 INSERT 语句向一个特定表中添加数据行的权限 |
DELETE | Delete_priv | 授予用户可以使用 DELETE 语句从一个特定表中删除数据行的权限 |
DROP | Drop_priv | 授予用户可以删除数据表的权限 |
UPDATE | Update_priv | 授予用户可以使用 UPDATE 语句更新特定数据表的权限 |
ALTER | Alter_priv | 授予用户可以使用 ALTER TABLE 语句修改数据表的权限 |
REFERENCES | References_priv | 授予用户可以创建一个外键来参照特定数据表的权限 |
CREATE | Create_priv | 授予用户可以使用特定的名字创建一个数据表的权限 |
INDEX | Index_priv | 授予用户可以在表上定义索引的权限 |
ALL 或 ALL PRIVILEGES 或 SUPER | Super_priv | 所有的权限名 |
值只能指定为 SELECT、INSERT 和 UPDATE,同时权限的后面需要加上 列名 列表 column-list
1 | # 创建新的用户,并授予 数据有查询、插入权限,并授予 GRANT 权限 |
cat /proc/net/sockstat
1 | sockets: used 230 |
说明:
cat /proc/net/sockstat6
1 |
TCP Header
和 TCP
数据组成。32bit
,也就是 32/8=4
字节,5层,5*4 = 20
字节,那么第六层的可选项和填充也就是Tcp Options字段最大为60-20=40字节(byte)**。填充是为了使TCP首部为4字节(32bit)的整数倍。Source Port:源端口,16位(bit),2个字节(byte)。
Destination Port:目的端口,16位,2个字节。
Sequence Number:序号,发送数据包中的第一个字节的序列号,32位。
Acknowledgment Number:确认序列号,32位。
Data Offset:数据偏移,4位,该字段的值是TCP首部(包括选项)长度除以4。
标志位:6位,共6个标志位URG
表示 Urgent Pointer
字段有意义ACK
表示 Acknowledgment Number
字段有意义PSH
表示 Push
功能,RST 表示复位 TCP 连接RST
表示连接复位请求SYN
表示 SYN
报文(在建立 TCP 连接的时候使用)FIN
表示没有数据需要发送了(在关闭 TCP 连接的时候使用)
Window:窗口,表示接收缓冲区的空闲空间,16位,2个字节,用来告诉TCP连接对端自己能够接收的最大数据长度。
Checksum:校验和,16位,2个字节。
Urgent Pointers:紧急指针,16位,2个字节,只有 URG 标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。
选项和填充:最常见的可选字段是最长报文大小,又称为 MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。
数据:TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。
Tcp Options 字段的最大长度为40字节。Tcp Options 字段的一般数据结构如图所示:
选项的第一个字段 kind 说明选项的类型。有的 TCP 选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的话)指定该选项的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段 info(如果有的话)是选项的具体信息。
在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。其中,对于我们日常的分析有用的就是前面的五个字段。
SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有 DATA数据传输,RST表示连接重置。
ACK是可能与SYN,FIN等同时使用的,比如SYN和ACK可能同时为1,它表示的就是建立连接之后的响应,如果只是单个的一个SYN,它表示的只是建立连接。
TCP的几次握手就是通过这样的ACK表现出来的。但SYN与FIN是不会同时为1的,因为SYN表示的是建立连接,而FIN表示的是断开连接。
RST一般是在FIN之后才会出现为1的情况,表示的是连接重置。
一般地,当出现FIN包或RST包时,我们便认为客户端与服务器端断开了连接;而当出现SYN和SYN+ACK包时,我们认为客户端与服务器建立了一个连接。
PSH为1的情况,一般只出现在DATA内容不为0的包中,也就是说PSH为1表示的是有真正的TCP数据包内容被传递。
同步序列编号(Synchronize Sequence Numbers)栏有效,表示同步序号,用来建立连接。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。TCP序列编号是一个范围从 0~4294967295
(2^32-1) 的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。
SYN标志位和ACK标志位搭配使用,当连接请求的时候,SYN=1,ACK=0;连接被响应的时候,SYN=1,ACK= 1;
这个标志的数据包经常被用来进行端口扫描。扫描者发送一个只有SYN的数据包,如果对方主机响应了一个数据包回来,就表明这台主机存在这个端口;但是由于这种扫描方式只是进行TCP三次握手的第一次握手,因此这种扫描的成功表示被扫描的机器不很安全,一台安全的主机将会强制要求-连接-严格进行的TCP三次握手;
初始化序列号生成过程:
RFC1948中提出了一个较好的初始化序列号ISN随机生成算法。
ISN = M + F(localhost, localport, remotehost, remoteport).
M是一个计时器,这个计时器每隔4毫秒加1。
F是一个Hash算法,根据源IP、目的IP、源端口、目的端口生成一个随机数值。要保证hash算法不能被外部轻易推算得出,用MD5算法是一个比较好的选择。
ISN会和一个假的时钟绑在一起,这个时钟M会在每4微秒对ISN做加一操作,直到超过 2^32,又从0开始。这样,一个ISN的周期大约是4.55个小时。因为,我们假设我们的TCP Segment在网络上的存活时间不会超过Maximum Segment Lifetime(缩写为MSL),所以,只要MSL的值小于4.55小时,那么,我们就不会重用到ISN。
确认编号(Acknowledgement Number)栏有效。此标志表示应答域有效;有两个取值:0和1,为1的时候表示应答域有效,反之为0。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure-1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。
这个标志表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包;
此标志表示TCP包的紧急指针域有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据;
这个标志位表示Push操作,该标志置位时,指在数据包到达接收端以后,接收端不将该数据进行队列处理,立即传送给应用程序,而不是在缓冲区中排队。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。
表示发送端已经达到数据末尾,也就是说双方的数据传送完成,没有数据可以传送了,发送FIN标志位的TCP数据包后,连接将被断开。这个标志的数据包也经常被用于进行端口扫描。当一个FIN标志的TCP数据包发送到一台计算机的特定端口,如果这台计算机响应了这个数据,并且反馈回来一个RST标志 的TCP包,就表明这台计算机上没有打开这个端口,但是这台计算机是存在的;如果这台计算机没有反馈回来任何数据包,这就表明,这台被扫描的计算机存在这个端口。
TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出 SYN
连接请求后,等待对方回答 SYN+ACK
,并最终对对方的 SYN
执行 ACK
确认。
TCP三次握手的过程如下:
SYN(SEQ=x)
报文给服务器端,进入 SYN_SEND
状态。SYN
报文,回应一个 SYN (SEQ=y)ACK(ACK=x+1)
报文,进入 SYN_RECV
状态。SYN
报文,回应一个 ACK(ACK=y+1)
报文,进入 Established(已获确认的)
状态。三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的 半关闭
(half-close
)造成的。
close
,称该端执行 主动关闭(active close)
。该端的TCP于是发送一个 FIN
分节,表示数据发送完毕。FIN
的对端执行 被动关闭(passive close)
,这个 FIN
由TCP确认。注意:FIN
的接收也作为一个文件结束符(end-of-file
)传递给接收端应用进程,放在已排队等候该应用进程接收的任何其他数据之后,因为,FIN
的接收意味着接收端应用进程在相应连接上再无额外数据可接收。
close
关闭它的套接字。这导致它的 TCP
也发送一个 FIN
。FIN
的原发送端TCP(即执行主动关闭的那一端)确认这个 FIN
。既然每个方向都需要一个FIN
和一个 ACK
,因此通常需要4个分节。
注意:
(1) 通常
是指,某些情况下,步骤1的 FIN
随数据一起发送,另外,步骤2和步骤3发送的分节都出自执行被动关闭那一端,有可能被合并成一个分节。
(2) 在 步骤2 与 步骤3 之间,从执行 被动关闭一端 到 执行主动关闭一端 流动数据是可能的,这称为 半关闭
(half-close)。
(3) 当一个Unix进程无论自愿地(调用exit或从main函数返回)还是非自愿地(收到一个终止本进程的信号)终止时,所有打开的描述符都被关闭,这也导致仍然打开的任何TCP连接上也发出一个FIN
。
无论是客户还是服务器,任何一端都可以执行主动关闭。通常情况是,客户执行主动关闭,但是某些协议,例如,HTTP/1.0却由服务器执行主动关闭。
四元组:源IP地址、目的IP地址、源端口、目的端口
五元组:源IP地址、目的IP地址、协议号、源端口、目的端口
七元组:源IP地址、目的IP地址、协议号、源端口、目的端口、服务类型、接口索引
CLOSED:表示初始状态。
LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本 上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态 时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT: 这个状态与SYN_RCVD呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED:表示连接已经建立了。
FIN_WAIT_1: FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别 是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即 进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK 报文,再收到对方的 FIN 报文。但是 CLOSING 状态表示你发送 FIN 报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什 么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报 文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
LAST_ACK:它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
参考:
TcpDump 使用了独立于系统的 libpcap 的接口。libpcap 是linux平台下的网络数据包捕获函数包,大多数网络监控软件都以它为基础。tcpdump 调用libpcap 的接口在 linux 系统链路层抓包。而linux本身指定的许多访问控制规则都是基于三层或三层以上的过滤规则,所以 tcpdump 可以抓取过滤规则之前的数据包。使用tcpdump 需要有root权限。
注:网卡混杂模式:是网卡的一种工作模式,一般在抓取网卡数据包时使用。
1 | device eth0 entered promiscuous mode # 是指网卡 eth0 进入了混杂模式。 |
1 | # 解锁 |
1 | tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] |
1 | # 监听特定主机 |
TCP协议行的典型格式如下:
[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]
让我们逐个字段进行说明,并解释以下内容:
1 | 21:53:20.460144 IP 192.168.182.166.57494 > 35.222.85.5.80: Flags [P.], seq 1:88, ack 1, win 29200, |
1 | 21:53:20.460144 - 捕获的数据包的时间戳为本地时间,并使用以下格式:hours:minutes:seconds.frac, |
TCP 标志字段。 在此示例中,[P.] 表示推送确认数据包,用于确认前一个数据包并发送数据。 其他典型标志字段值如下:
1 | [.] - ACK (Acknowledgment) |
1 | seq 1:88 - 序列号在first:last表示法中。 它显示了数据包中包含的数据数量。 |
参考:
1 | cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l |
1 | cat /proc/cpuinfo | grep "cpu cores" | uniq |
1 | cat /proc/cpuinfo | grep "processor" | wc -l |
1 | cat /proc/cpuinfo | grep 'siblings' | uniq |
1 | cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq |
如果cpu cores数量是siblings数量一半,说明启动了超线程。
如果cpu cores数量和siblings数量一致,则没有启用超线程。
1 | cat /proc/cpuinfo |grep MHz|uniq |
1 | cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c |
1 | cat /proc/meminfo |
1 | dmidecode | grep "Product Name" |
1 | getconf LONG_BIT |
线程组参数详解:
参考:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b |
- | 减 - 得到负数,或是一个数减去另一个数 | a - b |
* | 乘 - 两个数相乘,或是返回一个被重复若干次的字符串 | a * b |
/ | 除 - x 除以 y | a / b |
% | 取模 - 返回除法的余数 | a % b |
** | 幂 - 返回x的y次幂 | a ** b |
// | 取整除 - 向下取接近商的整数 | >>> 9//2 4 >>> -9//2 -5 |
1 | == :等于 |
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
1 | # 海象运算符,可在表达式内部为变量赋值。Python3.8 新增。 |
1 | and |
1 | in:如果在指定的序列中找到值返回 True,否则返回 False。 |
1 | is:is 是判断两个标识符是不是引用自一个对象 |
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
1 | a = 20 |
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
1 | var1 = 1 |
在 Python 中,所说的”类型”是变量所指的内存中对象的类型。变量可以通过赋值指向不同类型的对象。
可以使用 del 语句删除一些对象引用。
del语句的语法是:
1 | del var1[,var2[,var3[....,varN]]] |
可以通过使用del语句删除单个或多个对象:
1 | del var |
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
1 | counter = 100 # 整型变量 |
1,同时为多个变量赋值。例如:
创建一个整型对象,值为 1,从后向前赋值,三个变量被赋予相同的数值。
1 | a = b = c = 1 |
2,为多个对象指定多个变量。例如:
两个整型对象 1 和 2 的分配给变量 a 和 b,字符串对象 “Python” 分配给变量 c。
1 | a, b, c = 1, 2, "Python" |
Python3 中有六个标准的数据类型:
标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
string、list 和 tuple 都属于 sequence(序列)。
空值用 None 表示
isinstance 和 type :
内置函数 type() 可以用来查询变量所指的对象类型。
1 | >>> a,b,c,d=20,5.5,True,5+4j |
isinstance
1 | >>> a=1234 |
Python3 中数字有四种类型:int(整数)、bool(布尔型)、float(浮点数)、complex(复数)。
int (整数), 可以为任意大小、包含负数,如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
整型有四种进制表示,分别为:二进制、八进制、十进制、十六进制,说明如下表所示:
种类 | 描述 | 引导符 |
---|---|---|
二进制 | 由 0 和 1 组成 | 0b 或 0B |
八进制 | 由 0 到 7 组成 | 0o 或 0O |
十进制 | 默认情况 | 无 |
十六进制 | 由 0 到 9、a 到 f、A 到 F 组成,不区分大小写 | 0x 或 0X |
bool (布尔), 如 True。
float (浮点数), 由整数部分和小数部分组成,如 1.23、3E-2
complex (复数), 由实数部分和虚数部分组成,如 1 + 2j、 1.1 + 2.2j
注意:混合计算时,Python 会把整型转换成为浮点数。
复数由实数部分和虚数部分构成,可以用a + bj,或者 complex(a,b) 表示, 复数的实部a和虚部b都是浮点型
字符串用单引号 ‘ 或双引号 “ 括起来,同时使用反斜杠 \ 转义特殊字符。Python 没有单独的字符类型,一个字符就是长度为1的字符串。Python 字符串不能被改变。向一个索引位置赋值,比如 word[0] = ‘m’ 会导致错误。
字符串的截取:索引值以 0 为开始值,-1 为从末尾的开始位置。
遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的,即不包括尾标。
1 | 变量[头下标:尾下标] |
实例:
1 | str = 'Hello, Python!' |
加号 + 是列表连接运算符,星号 * 是重复操作。
反斜杠 \ 转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r (raw),表示原始字符串
1 | print('RHello, \nPython!') |
1 | s = 'A' |
python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符
1 | para_str = """这是一个多行字符串的实例 |
Python 使用 %
格式化字符串,常用占位符如下表所示:
占位符 | 描述 |
---|---|
%s | 格式化字符串 |
%d | 格式化整数 |
%f | 格式化浮点数 |
实例:
1 | print('Hello %s' % 'Python') |
format() 方法格式化:
1 | print('{0} {1}'.format('Hello', 'Python')) |
f-string 是 python3.6 之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。
1 | name = 'Python' |
列表是写在方括号 [] 之间、用逗号分隔开的元素列表。List中的元素是可以改变的。列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套)。和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
列表截取的语法:索引值以 0 为开始值,-1 为从末尾的开始位置。
1 | 变量[头下标:尾下标] |
加号 + 是列表连接运算符,星号 * 是重复操作。
append() 向列表中添加新元素
1 | l = ['Hello', 'Python',1] |
输出:
1 | l[2] --> 2 |
del 删除列表中元素
1 | l = ['Hello', 'Python',1] |
1 | l = ['d', 'b', 'a', 'f', 'd'] |
元组(tuple)与列表类似,不同之处在于元组的元素不能修改,常用于保存不可修改的内容。元组写在小括号 () 里,元素之间用逗号隔开,元组中的元素类型也可以不相同,元组也可以使用+操作符进行拼接。
常用方法
1 | tup1 = () # 空元组 |
集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
1 | s = {'a', 'b', 'c'} |
字典的内容在花括号 {} 内,键-值(key-value)之间用冒号 : 分隔,键值对之间用逗号 ,
分隔。
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字。
1 | # 创建字典 |
Python2 中默认编码为 ASCII,内容如果为汉字,不指定编码则会乱码,想要指定编码为 UTF-8,Python 中通过在开头加入:
1 | # -*- coding: UTF-8 -*- |
Python3 中默认编码为 UTF-8,因此在使用 Python3 时,通常不需指定编码。
标识符是用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,第一个字符必须是字母表中字母或下划线 _,不能以数字开头,区分大小写。
在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的了。
以下划线开头的标识符的特殊含义:
from xxx import *
导入;1 | >>> import keyword |
1 | # 第一个注释 |
Python 使用缩进来表示代码块,控制类、函数、逻辑判断等,,不需要使用大括号 {} ,缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数,如果语句缩进数的空格数不一致,会导致运行错误。
1 | if True: |
如果Python 的语句很长,可以使用反斜杠 (\)
来实现多行语句,例如:
1 | total = one + \ |
如果包含在 []、{}、() 括号中,则不需要使用反斜杠 (\)
。如下所示:
1 | total = ['item_one', 'item_two', 'item_three', |
密码定期更换配置在 /etc/login.defs
中:
1 | PASS_MAX_DAYS 90 # 密码到期时间 |
注意:
在 /etc/login.defs
中设置仅影响创建用户,而不会影响现有用户。
如果设置为现有用户,使用命令 chage -M(days)(user)
,例如:chage -M 60 root
。
chage命令
chage 命令是用来修改帐号和密码的有效期限。
语法
chage [选项] 用户名
选项
示例
1 | # 查看root配置 |
CentOS7/RHEL7 开始使用 pam_pwquality 模块进行密码复杂度策略的控制管理。pam_pwquality 替换了原来 Centos6/RHEL6 中的 pam_cracklib 模块,并向后兼容。
retry=N 允许重试N次
difok=N 新密码必需与旧密码不同的位数 difok=3 新密码必须与旧密码有3位不同
minlen=N 最小位数
ucredit=N 大写字母位数
lcredit=N 小写字母位数
dcredit=N 数字个数
ocredit=N 特殊字母的个数
两种方式实现:
/etc/pam.d/system-auth
中的 password requisite pam_pwquality.so
行尾添加具体参数,比如 minlen=16 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1
,表示最小密码长度16位,数字,大小写字母,特殊字符均至少包含1位。N >= 0:密码中最多有多少个;
N < 0 :密码中最少有多少个;
1 | password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=8 ucredit=-1 lcredit=-1 ocredit=-1 dcredit=-1 |
/etc/security/pwquality.conf
参数文件,定义密码复杂度规则。修改 pwquality.conf
参数文件有2种方法。
(1)直接修改 /etc/security/pwquality.conf
。
(2)使用 authconfig
命令修改,修改后最终会体现在 /etc/security/pwquality.conf
。
1 | # 最小长度 |
示例:
1 | vim /etc/security/pwquality.conf |
1 | minlen = 8 |
vim /etc/pam.d/system-auth
1 | # 添加到 pam_pwquality.so 所在行的上行 |
vim /etc/pam.d/system-auth
1 | password requisite pam_cracklib.so retry=3 difok=3 minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 |
参考:
数据库审计(简称 DBAudit)能够实时记录网络上的数据库活动,对数据库操作进行细粒度审计的合规性管理,对数据库遭受到的风险行为进行告警,对攻击行为进行阻断。它通过对用户访问数据库行为的记录、分析和汇报,用来帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库网络行为记录,提高数据资产安全。数据库审计可以记录某用户在某个时间点对数据库的操作,包括登录、连接、对表的增删改查等等,便于责任追溯,问题查找,当然开启审计功能在一定方面会影响数据库性能。
由于MySQL的社区版不支持审计系统,可通过第三方插件实现,此次采用MariaDB的server_audit插件来记录{时间,节点,用户,源IP,事件类型,库,语句,影响行数},注:从mysql8开始已不支持该插件。
1,登陆 Mysql,查看插件安装目录:
1 | mysql> show global variables like 'plugin_dir'; |
2,提取 Mariadb 审计插件,并放置Mysql插件目录。
1 | # 拷贝 |
3,新建 auditlogs 目录,并更改所属的组和用户
1 | mkdir /usr/local/mysql/auditlogs |
4,修改my.cnf配置文件
vim /usr/local/mysql/my.cnf
在 [mysqld] 标签下添加:
1 | #防止server_audit 插件被卸载 进行配置文件配置 |
4,重启mysql
1 | /etc/init.d/mysqld restart |
1 | mysql> show variables like '%audit%'; |
1 | cat /usr/local/mysql/auditlogs/server_audit.log |
参考: