网络安全之linux命令大全

基础

镜像

http://mirrors.aliyun.com/centos/7.9.2009/?spm=a2c6h.25603864.0.0.31de66edBcsFsM
https://archive.kernel.org/centos-vault/7.2.1511/isos/x86_64/
DVD:普通安装版,需安装到计算机硬盘才能用。文件比较大,包含一系列常用的软件。适合在虚拟机中安装学习。安装的时候可以选择性的安装。
Everything:包括各种packages。太大,挺多东西暂时用不到,不推荐。
LiveGNOME:GNOME桌面版。
LiveKDE:KDE桌面版。
Minimal:最小安装版,一般文本编辑器都没有,不推荐。
NetInstall:这个是网络安装的启动盘。

挂载数据盘

摘自

https://www.cnblogs.com/nsw2018/p/6441542.html
mkdir /data0
fdisk -l
fdisk /dev/vdb

n, p, 1, 回车,回车, wq

mkfs.ext3 /dev/vdb1
fdisk -l
mount /dev/vdb1 /data0
echo '/dev/vdb1  /data0 ext3    defaults    0  0' >> /etc/fstab

配置yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
cd /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
yum -y update

centos版本

cat /etc/centos-release

ssh

win10自带ssh命令
ssh root@192.168.174.134
ssh -l root 192.168.174.134

手机连接ssh,用juicessh

scp

上传,把windows上的1.txt上传到linux上
scp E:\note\linux\1.txt root@192.168.174.134:/tmp/
下载,把linux上的2.txt下载到windows上
scp root@192.168.174.134:/tmp/2.txt E:\note\linux\

如果是文件夹添加-r参数

文件系统

[root@bogon tmp]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 899M     0  899M    0% /dev
tmpfs                    910M     0  910M    0% /dev/shm
tmpfs                    910M  9.6M  901M    2% /run
tmpfs                    910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root   39G   25G   14G   64% /
/dev/sda1               1014M  194M  821M   20% /boot
/dev/mapper/centos-home   19G   33M   19G    1% /home
tmpfs                    182M     0  182M    0% /run/user/0

/dev 设备信息,安全一般不关注
/dev/shm 内存大小的一半,直接占用了内存,意味着直接把数据写到内存里,将内存高效运用
复制一个500M到/dev/shm下后,用free查看内存会变少500M,不过内存断点会丢失
cp /opt/xampp-linux-x64-7.3.29-1-installer.run /dev/shm/
目录作用
/boot系统启动时的文件目录
/bin内置命令
/usr/sbin管理员用到的命令
/etc操作系统的配置文件
/lib动态链接共享目录,***.so,类似C:\windows\system32下面的dll
/proc内存信息cat /proc/meminfo,cat /proc/cpuinfo
/opt可选目录,默认为空,用户自选安装目录
/home同上

启动级别(“安全模式”)

/etc/inittab

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动;
运行级别1:单用户工作状态,root权限,用于系统维护,禁止运程登陆 ;
运行级别2:多用户状态(没有NFS);
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式;
运行级别4:系统未使用,保留;
运行级别5:X11控制台,登陆后进入图形GUI模式;
运动级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。

init 0为关机,可以用init切换,但是别把文件设置为0

关机与重启

命令作用
reboot立即重启
shutdown -r now立即重启
shutdown -r 11:3011:30重启
shutdown -r +11分钟后重启
halt关机
shutdown -h now立即关机
shutdown -h 11:3011:30关机
init 0关机
init 6重启

监控指标

命令作用
top%Cpu(s): 0.0 us(用了多少), 0.0 sy, 0.0 ni,100.0 id(还剩多少), KiB
Mem : 1862996 total, 1325656 free, 258700 used, 278640 buff/cacheKiB
Swap(交换,虚拟内存): 2097148 total, 2097148 free, 0 used. 1448560 avail Mem
fdisk -l物理硬盘
du -sh /etc指定目录/文件占用大小

操作文件

命令作用
vim /tmp/1.txt编辑
touch /tmp/1.txt创建空白文件
cat > /tmp/1.txt << EOF创建文件,在console输入文件内容,输入EOF表示输入完成,如果不加<< EOF那么使用ctrl+D也是可以的
more /proc/cpuinfo回车一行一行,一次性加载
less /proc/cpuinfo回车一行一行,读一行加载一行
head -n 10 /etc/passwd查看前10行
tail -n 10 /etc/passwd查看后10行
tail -f 1.txt实时查看文件

vim快捷键

命令作用
a/i进入编辑模式,i插入,a追加
o当前目录下一行编辑
O上方插入一行
esc进入命令模式
$光标移动到行位
^光标移动到行首
dd删除一行
D删除当前行光标以后的
gg首行
G末行
s删除一个字符并切换到编辑模式
S删除一行并切换到编辑模式
ZZ保存退出
U撤销
命令作用
:n移动至第n行
/字符串命令模式下查找字符串(按n下一个)
:u和U一样,撤销

find

命令作用
find /etc -name “yum*”查找/etc下文件名以yum开头的
find /etc -name “[a|b|c]*”查找/etc下文件名以a/b/c开头的
find /etc -name “[abc]*”同上
find /etc -name “*[A-Z]”查找/etc下文件名以大写字母结尾的
find /etc -name “*[0-9a-zA-Z]”查找/etc下文件名以数字字母结尾的
find /etc -name “passw?rd*”?代表一个任意字符,*是贪婪模糊匹配
find /etc -name “[^a-z*]”查找/etc下文件名不以小写字母开头的(\为转义)
find /etc -name “[\\*]”查找/etc下文件名以\开头的(\为转义)
find /etc -perm 777查找权限777的文件
find /etc -path “./yum” -prune -o -name “test”查找etc下÷yum目录之外的目录中包含test的文件或文件夹
find /etc -user root属主
find /etc -group root属组
find /etc -mtime -11天内更新过的
find /etc -mtime +11天前更新过的
find /etc -newer 1.txt比1.txt更新的文件
find /etc ! -newer 1.txt比1.txt更早的文件
find /etc -type l软连接
find /etc -size 1024c查找为1024字节的,c字节、k为KB、M、G
find /etc -size +1024c大于1024字节
命令作用
find /etc -name “yum*” | xargs ls -l找到再执行命令,例如:ls -l
find /etc -name “yum*” -exec ls -l {} ;同上
find /etc -name “passwd” | xargs cat | grep root > /tmp/1.txt找到etc下的passwd文件,查找文件,并将包含root的行写入1.txt
find /etc -name “passwd” | xargs cat | grep root > /tmp/1.txt找到etc下的passwd文件,查找文件,并将包含root的行写入1.txt
head -n 10 /etc/passwd | tail -n 5先查询前10行,然后再前10行中找到后五行,那就是passwd的5-10行

