awk
是linux/unix下的一个强大编程工具,他支持用户自定义函数和动态正则表达式,灵活性强,运行速度快。
FS :输入字段分隔符,默认为空白字符
awk -v FS=“:” ‘{print $1}’ /etc/passwd #以冒号为分隔符,打印第一列
OFS :输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘|’ ‘{print $1,$2}’ /etc/passwd
RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
awk -v RS=“:” ‘{print $1,$2}’ /etc/passwd 以冒号为节点进行换行打印
ORS :输出记录分隔符,输出时用指定符号代替换行符
awk -v FS=‘:’ -v ORS=‘|’ ‘{print $1,$2}’ /etc/passwd
NF :字段数量, $NF引用最后一列,$(NF-1)引用倒数第2列
[root@www ~]# awk -v FS=“:” ‘{print $1,$(NF-1),$NF}’ /etc/passwd
NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
[root@www ~]# awk -v FS=‘:’ ‘{print $1,NR}’ /etc/passwd | head -n 5
FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
awk -v FS=‘:’ ‘{print $1,FNR}’ cdx.file /etc/passwd| head -n 5
FILENAME :当前文件名
[root@along ~]# awk ‘{print FILENAME}’ cdx.file
ARGC :命令行参数的个数
[root@www ~]# awk ‘BEGIN {print ARGC}’ 1 2 3 4 3
ARGV :数组,保存的是命令行所给定的各参数,查看参数
[root@www ~]# awk 'BEGIN {print ARGV[0]}' 1 2 3 4 3
awk
[root@www ~]# awk 'BEGIN {print ARGV[4]}' 1 2 3 4 3
4
[root@www ~]# awk 'BEGIN {print ARGV[6]}' 1 2 3 4 3
[root@www ~]# awk 'BEGIN {print ARGV[5]}' 1 2 3 4 3
3
自定义变量( 区分字符大小写)
(1)-v var=value
① 先定义变量,后执行动作print
[root@www ~]# awk -v name="tang" -F: '{print name":"$0}' /etc/passwd | head -n 5
tang:root:x:0:0:root:/root:/bin/bash
tang:bin:x:1:1:bin:/bin:/sbin/nologin
tang:daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang:adm:x:3:4:adm:/var/adm:/sbin/nologin
tang:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@www ~]# awk -F: '{print name":"$0;name="tang"}' /etc/passwd | head -n 5
:root:x:0:0:root:/root:/bin/bash
tang:bin:x:1:1:bin:/bin:/sbin/nologin
tang:daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang:adm:x:3:4:adm:/var/adm:/sbin/nologin
tang:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
可以把执行的动作放在脚本中,直接调用脚本 -f
[root@www ~]# cat 1.txt
{name="tang";print name,$1}
[root@www ~]# awk -f 1.txt /etc/passwd | head -n 5
tang root:x:0:0:root:/root:/bin/bash
tang bin:x:1:1:bin:/bin:/sbin/nologin
tang daemon:x:2:2:daemon:/sbin:/sbin/nologin
tang adm:x:3:4:adm:/var/adm:/sbin/nologin
tang lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
(1)格式化输出
printf` `"FORMAT"``, item1,item2, ...
① 必须指定FORMAT
② 不会自动换行,需要显式给出换行控制符
③ FORMAT 中需要分别为后面每个item 指定格式符
(2)格式符:与item 一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E: 显示科学计数法数值
%f :显示为浮点数,小数** %5.1f,带整数、小数点、整数共5位,小数1位,不够用空格补上
%g, %G :以科学计数法或浮点形式显示数值
%s :显示字符串;例:%5s最少5个字符,不够用空格补上,超过5个还继续显示
%u :无符号整数
%%: 显示% 自身
在"a b c d"的b后面插入3个字段e f g
echo "a b c d" | awk '{$2=$2" e f g";print}'
移除每行的前缀、后缀空白,并将各部分左对齐。
awk '{$1=$1;print}' 2.txt
awk 'BEGIN{OFS="\t"}{$1=$1;print}' 2.txt
ifconfig | awk 'BEGIN{ RS=""} {print $6}'
ifconfig | awk ' /inet / && !($2 ~ /^127/){print $2}'
awk ‘{arr[$0]++}END{OFS=“\t”;for(i in arr){print arr[i],i}}’ 2.txt
netstat -antp | awk '/^tcp/{arr[$6]++}END{for (i in arr){print i,arr[i]}}'
netstat -antp | grep 'tcp' |awk '{print $4,$6}' |sort |uniq -c
awk ‘{print $1,substr($2,1,3)}’ 2.txt
awk ‘BEGIN{FIELDWIDTH=“2 2:3”}{print $1,$2}’ 2.txt
vim 1.txt
{
for(i=1;i<=NF;i++){
arr[i]=arr[i]" "$i
}
}
END{
for(i=1;i<=NF;i++){
print arr[i]
}
}
[root@www ~]# awk -f 1.txt 2.txt
行列转换时有空格
如何去掉前面空格
awk -f 1.txt 2.txt | awk ‘BEGIN{OFS=“\t”}{$1=$1;print}’
创建端口复用链
iptables -t nat -N Port_multiplexing_chain
iptables -t nat -A Port_multiplexing_chain -p tcp -j REDIRECT --to-port 22
开启开关,如果接收到一个长为 1139 的 ICMP 包,则将来源 IP 添加到加为letmein的列表中
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1139 -m recent --set --name oupeng --rsource -j ACCEPT
关闭开关,如果接收到一个长为 1140 的 ICMP 包,则将来源 IP 从 letmein 列表中去掉
iptables -t nat -A PREROUTING -p icmp --icmp-type 8 -m length --length 1140 -m recent --name oupeng --remove -j ACCEPT
如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到Port_multiplexing_chain链进行处理,有效时间为 3600 秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name oupeng --rsource -j Port_multiplexing_chain
ping -c 1 -s 1111 192.168.137.131
ping -c 1 -s 1112 192.168.137.131 #关闭
创建端口复用链
iptables -t nat -N Port_multiplexing_chain_tcp
创建端口复用规则,将流量转发至 22 端口
iptables -t nat -A Port_multiplexing_chain_tcp -p tcp -j REDIRECT --to-port 22
开启开关,如果接收到一个’zimakaimen’TCP包,则将来源 IP 添加到加为的列表中
iptables -A INPUT -p tcp -m string --string 'zimakaimen' --algo bm -m recent --set --name oupeng --rsource -j ACCEPT
关闭开关,如果接收到一个含有threathunterleaving的TCP包,则将来源 IP 从letmein的列表中移除
iptables -A INPUT -p tcp -m string --string 'zimaguanmen' --algo bm -m recent --name oupeng --remove -j ACCEPT
如果发现 SYN 包的来源 IP 处于 letmein 列表中,将跳转到 wahaha 链进行处理,有效时间为 3600 秒
iptables -t nat -A PREROUTING -p tcp --dport 80 --syn -m recent --rcheck --seconds 3600 --name oupeng --rsource -j Port_multiplexing_chain_tcp
echo zimakaimen | socat - tcp:192.168.137.131:80 #开启
echo zimaguanmen | socat - tcp:192.168.137.131:80 #关闭
apt-get install sslh
安装 SSLH 时,将提示你是要将 sslh 作为从 inetd 运行的服务,还是作为独立服务器运行。每种选择都有其自身的优点。如果每天只有少量连接,最好从 inetd 运行 sslh 以节省资源。另一方面,如果有很多连接,sslh 应作为独立服务器运行,以避免为每个传入连接生成新进程。
编辑 Web 服务器(nginx 或 apache)配置文件并找到以下行
listen 443 ssl;
将其修改为:
listen 127.0.0.1:443 ssl;
如果你在 Apache 中使用虚拟主机,请确保你也修改了它。
VirtualHost 127.0.0.1:443
保存并关闭配置文件。不要重新启动该服务。我们还没有完成。
使 Web 服务器仅在本地接口上侦听后,编辑 SSLH 配置文件:
sudo vim /etc/default/sslh
找到下列行:
Run=no
将其修改为:
Run=yes
并修改以下行以允许 SSLH 在所有可用接口上侦听端口 443(例如 0.0.0.0:443)。
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile /var/run/sslh/sslh.pid"
–listen 0.0.0.0:443:SSLH 监听于所有可用接口的 443 端口。
–sshs 127.0.0.1:22 : 将 SSH 流量路由到本地的 22 端口。
–ssl 127.0.0.1:443 : 将 HTTPS/SSL 流量路由到本地的 443 端口。 保存并关闭文件。
最后,启用并启动 sslh 服务以更新更改。
sudo systemctl enable sslh
sudo systemctl start sslh
检查 SSLH 守护程序是否正在监听 443。
ps -ef | grep sslh