管道符xargs

xargs
x为exec可执行,args参数,如果是前面命令的输出作为后面命令的参数就用args,如果前面命令的输出作为后面的输入就用 |
两条命令的区别
find /etc -size 1024c | grep txtgrep找的是find结果(文件列表)
find /etc -size 1024c | xargs grep txt加上xargs后,grep找的是find结果中文件内容

grep

查找/etc/passwd文件内容中包含root的
grep root /etc/passwd
cat /etc/passwd | grep root

加上-n,会显示是内容的第几行
grep -n root /etc/passwd

不包含root的
grep -v root /etc/passwd

递归查找
grep -r root /etc/passwd

以root开头
grep "^root" /etc/passwd

以sh结尾
grep "sh$" /etc/passwd

以root开头,以sh结尾,.*表示中间多位任意字符
grep "^root.*sh$" /etc/passwd

wc

word count,用于统计

find /etc -name "yum*" | wc -l

查询文件行数
wc -l 1.txt

ls

ls -l
ll
显示大小+详细
ll -ah
递归文件列表
ls -R

查询当前目录下,文件内容包含123的文件
ls | xargs grep 123

隐藏文件

创建文件的时候前面加.
vim .1.txt

日期

date -s "2023-02-29 21:35:00"
命令内容覆盖写入文件
date > 1.txt
追加写入
date >> 1.txt

压缩与归档

归档是把一堆文件放在一起,并不压缩
cp -r /var/log /tmp
tar归档,c创建归档,f指定文件,v过程信息
cd /tmp/log/
tar -cvf log.tar ./*
du -sh log.tar

对tar进行压缩
cp log.tar /tmp/
cd /tmp
gzip log.tar
解压缩
gzip -d log.tar.gz

加上-z才是压缩,不加就是归档,将当前目录下所有压缩
tar -zcvf 1.tar.gz ./*
解压缩到当前目录
tar -zxvf 1.tar.gz ./
yum install zip
压缩文件
zip 1.zip 1.txt
压缩目录
aip -r 1.zip /etc/
将多个文件(linux_waf/ waf_install.sh waf.service)压缩成zip包
zip -r linux_waf.zip linux_waf/ waf_install.sh waf.service

查看压缩文件信息
unzip -v 1.zip
解压缩
unzip 1.zip
将zip解压缩到指定目录
unzip /data/waf/package/linux_waf.zip -d /data/waf/package/

配置jdk

vim /etc/profile
export JAVA_HOME=/app/jdk-11.0.8
export JRE_HOME=/app/jdk-11.0.8/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
java -version

网络

ping(icmp)

判断网络是否联通,以及响应时间

[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=128 time=20.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=4 ttl=128 time=20.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=5 ttl=128 time=20.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=6 ttl=128 time=20.0 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5041ms
rtt min/avg/max/mdev = 20.087/20.217/20.380/0.217 ms

发了56个字节的数据包
6 packets transmitted, 6 received, 0% packet loss, time 5041ms
#发了6个包,接到了6个包的响应
rtt min/avg/max/mdev = 20.087/20.217/20.380/0.217 ms
最短时间/平均事件/最长时间/方差(抖动)

在这里插入图片描述

ping -i 3 www.baidu.com
每3秒访问一次

ping -c 3 www.baidu.com
只发3个包

ping -f www.baidu.com
一直发数据报,压力测试(不要乱ping容易被封)

ping -f -c 200 www.baidu.com
用了-c,快速检测网络

ping -s 1024 www.baidu.com
设置包大小

arp

查找局域网的其他ip,当然是通过arp方式

arp -an
ip neigh

ifconfig

ifconfig
ip addr
ip link
ifconfig -a
ip addr show
查看网卡及接受发送数据
ifconfig -s
ip -s link

[root@localhost ~]# ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
br-c7ef4d2f78e8  1500        0      0      0 0             0      0      0      0 BMU
docker0          1500        0      0      0 0             0      0      0      0 BMU
ens33            1500      435      0      0 0           465      0      0      0 BMRU
lo              65536      171      0      0 0           171      0      0      0 LRU

#网卡ens33接收了(RX-OK)435,发送了(TX-OK)465,注意错位

在这里插入图片描述

临时修改网卡IP
ifconfig ens33 192.168.112.225

临时为网卡添加一个IP,同一个网卡可以多个IP,systemctl restart network后消失
ip addr add 192.168.112.225/24 dev ens33

ip addr del 192.168.112.225/24 dev ens33

在这里插入图片描述

查看路由
route
ip route
netstat -r
route -n

netstat

查看端口

查看当前系统中的端口占用
netstat -anlop
ss -anl

只查询跟tcp相关的(-t)
netstat -ant

traceroute

经过的每个路由节点

traceroute www.baidu.com
tracert www.baidu.com

curl

curl http://www.baidu.com
保存到文件里
curl -o 1.html http://www.baidu.com
发送get请求
curl -X GET -I http://192.168.21.187:8088/#/login
curl用法大全
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

进程

ps

当前终端启动的进程
ps
查看当前操作系统所有进程
ps -ef
在ef的基础上增加了cpu和内存
ps aux

根据进程id查看进程距今运行时常
ps -o lstart,etime -p  27879

ps -ef | grep 不显示自己
ps -ef | grep lampp | grep -v grep
或者把进程的任何一个字符加[]
ps -ef | grep [l]ampp
sort命令
[root@localhost app]# cat sort.txt
test 30
Hello 95
Linux 85
按第一列排序
[root@localhost app]# sort sort.txt
Hello 95
Linux 85
test 30
按第2列排序
[root@localhost app]# sort -k 2 sort.txt
test 30
Linux 85
Hello 95

在这里插入图片描述

使用进程查看的方式,并对cpu排序,输入yes命令,一直打印y
yes
默认为升序排列
ps aux | sort -k 3
降序排列
ps aux | sort -k 3 -r
只取前5个(标题占一个)
ps aux | sort -k 3 -r | head -n 6

查看内存使用前10进程
ps aux|sort -k4,4nr|head -n 10

查看睡眠进程
ps -axjf

top

间隔多久更新一次
top -d 5
循环多少次
top -n 5

CPU取前5
top -n 1 | sort -k 9 -r | head -n 6

查看子线程使用
top -Hp  Pid

kill

kill -s 9 `pgrep nginx`

服务

service

centos7前使用,其他linux发行版也会使用

service sshd status
service sshd start
service sshd stop
service sshd restart

systemctl

centos7及以后,也兼容service

systemctl status sshd
systemctl start sshd
systemctl stop sshd
systemctl restart sshd

systemctl enable sshd
systemctl disable sshd

查看哪些服务开启了自启动
systemctl list-unit-files | grep enabled

查看所有已启动的服务
systemctl list-units --type=service

nginx封装成服务

cp /data/waf/waf.service /etc/systemd/system/waf.service
chmod 755 /etc/systemd/system/waf.service
systemctl enable waf

waf.service

[Unit]
Description=waf
After=network.target

[Service]
Type=forking
ExecStart=/data/waf/software/nginx/sbin/nginx
ExecReload=/data/waf/software/nginx/sbin/nginx -s reload
ExecStop=/data/waf/software/nginx/sbin/nginx stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

流量监控

tcpdump

抓取指定网卡的包
tcpdump -i ens33
本地开启lamp的80后,筛选出tcp协议目标端口为80的
tcpdump tcp and dst port 80 -i ens33
保存到文件中
tcpdump tcp and dst port 80 -i ens33 -w ./target.cap
只捕获100条数据包就自动结束
tcpdump tcp and dst port 80 -i ens33 -c 100

iptables

常用的两张表:filter、nat
常用的两条链:INPUT、OUTPUT
常见的三个行为:ACCEPT、DROP、REJECT
限制流量的三个特征(五元组):端口、协议、IP,即--dport、--sport、-p、-d、-s
端口转发:本机端口/远程端口
注:【iptables默认是允许所有流量,所以建议增加DROP all的】

yum install iptables
systemctl status iptables

入站访问

查询指定表的规则(端口显示为数字80、22,而不是http、ssh)
iptables -t filter -nL
iptables -t nat -nL

所有入站流量全部丢弃,执行完后,ssh断开(所以最好先看完,把下面策略加上后再执行)
-A在规则后面增加一条INPUT方向的,执行动作为-j DROP丢弃
【-j中,ACCEPT对应DROP,DROP阻断流量+不响应,REJECT阻断流量+响应,所以我们就用DROP不多BB】
iptables -A INPUT -j DROP

加了全拒绝后就不能用-A追加了,因为iptables匹配到了第一条就直接执行不往下看了,所以应该用-I,先把ssh整开再说,加入规则后可以发现这条规则在全拒绝的上方,然后ssh也能正常连接就是有点慢
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

在这里插入图片描述

有了之前的基础,我们一般用-I更好,这里把OUTPUT也就是出站的响应全拒绝,执行完ssh又连不上了
iptables -I OUTPUT -j DROP

开启出站的22,ssh又能连上
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT

在这里插入图片描述

加了之后只能允许22,ping的话也ping不通,加了这两条才能ping通
iptables -I INPUT -p icmp -j ACCEPT
iptables -I OUTPUT -p icmp -j ACCEPT
删除某条记录
先查看行号
iptables -L OUTPUT --line-numbers

删掉第四行
iptables -D OUTPUT 4

在这里插入图片描述

以前所有的规则,重启服务都会清除,所以要执行命令保存
service iptables save

删除策略
iptables -F

规则会保存在
cat /etc/sysconfig/iptables

出站访问

服务器访问百度,该如何配置

在这里插入图片描述

curl不通百度
curl http://110.242.68.4/

iptables -I OUTPUT -o ens33 -p tcp -d 110.242.68.4 --dport 80 -j ACCEPT
iptables -I INPUT -i ens33 -p tcp -s 110.242.68.4 --sport 80 -j ACCEPT

加入策略后再curl就可以了
curl http://110.242.68.4/

额外用法

同时添加多个端口
iptables -I INPUT -p tcp -m multiport --dport 80,22,443,3306 -j ACCEPT
防DOOS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-brust 100 -j ACCEPT

NAT

要用到nat表了,PREROUTING是先于filter表的,所以不会被filter过滤

本机端口转发
本机的3456转发到本机的80
iptables -t nat -A PREROUTING -p tcp --dport 3456 -j REDIRECT --to-port 80
远程端口转发

开启端口转发功能

vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.conf

服务器的6543转发到百度110.242.68.4的80

iptables -t nat -nL --line #查看已有规则
iptables -t nat -D PREROUTING 2
iptables -F -t nat #删除所有规则
在174.134上执行(将174.134的8889转发到192.168.174.5的80,iptables -t filter -I FORWARD -j ACCEPT这条是重中之重)
iptables -t filter -I FORWARD -j ACCEPT
iptables -t nat -A PREROUTING -d 192.168.174.134 -p tcp --dport 8889 -j DNAT --to-destination 192.168.174.5:80
iptables -t nat -A POSTROUTING -d 192.168.174.5 -p tcp --dport 80 -j SNAT --to 192.168.174.134

或在174.5上执行
iptables -t filter -I FORWARD -j ACCEPT
iptables -t nat -A PREROUTING -d 192.168.174.5 -p tcp --dport 8889 -j DNAT --to-destination 192.168.174.134:80
iptables -t nat -A POSTROUTING -d 192.168.174.134 -p tcp --dport 80 -j SNAT --to 192.168.174.5

firewalld

基础

没有表、没有链、没有行为,默认拒绝所有,引入区域的概念
在不同的区域下,可以设置不同的防火墙策略,不需要从0开始,需要哪个区域,切换区域即可
public(默认)、dmz、external、internal、home、work这六个区域本质没啥区别,只是名字不同
所以对于我们来说就是三种区域drop、public、其他
区域说明
drop阻断流量+不响应,类似iptables的DROP
block阻断流量+响应,类似iptables的REJECT
public(默认)除非与传出流量相关,或与 ssh 或 dhcpv6-client 预定义服务匹配,否则拒绝流量传入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收经过选择的连接。并且,该区域是新添加网络接口的默认区域
dmz除非与传出的流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入
external除非与传出流量相关,或与 ssh 预定义服务匹配,否则拒绝流量传入。通过此区域转发的 IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络
internal除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client预定义服务匹配,否则拒绝流量传入,用于内部网络。
home除非与传出流量相关,或与 ssh、ipp-client、mdns、samba-client、dhcpv6-client预定义服务匹配,否则拒绝流量传入,用于家庭网络。
work除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于工作区。相信网络内的其他计算机不会危害计算机,仅接收经过选择的连接
trusted可接收所有的网络连接,全开放区域

记得关闭iptables

systemctl status firewalld
列出firewall的规则
firewall-cmd --list-all
默认区域在public,icmp-block为no,也就是说icmp禁用是no,那就是可以ping通
网卡
firewall-cmd --get-default-zone

在这里插入图片描述

在此情况下,启动一个web服务,无法访问,但是ping是允许的

选项作用
firewall-cmd --get-default-zone显示网络连接或接口的默认区域
firewall-cmd --set-default-zone=trusted设置网络连接或接口的默认区域
–get-active-zones显示已激活的所有区域
–get-zone-of_interface=显示指定接口绑定的区域
–zone= --add-interface=为指定接口绑定区域
–zone= --change-interface=为指定的区域更改绑定的网络接口
–zone= --remove-interface=为指定的区域删除绑定的网络接口
–list-all-zones显示所有区域及其规则
[–zone=] --list-all显示所有指定区域的所有规则,省略 --zone= 时表示仅对默认区域操作
选项(firewall的删除就是add改成remove)作用
[–zone=] --list-services显示指定区域内允许访问的所有服务
[–zone=] --add-service=为指定区域设置允许访问的某项服务
[–zone=] --remove-service=删除指定区域已设置的允许访问的某项服务
[–zone=] --list-ports显示指定区域内允许访问的所有端口号
[–zone=] --add-port= -/为指定区域设置允许访问的某个/某段端口号 (包括协议名)
–zone=
--remove-port=[-]/
删除指定区域已设置的允许访问的端口号 (包括协议名)
[–zone=] --list-icmp-blocks显示指定区域内拒绝访问的所有 ICMP 类型
[–zone=] --add-icmp-block=为指定区域设置拒绝访问的某项 ICMP 类型
[–zone=] --remove-icmp-block=删除指定区域已设置的拒绝访问的某项 ICMP 类型时表示对默认区域操作

操作

查看当前为public区域
firewall-cmd --get-default-zone
设置区域为trusted后,80可正常访问
firewall-cmd --set-default-zone=trusted
切换到drop区域,ping都ping不通了
firewall-cmd --set-default-zone=drop

在这里插入图片描述

切换到block区域,查看有响应
firewall-cmd --set-default-zone=block

在这里插入图片描述

切换回public区域,查看80无法访问,ping可以ping通
firewall-cmd --set-default-zone=public

开始写策略,常用的就是--add-service和--add-port两种方式
添加80端口(不像iptables,毫无出站入站的概念)
firewall-cmd --add-port=80/tcp
删除端口后,无法访问
firewall-cmd --remove-port=80/tcp

添加http服务,http默认端口为80
firewall-cmd --add-service=http
firewall-cmd --list-all

在这里插入图片描述

怎么知道有哪些端口和服务呢?
firewall-cmd --get-services
当重启firewalld后,策略消失
systemctl restart firewalld
在策略命令后面加个--permanent
并且进行重载
firewall-cmd --reload

else

慎重使用,阻断一切流量(建议drop区域加入22端口,切换到drop区域,再阻断)
firewall-cmd --panic-on
取消阻断
firewall-cmd --panic-off
临时允许http服务放行通过1分钟(单位s/m/h),到了1分钟,规则自动删除
firewall-cmd --add-service=http --timeout=1m

firewalld文件存储位置

cd /usr/lib/firewalld/

富规则(五元组)

富规则类似iptables的规则

指定IP访问,如果需要网段就写192.168.2.99/24,accept要小写,如果是禁用就写drop
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" accept'
firewall-cmd --remove-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" accept'
放行服务
firewall-cmd --add-rich-rule='rule family=ipv4 service name="http" accept'
firewall-cmd --remove-rich-rule='rule family=ipv4 service name="http" accept'
加黑名单192.168.2.99
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.99" port protocol="tcp" port="80" drop'

在firewalld写iptables规则

INPUT后面的数字1是优先级,0最高(注意源IP为虚拟机的网关:192.168.174.1)
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 192.168.174.1 -j ACCEPT
查看直接规则
firewall-cmd --direct --get-all-rules
再加个0优先级的DROP,就访问不了啦
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 80 -s 192.168.174.1 -j DROP

端口转发

8888转发到本地的80
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80

远程端口转发,先要开启端口转发
firewall-cmd --add-masquerade

在这里插入图片描述

访问192.168.174.134的6666转发到192.168.174.5的80
firewall-cmd --add-forward-port=port=6666:proto=tcp:toaddr=192.168.174.5:toport=80

Shell基础

每行皆命令

echo

输出

命令作用
echo -e “hello\nworld”输出,-e支持转义符,支持\n为换行
\n换行
\a共鸣,滴一声
\b退格
\tTAB
\r回车
\v纵向制表符
\反斜杠本身
echo -e “\08”八进制的8,也就是十进制的1,输出1
echo -e “name\tid\njack\t001\nka\t002\nrose\t003”格式化输出

环境变量

操作系统预先定义好的全局变量

命令作用
env查看所有的环境变量
echo $PATHPATH中定了文件/路径,只要在这个目录下,就能直接执行,类似windows的system32
export PATH=$PATH:/opt/lampp/把目录/opt/lampp/加入到环境变量PATH中(临时生效)
cat /etc/profile所有用户的全局变量(永久生效)
cat .bach_profile当前用户的环境变量(永久生效)
echo $PS1代表这个[root@localhost shell]#
echo $SHELL输出当前的的shell
cat /etc/shells查看linux支持的shell

变量

变量前要加$,和PHP类似
定义变量,输入后回车输入变量内容
read v1 v2

或者
注意=前后不要加空格,例如:v1 = "num1",会报v1命令不存在
v1="num1"
echo $v1

在这里插入图片描述

管道补充

命令作用
ifconfig | tee ifconfig.txt将ifconfig执行结果输出到控制台并写入到ifconfig.txt
echo “hello” > 1.txt>把hello输入到1.txt中
ifconfig 1> 1.txt1>命令执行成功了,会把内容写入到1.txt中,执行失败不写
ipconfig 2> 1.txt2>命令执行失败了,会把内容写入到1.txt中,执行成功不写
ll /opt /opopopopt 1> 1.txt 2> 2.txt执行成功输出到1.txt,执行失败输出到2.txt
ll /opt /opopopopt 1> /dev/null 2> /dev/null/dev/null一个并不存在的空间
ls /opt && ifconfig前面命令执行成功,后面命令执行
ls /opt || ifconfig前面命令执行失败,后面命令执行
ifconfig;ll多条命令
alias a=“cat /etc/passwd;ll/tmp;netstat -ant”将双引号中的命令定别名,然后直接执行命令a即可

sh文件

命令行参数

vim hello.sh
chmod +x hello.sh
#!/usr/bin/bash
# 声明使用bash

echo "请在hello.sh后面跟上参数,以空格分割"
# 输出$#也就是控制台给的参数个数
echo "$#"

echo "linux最多接受9个参数,所以第10个参数是不会输出我们的预期,第10个参数是第一个参数+0"
echo "参数1: $1"
echo "参数2: $2"
echo "......"
echo "参数9: $9"
echo "参数10: $10"

文件查找demo

vim file_find.sh
chmod +x file_find.sh
#!/usr/bin/bash
# 声明使用bash

# 通过参数决定对文件的查找,并输出响应行数和行号,只接受一个参数

#把第一个参数传给filename变量,注意等号前后不要留空格
filename=$1
grep -n root $filename

引号和$

补充

用于判断上一条命令是否执行成功,成功返回0
ifconfig
$?
ipconfig
$?

脚本的名称
$0

输出命令行参数,把整个参数当成一个字符串
$*
输出命令行参数,把整个参数都当成一个字符串
$@

在这里插入图片描述

vim quota.sh
chmod +x quota.sh
# 在shell中,有3个引号,单引号',双引号",反引号`
# 双引号中的变量会被解析
echo -e "环境变量的路径为: $PATH\n"
# 单引号中的变量不会被解析,就是字符串常量
echo -e '环境变量的路径为: $PATH\n'
# 单引号中的变量不会被解析,就是字符串常量
echo -e 'ifconfig\n'
# 反引号里面的内容会被当成命令执行
echo -e `ifconfig`
echo -e "\n"
hn=`hostname`
echo $hn
echo -e "\n"
echo "脚本的名称 $0"
echo '$*的结果(要加参数)'
echo -e "$*\n"
echo '$@的结果(要加参数)'
echo -e "$@\n"

expr

整数计算
expr 1 + 3
expr 10 / 5

判断字符串相等,成功1,失败0,和$?相反了
expr "1" = "2"

test

命令(test的结果在$?中)作用
test -e /etc/passwd判断文件是否存在,存在的话$?就是0
[ -e /etc/passwd ]同上([]也是命令~~)
-d是否为目录
-e文件是否存在
-f普通文件
-r是否可读
-w是否可写
-x是否可执行
-s长度是否为零
[ -e /etc/passwd -a -r /etc/passwd ]逻辑运算a为and,/etc/passwd存在且可读
[ -e /etc/passwd -o -r /etc/passwd ]逻辑运算o为or,/etc/passwd存在或可读
[ ! -e /etc/passwd ]!去反
[ “$USER” = “root” ]当前用户是否是root
[ -z $USER ]是否为空
[ -n $USER ]是否为非空
[ 1 -eq 123]数值是否相等
-ne不相等
-le小于等于
-ge大于等于
-gt小于
-lt大于

if分支

vim branch.sh
chmod +x branch.sh
# 判断文件是否存在
if [ -e ${1} ];
then
    echo "${1}存在"
    echo "我还在这个if中"
fi

# 先执行test,在判断test命令的执行结果$?,和上面的功能一模一样
test -e ${1}
if [ $? -eq 0 ];
then
    echo "${1}存在"
    echo "我还在这个if中"

fi

if test -e ${1};
then
    echo "${1}存在"
    echo "我还在这个if中"
else
    echo "${1}不存在"
fi

完善【文件查找demo】

vim file_find.sh
#!/usr/bin/bash
# 声明使用bash

# 通过参数决定对文件的查找,并输出响应行数和行号,只接受一个参数
# 如果参数输出错误,给与提示
# 如果给的文件名不存在,给与提示

if [ $# -ne 1 ]; then
    echo "please input one param"
# exit 定义变量$?的值
    exit 100
elif [ ! -e $1 ]; then
    echo "$1不存在"
else
    grep -n root $1
fi

# 以上程序可以合并成
if [ $# -eq 1 -a -e $1 ]; then
    grep -n root $1
else
    echo "$1不存在或参数错误"
fi

用户输入没有检测,玩把命令注入

./file_find.sh /etc/passwd; ifconfig  > 1.txt

在这里插入图片描述

case分支

和if基本一样,相互代替

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
Num=$1
echo $Num
case $Num in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

for循环

vim for.sh
chmod +x for.sh
# 从1加到10

sum=0
for i in 1 2 3 4 5 6 7 8 9 10; do
# 以下方式都可以表示累加,也是运算常用的方式
    #sum=`expr $sum + $i`
    #let sum=sum+i
    #let sum+=i
    ((sum+=i))
done
echo "结果为$sum"

# 1加到100呢
sum=0
for i in {1..100}; do
    ((sum+=a))
done

echo $sum

while循环

vim while.sh
chmod +x while.sh
i=1
sum=0
while [ $i -le 10 ]; do
    let sum+=$i
    let i++
done

echo $sum

按行读取文件

vim read_file.sh
chmod +x read_file.sh
line=0
while read ID NAME
do
    line=`expr $line + 1`
    if [ $line -eq 1 ]
    then
        continue
    fi

    echo "----`expr $line - 1`----"
    echo "$ID"
    echo "$NAME"
done < $1
vim inf.txt
ID     NAME
01     ka
02     jack
./read_file.sh inf.txt

在这里插入图片描述

函数

vim function.sh
chmod +x function.sh
function add() {
    let sum=$1+$2
# 这里的echo代表输出,区别return
    echo $sum
}

#调用add函数,将echo的输出赋值给result
result=`add 100 200`

echo "结果为: $result"

计算任意数的阶乘

数组

vim array.sh
chmod +x array.sh
# 定义数组
declare -a num
# 给数组赋值
num[1]=1
num[2]=2
num[3]=4
num[4]=3

# 输出整个数组
echo ${num[@]}

for i in ${num[@]}; do
    echo $i
done

# 下标输出数组
echo ${num[3]}
echo ${num[0]}

num[10]=10
echo ${num[@]}

num[5]=5
num[6]=6
# 数组长度
echo ${#num[@]}
let len=${#num[@]}-1

for ((i=0; i<=$len; i++)); do
    echo ${num[$i]}
done

# 另一种定义数组的方式
num1=(9 8 7 6 5 4 3 2 1)

for a in ${num1[@]}; do
    echo $a
done

括号

双圆括号,用于运算,可以代替expr,也可以用于for循环
(())

可以去特定参数或变量的值,例如${1},${PATH}
${}

代替反引号执行圆括号中命令
$()

整数运算,例如echo $[ 1 + 2 ],可以代替expr
$[]
vim brackets.sh
chmod +x brackets.sh
sum=0
# 不写步长的话,默认是1
#for i in {1..100..1}; do
for ((i=1; i<=100; i++)); do
    let sum+=i
done
echo $sum

vim粘贴导致多行出现#号

命令模式先执行

:set paste

定时任务

sleep

vim time.sh
chmod +x time.sh
#for i in {1..10}; do
while [ 1 -eq 1 ]; do
    date "+%Y-%m-%d %H:%M:%S" >> ./date.txt
     "+%Y-%m-%d %H:%M:%S"
# usleep 1停止1纳秒
    sleep 1
done

crontab(周期)

命令作用
crontab -l查看定时任务列表
crontab -e编辑定时任务列表
systemctl status crondcrond服务
*/1 * * * * /opt/learn/crontab.sh每分钟执行一次/opt/learn/crontab.sh
20 */1 * * * /opt/learn/crontab.sh每小时的第20分钟执行一次/opt/learn/crontab.sh(8:20、9:20)
20-30 5-8 * * 1 /opt/learn/crontab.sh每周一的5点到8点的20-30分执行
cat /var/log/cron日志
分钟小时日期月份星期命令
*****1.sh
取值为 0~59 的任意整数取值为 0~23 的任意整数取值为 1~31 的任意整数(日期在该月份中必须有效)取值为 1~12 的任意整数取值为 0~7 的任意整数,0 或 7 代表星期日可以是普通的命令,也可以是自己编写的程序脚本
减号-:表示一个连续的时间范围,如"1-4"表示1、2、3、4
逗号,:表示一个间隔的不连续范围,如"1,3,6,9,10"
斜杠/:指定间隔频率,如在日期字段中的"/3"表示每3天
每分钟执行一次 /opt/learn/crontab.sh

vim  /opt/learn/crontab.sh
chmod +x  /opt/learn/crontab.sh

date "+%Y-%m-%d %H:%M:%S" >> /opt/learn/crondate.txt

crontab -e
*/1 * * * *  /opt/learn/crontab.sh

at(单次)

at后面加个特定的时间,然后写需要执行的命令或脚本
yum install at
systemctl status atd
at 12:00
date >> /tmp/1.txt

按ctrl+D结束

查看单次执行的列表
atq

删除id为1的
atrm 1

后台

输出到nohup.out
nohup 1.sh &

time

统计命令执行的时长
time ping -c 5 www.baidu.com

在这里插入图片描述

站点监控

判断网站是否正常
http://192.168.174.134:82/login.html

监控依据:以简单的服务没开和防火墙是否放行为例
1.服务是否正常启动,判断进程/端口
curl http://192.168.174.134:82/login.html
或者用
netstat -ant | grep :82
或者用
ps -ef | grep 
2.防火墙是否放行,判断防火墙策略
firewall-cmd --list-port | grep 82
firewall-cmd --add-port 82/tcp
vim monitor.sh
chmod +x monitor.sh
curl http://192.168.174.134:82/login.html > /dev/null
if [ $? -ne 0 ]; then
    /opt/lampp/lampp start
    echo "lampp未启动,已经启动 - "`date "+%Y-%m-%d %H:%M:%S"` >> ./monitor.log
fi

firewall-cmd --list-port | grep 82
if [ $? -ne 0 ]; then
    firewall-cmd --add-port 82/tcp > /dev/null
    echo "防火墙未放行,已经放行 - "`date "+%Y-%m-%d %H:%M:%S"` >> ./monitor.log
fi

字符串处理

已知变量
url=http://123.123.com/1.html
*//从左边开始删除第一个 // 左边的所有字符,也就是123.123.com/1.html
echo ${url#*//}

##*/从左边开始删除最后(最右边)一个 / 前所有,也就是1.html
echo ${url##*/}

%/*从右边开始删除第一个 / 后所有,也就是http://123.123.com
echo ${url%/*}

%%/*从右边开始删除第一个 / 后所有,也就是http:
echo ${url%%/*}
已知变量
phone="13839404142"

echo ${phone:0:5}
echo ${phone:5}

倒数第7位往后2位

echo ${phone:0-7:2}

字符串长度
echo ${#phone}

awk

类似split

awk默认会用空格对字符串进行分割,$0是整个,$1就是第一列,$2就是第二列

输出hello
echo "hello world" | awk '{print $1}'
world
echo "hello world" | awk '{print $2}'

awk的表格思维(下面就是两行两列)
echo -e "hello world\n1 2" | awk '{print $0}'
-F使用.来分割
echo "http://123.123.com/1.html" | awk -F '.' '{print $0}'

多个分割符,正则
echo "http://123.123.com/1.html" | awk -F '[./]' '{print $0}'
查找/etc/passwd文件内容,以:分割,找到第1列包含root的输出这1列
awk -F ':' '$0~/root/ {print $1}' /etc/passwd

查找/etc/passwd文件内容,以:分割,找到整行包含root的输出这1列
awk -F ':' '$0~/root/ {print $1}' /etc/passwd

域名解析

[root@localhost shell]# ping www.baidu.com -c 1
PING www.a.shifen.com (110.242.68.4) 56(84) bytes of data.
64 bytes from 110.242.68.4 (110.242.68.4): icmp_seq=1 ttl=128 time=19.9 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 19.975/19.975/19.975/0.000 ms
找到第一行,先用grep找到以PING开头的第一行,把第一行按照()进行分列,取第2列即可
ping www.baidu.com -c 1 | grep ^PING | awk -F '[()]' '{print $2}'
或者找到第二行直接取第4列(awk默认以空格分割)
ping www.baidu.com -c 1 | grep icmp_seq | awk '{print $4}'

正则
ping www.baidu.com -c 1 | awk '$4~/^[0-9]*\.[0-9]*\./ {print $4}'

结合head
ping www.baidu.com -c 1 | head -n 2 | tail -n 1 | awk '{print $4}'

统计

查找/etc/passwd不包含root的有多少行
awk -F ':' 'BEGIN {sum=0} $0!~/root/ {sum+=1} END {print sum}' /etc/passwd
等价于
grep -v root /etc/passwd | wc -l

如果第一列是root就打印第一列,否则就打印第三列
awk -F ':' '{if ($1=="root") print $1; else print $3}' /etc/passwd

打印整行不包含bash或者root
awk -F ':' '$0!~/(bash|root)/' /etc/passwd

查看yes进程cpu的使用率(第十列)
top -n 1 | awk '$0~/yes/ {print $10}'
top -n 1 | grep yes

sed

-e 指定脚本,多点编辑(多条执行)
-n 显示处理后的结果
-i 永久将编辑保存到指定文件中,如果不加只是屏幕上输出过过瘾,所以对文件的修改一般都会加
取前十行进行测试
head /etc/passwd > /tmp/test.txt

在屏幕输出的第5行后面插入hello
sed '5a hello' /tmp/test.txt

在文件第5行后面插入hello,修改文件的
sed -i '5a hello' /tmp/test.txt
删除第6行,也就是刚刚添加的那行
sed -i '6d' /tmp/test.txt

第5行前面插入11111111
sed -i "5i 11111111" test.txt
第5行替换成xxxxxxxx
sed -i "5c xxxxxxxx" test.txt
把3-5行这三行替换成xxxxxxxx这一行
sed -i "3,5c xxxxxxxx" test.txt

打印包含root的
sed -n '/root/p' test.txt

找到并且删除
sed -i '/root/d' test.txt

s代表搜索,g代表只要是root都替换(不加g只替换第一个),找到root后全部替换成XXXXXXXXXXXXX
sed -i 's/root/XXXXXXXXXXXXX/g' test.txt

-e把多条联合,把root换成ROOT,第4行后面加XXXXXXXXXXXXX,第6行删掉
sed -e 's/root/ROOT/' -e '4a XXXXXXXXXXXXX' -e '6d' test.txt

性能监控

vim cpu_monitor.sh
chmod +x cpu_monitor.sh
CPU
cpu=$(top -n 1 | grep "^%Cpu" | awk '{print int($8)}')

内存
top -n 1 | grep "^KiB Mem" | awk '{print $6}'

进程按CPU排序,取前6行
ps aux | sort -k 3 -r | head -n 6

磁盘
df -h | grep "^/dev/mapper/"

网络
ip -s link
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
TERM=xterm
cpu=$(/usr/bin/top -n 1 | grep ^%Cpu | awk '{print int($8)}')
if [ $cpu -lt 80 ]; then
    pcpu=$(ps aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $3}')
    ppcpu=$(echo $pcpu / 4 | bc)
    pid=$(ps aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $2}')
    #echo "CPU is lower, $pid consume $ppcpu%"
    echo "CPU is lower, $pid consume $ppcpu%" | mail -s "CPU Low Alert" root
    kill -9 $pid
else
    echo "CPU is OK"
fi
linux邮件服务
yum install mailx
systemctl start postfix

发送邮件
echo "content" | mail -s "hello"  root
或者
mail -s "hello"  root < /etc/passwd

查看邮件
cat /var/spool/mail/root

文件完整性监控

获取对应文件的md5
md5sum 1.py
mkdir baselearn
mkdir file

获取文件md5
find ./file -type f | xargs md5sum > ./baselearn/file.base

检查是否被修改,随便修改一个就会报警告
md5sum -c ./baselearn/file.base
将对比失败的文件保存起来
md5sum -c ./baselearn/file.base --quiet > file_modified.log

比较文件内容的不同,d删除,a新增,c是修改
diff ./file/1.txt ./1.txt

如果有新文件的话,无法检测出来,因为基线在那放着呢
touch ./file/2.txt

这时候需要比较两个目录了
diff ../shell ./file/

查看哪个文件改了
diff ../shell ./file/ | grep ^diff | awk '{print $2}'

过滤改变(新建/删除)的文件
diff ../shell ./file/ | grep "^[只|Only]" | sed -e "s/[只在]//g" -e "s/[存:]//g"
vim file_monitor.sh
chmod +x file_monitor.sh
# 通过参数传递监控的目标目录和基线备份目录
target=$1
base=$2
action=$3

# 判断两个参数是否是有效的目录,-d为判断是否没目录。-o是或运算
if [ ! -d $target -o ! -d $base ]; then
    echo "参数一和参数二不是有效的目录."
    exit 1
fi

# 如果第三个参数设置为new,则基线备份目录进行预处理
if [ $action = "new" ]; then
    mkdir $base/files
    cp -r $target/* $base/files/
    find $target -type f | xargs md5sum > $base/learn.md5
fi

# 正式开始之前先清空日志文件
echo > $base/result.log

# 通过对比基线MD5数据来确定文件是否在删除的情况
md5sum -c --quiet $base/learn.md5  1> $base/learn.diff 2> /dev/null
remove=$(cat $base/learn.diff | grep "FAILED open or read" | sed 's/: FAILED open or read//g')
if [ ${#remove} -gt 0 ]; then
    echo -e "******** $target 目录有文件被删除: ********\n$remove\n" | tee -a $base/result.log
fi

# 通过文件对比结果来确定哪些文件被修改了
change=$(cat $base/learn.diff | grep "FAILED$" | sed 's/: FAILED//g')
if [ ${#change} -gt 0 ]; then 
    echo -e "******** $target 目录中有文件被修改:********\n$change\n" | tee -a $base/result.log
fi

# 列出文件变化情况
list=$(diff $target  $base/files | grep ^Only | sed -e 's/Only in //g' -e 's/\/: /\//g' -e 's/: /\//g' -e 's/\/\//\//g')
if [ ${#list} -gt 0 ]; then
    echo -e "******** 两个目录中有文件的数量的变化:********\n$list" | tee -a $base/result.log
fi

# 将运行过程的结果数据发送到指定邮箱
# mail -s "关键文件监控警报" ***@qq.com < $base/result.log

防火墙安全应急

特征:日志,登录成功与失败
/var/log/secure
登录失败日志特征
Mar  3 11:37:27 localhost unix_chkpwd[3561]: password check failed for user (root)
Mar  3 11:37:27 localhost sshd[3505]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.174.134  user=root
Mar  3 11:37:27 localhost sshd[3505]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar  3 11:37:30 localhost sshd[3505]: Failed password for root from 192.168.174.134 port 46592 ssh2

登录成功日志特征
Mar  3 11:35:25 localhost sshd[3163]: Accepted password for root from 192.168.174.134 port 46590 ssh2

断开连接日志特征
Mar  3 11:36:06 localhost sshd[3311]: pam_unix(sshd:session): session closed for user root
Mar  3 11:36:07 localhost sshd[3315]: pam_unix(sshd:session): session closed for user root
Mar  3 11:36:12 localhost sshd[3163]: Received disconnect from 192.168.174.134 port 46590:11: disconnected by user
Mar  3 11:36:12 localhost sshd[3163]: Disconnected from 192.168.174.134 port 46590
Mar  3 11:36:12 localhost sshd[3163]: pam_unix(sshd:session): session closed for user root

尝试连接日志特征
Mar  3 11:38:14 localhost sshd[3618]: Address 192.168.174.134 maps to localhost.localdomain, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
# 查找/var/log/secure中登录失败的次数 wc -l也就是行数
failcount=$(grep "Failed password" /var/log/secure | wc -l)
if [ $failcount -gt 3 ]; then
    # 先启动防火墙
    systemctl start firewalld
	# 查到所有的失败,把11列IP去重
    ip=$(grep "Failed password" /var/log/secure | awk '{print $11}' | uniq)
    firewall-cmd --add-rich-rule="rule family=ipv4 source address=$ip drop"
    echo "登录失败次数超过3次,防火墙已经阻止该IP地址:$ip"
    
    # 使用pkill强制中止该IP地址的SSH连接
    # who有哪些登录进来
    terminal=$(who | grep $ip | awk '{print $2}' | head -n 1)
    pkill -kill -t $terminal
    # 如果同时找出了多条终端,如何将它们全部中止?

    # 将已经封锁的IP地址对应的Failed password日志,Failed password替换成Failed-password
    sed -i 's/Failed password/Failed-password/g' /var/log/secure

fi
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值