操作系统介绍
操作系统作用
一、五大基本功能
- 进程和线程的管理:进程线程的状态、控制、同步互斥、通信调度等
- 存储管理:分配/回收、地址转化、存储保护等
- 文件管理:文件目录、文件操作、磁盘空间、文件存取控制
- 设备管理:设备驱动、分配回收、缓冲技术等
- 用户接口:系统命令、编程接口
二、三个作用
- 资源的管理者
- 向用户提供各种服务
- 对硬件机器的扩展
三、操作系统应用场景
- 嵌入式设备:POS机、单反相机、游戏机、智能设备等
- 移动端设备:手机、平板电脑等
- 个人桌面电脑:游戏本等
- 服务器:云服务器、小型机、PC服务器等
- 超级计算机
发展史
一、Unix
- IBM:AIX
- HP:HP-UX
- SUn:Solaris
- FreeBSD
二、Linux
- RedHat ---- CentOS
- Debian ---- Ubuntu ---- Kali
- 中科红旗
- …
安装Linux系统
自定义分区
- /home:文件系统时xfs,时Linux最新版本内核的默认文件系统,用于保存用户数据
- /boot:用于启动时加载的数据
- /:根目录,用于创建任何目录,或者挂在各个分区
- swap:交换分区,文件系统时swap,通常默认情况下和内存大小一致,用于内存和硬件之间交换数据(虚拟内存)早期计算机操作系统中,内存特别小,所以借助硬盘来临时存储内存中暂时不用的数据(显著降低程序运行性能)
远程连接Linux
SSH协议
1、基于口令安全验证
知道账号、密码就可以登录远程主机。所有传输的数据都会被加密,但是不能保证所连接的服务器就是目标服务器。存在中间人攻击的问题。
2、基于密钥安全验证
必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上。如果要连接SSH服务器,客户端软件会向服务器发送请求,请求用你的密钥进行安全验证;服务器收到请求后,先在服务器上主目录下寻找公用密钥,然后把它和发送来的公用密钥对比,一致的话服务器就用公用密钥加密“质询”,并把它发送给客户端软件,客户端收到后使用私钥进行解密再发给服务器。
更加的安全
一、堡塔
二、Xshell
三、cmd命令行
1、ssh
C:\Users\26737>ssh -l duyun 192.168.40.135
duyun@192.168.40.135's password:
Last login: Sat Jul 16 23:35:40 2022 from 192.168.40.1
[duyun@duyun ~]$
C:\Users\26737>ssh duyun@192.168.40.135
duyun@192.168.40.135's password:
Last login: Sat Jul 16 23:22:05 2022 from 192.168.40.1
[duyun@duyun ~]$
首次连接的话要输入 yes
2、scp
传文件
C:\Users\26737>scp D:\test.html root@192.168.40.135:/opt # Windows传给Linux
C:\Users\26737>scp root@192.168.40.135:/opt/test.html E:\ # Linux传给Windows
Linux文件系统
文件系统解读
在Linux下运行df -h命令,可以查看目前Linux中存在硬盘分区的情况
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 970M 0 970M 0% /dev
tmpfs 982M 0 982M 0% /dev/shm
tmpfs 982M 9.6M 973M 1% /run
tmpfs 982M 0 982M 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 1.3G 49G 3% /
/dev/sda1 1014M 151M 864M 15% /boot
/dev/mapper/centos-home 47G 33M 47G 1% /home
tmpfs 197M 0 197M 0% /run/user/0
tmpfs:临时的文件系统 dev:永久存储数据
- /dev:包含所有Linux系统中使用的外部设备
- /dev/shm:大小大概是内存的一半。该目录是驻留在内存中,所以对于在系统中需要使用临时数据,可以存储到该目录下,相当于我们直接在使用内存读写文件,速度相当快。内存里面数据断电丢失
- /run:存放与用户或者进程有关的数据,内核级文件
- /sys/fs/cgroup:运行过程中CPU、内存等数据,内核级文件
- /:根目录。
- /boot:启动的时候的引导文件
- /home:用户数据
- /run/user/0:ID为0的用户在运行过程中产生的数据
Linux文件系统特点总结:
Linux根目录说明
命令示例 | 作用 |
---|---|
/ | 跟目录,绝对路径 |
./ | 当前目录,相对路径 |
…/ | 上一级目录,相对路径 |
/root | root用户的主目录 |
/home/username | 存放普通用户的个人配置文件 |
/bin | 存在Linux常用命令 |
/boot | 存放系统启动时要用到的文件 |
/dev | 存放Linux系统使用的外部设备 |
/etc | 存在系统管理时用到的配置文件和子目录 |
/usr/sbin | 存放管理员的系统管理程序 |
/lib | 存放系统动态链接共享库,后缀名.so类似Windows 的.dll |
/lost+found | 系统运行异常产生错误,会将遗失的片段放在这里 |
/mnt | 可临时将别的外部设备挂接在次目录下 |
/proc | 存放系统的基本信息 |
/usr | 用户的应用程序和文件都存放在这个目录 |
/tmp | 存放临时文件的目录 |
/opt | optional,可选目录,默认为空,用户使用 |
通常情况下,/opt和/home由用户自由处理,不存在敏感信息。默认情况下程序安装在usr/bin 或 /var/
常见命令
top
类似Windows的taskmgr 任务管理器 查看cpu 内存 进程等信息
输入会进入全屏模式,需要 Q 或者 CTRL + C 退出
其他命令
启动级别
使用 init num 可以切换级别
Linux关机和重启
文本编辑器VI
文本创建和查看
文件创建
cat > test.txt << EOF # 输入作为test.txt的内容,想要结束输入则输入EOF回车;如果不输入 << EOF 输入结束按CTRL+D
vi /opt/hello.txt # 在目录opt/创建文件hello.txt并进入vi编译器界面
touch /opt/learn/test # 在目录 /opt/learn 创建空白文件test
文件查看
常用的:cat head tail strings
vi /etc/passwd # vi文本编辑器查看
cat /etc/passwd # 屏幕输出文本内容
more /etc/passwd # 分屏显示文本
less /etc/passwd # 分屏显示文本(适合大文件) 按需加载
head -n 10 /etc/passwd # 输出文件前十行
tail -n 10 /etc/passwd # 输出文件后十行
tail -f /etc/passwd # 通过流的方式实时查看最新的文件内容
strings /bin/ls # 查看二进制文件中可打印字符
文本内容编辑
vi编辑器有两种处理模式:命令模式 和 编辑模式
命令 | 作用 |
---|---|
vi filename | 打开或者创建文件,有则打开无则新建 |
i或者a | 从命令模式进入编辑模式,i为插入文本,a为追加文本 |
esc | 从编辑模式进入命令模式 |
:w | 保存文本 |
:wq | 保存并退出 |
:wq! | 保存并强制退出 |
:q | 退出 |
:q! | 强制退出 |
o | 光标之后添加一行 |
O | 光标上方添加一行 |
dd | 删除一行 |
D | 删除当前光标到行尾的内容 |
x | 删除一个字符 |
s | 删除一个字符并进入编辑模式 |
S | 删除一行并进入编辑模式 |
:n | 光标移动到第n行 |
$ | 光标移动到行尾 |
A | 光标移动到行尾并进入编辑模式 |
^ | 光标移动到行首 |
G | 光标移动到末尾 |
gg | 光标移动到首行 |
ZZ | 存盘退出 |
/字符串 | 查找某个字符串 |
n | 继续查找 |
:u | 撤销(ctrl+z) |
:redo |
实验:修改IP地址
查看网关 确认网段
ip route ip addr
root@localhost opt]# ip route
default via 192.168.40.2 dev ens33 proto dhcp metric 100
192.168.40.0/24 dev ens33 proto kernel scope link src 192.168.40.135 metric 100
[root@localhost opt]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e0:c7:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.40.135/24 brd 192.168.40.255 scope global noprefixroute dynamic ens33
valid_lft 1226sec preferred_lft 1226sec
inet6 fe80::840d:6123:6112:43a9/64 scope link noprefixroute
valid_lft forever preferred_lft forever
修改ip地址
[root@localhost opt]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
然后修改参数
文件和文件夹操作
功能 | 命令或格式 | 作用 |
---|---|---|
ls / tree | ls[option] [file] | 显示指定目录下所有的文件、文件夹 Windows下的dir |
ls | 显示当前目录内容 | |
ls -l / ll | 显示当前目录详细信息 | |
ls -a | 显示当前目录下所有文件、包括隐藏文件 | |
ls *.txt | 显示当前目录下所有以.txt为后缀名的文件 | |
ls -R /opt/ | 列出所有/opt目录以及其子目录的内容 | |
tree /opt | 用树状结构显示目录 | |
pwd | pwd | 显示当前所在目录 |
cd | cd directory | 切换到指定目录 |
cd | 切换到当前用户所有的主目录 | |
cd … | 回退到当前目录的上一级目录 | |
cd /opt/test | 用绝对路径切换到/opt/test目录下 | |
cd …/…/ | 用相对路径切换到当前目录的上上级目录 | |
cd . | 切换到当前用户,啥也没干 | |
mkdir | mkdir[option] [dir1] [dir2] | 创建目录 |
mkdir /opt/dir1 | 在/opt/下常见目录 | |
mkdir dir1 dir2 … | 同时创建dir1、dir2、。。。 | |
mkdir -p /opt/folder/test | 按层次创建目录,创建了/folder/test两个 | |
rmdir | rmdir dir1 | 删除一个空目录 |
其他操作 | cp -r /opt/learn /opt/learn1 | 拷贝文件夹 |
mv /opt/learn1 /opt/learn2 | 重命名文件夹 | |
mv dir1 dir2 | 移动文件夹 | |
rm -rf /opt/learn | 强制删除文件夹(及其子目录) | |
rm -rf / | 逝世就逝世 | |
rm -r dir1/dir2 | 删除文件夹 要进行询问 | |
xx -h xx – help man xx | 查看帮助 |
权限
Linux。root拥有最高权限,所有文件或者文件夹的权限设定对root无效。正式生产环境尽量使用普通用户
SSH可以禁止root用户登录
用户和用户组权限
功能项 | 命令示例 | 作用 |
---|---|---|
用户组 | cat /ect/group | 查看当前系统存在的用户组 |
groupadd duyun | ||
groupmod -n ying duyun | 将duyun重命名为ying | |
groupdel duyun | 删除组duyun | |
groups root | 查看用户root所在的所有的组 | |
增加用户 | cat /ect/passwd | 查看用户信息 |
useradd d | 新增一个名为d的用户,默认新增一个对应名为d的组 | |
useradd -g duyun d | 新增一个用户d,其归属于组duyun | |
useradd -g duyun -G ying d | 新增一个用户d,其主组为duyun,附组为ying | |
修改用户 | usermod -g dev name | 将用户name换到组dev中 |
usermod -G 502 name | 将用户name附加到gid为520的组 | |
usermod -d /home/temp/du | 将du的主目录 /home/du 改为 /home/temp/du | |
删除用户 | userdel name | 删除用户 |
userdel -f name | 强制删除用户(即使用户已经登录) | |
userdel -r name | 删除用户以及主目录 | |
查看用户密码 | cat /etc/shadow | 查看所有用户的密码 ---- 加密的 |
任何用户对于shadow都没有权限 | 只有root可以看 |
文件和文件夹权限
任意文件或文件夹使用ll命令都可以显示其基本信息和权限信息
drwxr-xr-x. 2 root root 6 7月 28 21:26 f
-rw-r--r--. 1 root root 15 7月 28 19:42 test
- 第一栏是10个字符,分为4个部分
- 第1个字母: - 代表普通文件,d 代表目录,l 代表软链接
- 第2、3、4:代表当前文件或文件夹所属用户的权限 user
- 第5、6、7:代表当前文件或文件夹所属的用户组的权限 group
- 第8、9、10:代表当前文件或文件夹对于其他用户或用户组权限 other
权限的表示方式
- r 读:也可使用数组 4
- w 写:也可使用数组 2
- x 执行:也可使用数组 1
功能项 | 命令示例 | 作用 |
---|---|---|
chmod | chmod[权限] [文件或目录] | 更改文件或目录权限 |
chmod u+x hello.txt | hello.txt文件的所有者添加可执行权限 | |
chmod u-w hello.txt | hello.txt文件的所有者删除写入的权限 | |
chmod g-r hello.txt | hello.txt文件所在组去除可读权限 | |
chmod o+w hello.txt | hello.txt文件所在组的其他组增加写入权限 | |
chmod a+w hello.txt | 为三种角色添加写入权限 | |
chmod a+wx hello.txt | 为三种角色添加可写入可执行权限 | |
chmod a+rwx hello.txt | 为三种角色添加所有权限(此时仅root可编辑) | |
chmod 777 hello.txt | 将hello.txt的权限设置为rwxrwxrwx r:4,w:2,x:1 | |
chmod 643 hello.txt | 将hello.txt的权限设置为rw-r—wx | |
chmod 777 /opt/test | 将目录/opt/test的权限更改为777 | |
chmod -R 755 /opt/test | 将目录/opt/test所有的文件以及子目录的权限更改为777 | |
chown | chown[权限] [文件或目录] | 更改文件或目录的所有者 |
chown ying hello.txt | 将hello.txt的所有者改为ying | |
chown ying /opt/test | 将目录/opt/test的所有者改为ying | |
chown -R ying /opt/test | 将目录/opt/test所有的文件以及子目录的所有者改为ying | |
chgrp | chgrp[权限] [文件或目录] | 更改文件或目录的组 |
chgrp ying hello.txt | 将hello.txt的组改为ying | |
chown ying /opt/test | 将目录/opt/test的组改为ying | |
chown -R ying /opt/test | 将目录/opt/test所有的文件以及子目录的组改为ying | |
passwd | passwd [用户] | 修改用户密码 |
passwd ying | 修改ying用户的密码 |
文件查看与归档压缩
文件查找
功能项 | 命令示例 | 作用 |
---|---|---|
find | find 起始目录 查看目录 查找条件 | 查找起始目录及所有子目录下的文件和文件夹 |
find . -name “hello.txt” | 查找当前目录下hello.txt的文件或者文件夹 | |
find . -name “hello*” | 查找当前目录下以hello开头的文件或者文件夹 | |
find . etc -name “*hello” | 查找 /etc目录下以hello结尾的文件或者文件夹 | |
find . -name “*” | 查找 当前目录下所有文件和文件夹(ls-R) | |
find . -name “[h]*” | 查找当前目录下以h开头的文件或者文件夹 | |
find . -name “[h|f]*” | 查找当前目录下以f或h开头的文件或者文件夹 | |
find . -name “[a-Z]*” | 查找当前目录下以小写 大写字母开头的文件或者文件夹 | |
find . -name “[0-9a-zA-Z]*” | 查找当前目录下以字母数字开头的文件或者文件夹 | |
find . -name “hel?o*” | 查找当前目录下所有以hel后面带一个字符再加o开头的文件或文件夹 | |
find . -name “[^ a-z]*” | 查找当前目录下不以a-z开头的文件或者文件夹 | |
find . -name ‘\\*’ | 查找当前目录下所有以特殊符号\开头的文件(注意单引号) | |
find . -perm 777 | 查找当前目录权限为777的文件或文件夹 | |
find .-path ‘./test’ -prune -o -name “hello*” | 查找当前目录下除去test目录的其他目录以hello开头的文件或者文件夹 | |
find .-user du | 查找当前目录下所有者为du的文件或文件夹 | |
find .-group dev | 查找当前目录下组为dev的文件或文件夹 | |
find.-mtime -3 | 查找当前目录下三天内更新过的文件或文件夹 | |
find.-mtime +3 | 查找当前目录下三天前更新过的文件或文件夹 | |
find .-newer hello.txt | 查找当前目录下比hello.txt新的文件或文件夹 | |
find .!-newer hello.txt | 查找当前目录下比hello.txt旧的文件或文件夹 | |
find .-type d | 查找当前目录下所有的文件夹 Linux文件类型: f:普通文件,如文本文件;d:目录;l:软链接文件; c:字符设备,如终端;b:块设备,如光盘、硬盘 | |
find .-size 208c | 文件大小等于208字节 | |
find .-size +208c | 文件大小大于208字节 | |
find .-name ‘hello*’ -exec ls-l {}; | 查找当前目录下以hello开头的文件或者文件夹,并使用ls -l展示细节 | |
find .-name ‘hello’ | xargs ls -l | 查找当前目录下以hello开头的文件或者文件夹,并使用ls -l展示细节 |
内容查找
功能项 | 命令示例 | 作用 |
---|---|---|
grep | grep[选项] 匹配模式 目标文件 | 基于行对目标文件的内容进行查找 |
grep root /etc/passwd | 查找包含root的行 | |
grep -n root /etc/passwd | 查找包含root的行,并输出行号 | |
grep -n ^root’/etc/passwd | 查找以root为首的行 | |
grep -n root$ /etc/passwd | 查找以root为尾的行 | |
grep -n 1'/etc/passwd | 查找以a|b为首的行 | |
grep -v 内容 | 排除包含内容的行 | |
ls | grep test | 从ls的输出中过滤出包含test的文件名 | |
grep -r games /etc | 从/etc目录下查找所有包含games的文件 | |
grep “^s.*login$” ./passwd | s开头,login结尾 | |
find和gerp的结合 | find ./ -name “*” | xargs gerp word | 查找返回的文件内部包含word的文件 |
find ./ -name “*” | gerp word | 区别:这个是查找返回的文件名包含word的文件 | |
wc | wc -l | 拥挤文件行数或输出个数 -c显示字节数 -l显示行数 -w显示字数 不值当参数,统计所有信息 |
文件归档压缩
归档:把文件放在一起,但是并不压缩
功能项 | 命令示例 | 作用 |
---|---|---|
tar / gzip | tar -cvf hello.tar hello.txt | 将hello.txt归档并命名为hello.tar c代表创建 v代表输出日志信息 f代表指定文件 |
tar -cvf test.tar /opt/test | 将目录/opt/test归档并命名为hello.tar | |
tar -tf test.tar | 将归档文件test.tar中的文件显示出来 | |
tar -xvf test.tat | 提取归档文件中的内容 | |
gzip hello.tar | 将归档文件hello.tar压缩为hello.tar.gz | |
gzip -d hello.tar.gz | 解压缩文件成hello.tar | |
tar -zcvf hello.tar.gz hello.txt | 将hello.txt归档并压缩为hello.tar.gz | |
tar -zxvf hello.tar.gz | 解压缩 | |
zip / unzip | zip hello.zip hello.txt | 压缩 |
zip -r test.zip /opt/test | 将目录压缩 | |
unzip -v hello.zip | 查看压缩文件中的信息 | |
unzip hello.zip | 解压 |
进程与服务
进程:操作系统正在运行的应用程序。任何一个进程都会有一个进程ID,都会消耗CPU和 内存资源
服务:通过服务控制面版或命令直接启动的应用程序,也可以是操作系统启动时自动启动的后台应用程序
进程相关
ps
:当前终端启动的进程ps -ef||ps aux
:查找当前操作系统里面所有进程信息ps aux | grep sbin
:查找进程中包含sbin的进程ps aux|sort -k 3 -r | head -n 6
:取出最消耗cpu的前五个进程信息- sort 排序 默认从小到大,-r 逆序
top
:查看进程信息和系统的性能情况top -n 1|sort -k 9 -r | head -n 6
:取出最消耗cpu的前五个进程信息
kill PID
:结束进程kill -9 PID
:强制结束进程
服务管理与运行
1、service:在CentOS-7以前的版本中使用(大部分其他Linux都是用service)
2、systemctl:CentOS-7以后的版本,也兼容service
# 查看服务状态
service sshd status
systemctl status sshd
# 启动某个服务
service sshd start
systemctl start sshd.service
# 停止某个服务
service sshd stop
systemctl stop sshd.service
# 重启某个服务
service sshd restart
systemctl restart sshd
# 启动自启动程序
systemctl enable sshd
# 禁用自启用
systemctl disable sshd
# 查看服务情况 是否自动启动
systemctl list-unit-files
# 启动自带防火墙服务
systemctl start firewalld
安装xampp
xampp是一个自解压离线安装包,不需要下载,不需要额外命令,先上传,给安装包授予可执行权限
默认情况下,即使是执行当前目录下的可执行程序,也不能直接写文件名,必须在前面加上 ./ ,这才表示执行当前目录下的可执行程序。不加的话Linux不会在当前目录下寻找,而是去系统预先配置号的环境变量中去寻找,找不到的话就会报错
安装后。/opt/lampp/lampp start 启动三个服务:Apache、MySQL、ProFTP
第一次启动时会报错,修改 vi /opt/lampp/lampp,将2.2.5 的内核版本号 修改为 2.8.0
再次启动会报错,netstat未找到
netstat时Linux中一个常规的网络相关命令,用于查看当前系统中开启了那些端口。默认最小化安装未安装
yum install net-tools
安装应用
Yum在线安装
Yum是一个再Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理。支持断点续传
命令
yum list:查询本机已经安装的包
yum search mysql:在线搜索当前源可用的包
yum repolist:列出当前的源 镜像仓库
yum install gcc:安装
yum install gcc mysql cc c++ -y:不需要确认,直接确认
yum deplist curl:查看依赖包 依赖库
yum erase/remove wget:卸载
yum clear all:清楚缓存的仓库地址
yum makecache:重新根据配置文件制作缓存列表
yum update:更新
rpm离线安装
下载再安装
rpm -qa | grep mysql # rpm -qa查询
# 安装
rpm -ivh .....rpm
# 卸载
rpm -e .......
利用rpm安装mysql服务器版:报错 缺少依赖perl,需要在线安装yum
基于源码安装
适合于专业人员,不需要要求能看懂源码
基本过程
- 解压后,去源码目录找文件:configure setup.sh install.sh
- ./configure
- make
- make install
使用源码安装nginx
1、解压后的目录
2、 ./configure,缺失c的环境
3、配置环境
yum install gcc -y
4、依旧报错,一步一步的安装 pcre-devel
5、安装成功
对于Redhat体系的Linux,主流的是Yun+rpm,新的CetnOS8中使用dnf
对于debian体系的Linux,安装时 apt-get和apt
网络相关命令
ping命令
ping www.baidu.com 测试是否与服务器连通,响应时间 以及 分别情况
ping -i 3 www.baidu.com 每三秒访问一次
ping -c 3 www.baidu.com 一共发3个数据包
ping -f www.baidu.com 快速发送ICMP数据包,进行压力测试
ping -f -c 200 www.baidu.com 快速发送200个ICMP数据包
ping -s 1024 www.baidu.com 设置每个ICMP的大小
ip命令
两套版本:(老)net-tools (新)iproute2
#新
#旧
ip adrr
ifconfig #显示网络基本信息
ip neigh
arp -an # 查看相邻计算机
ip lick #查看网卡MAC地址等
ip -s link
ifconfig -s# 查看网卡的收发数据包大小 RT 收 TX 发
ip addr add 192.168.112.12/24 dev ens33
# 临时未ens33网卡添加一个ip地址 systemetl restart nerwork后消失
ifconfig ens33 192.168.112.12/24#临时修改IP地址
ip addr del 192.168.112.12/24 dev ens33 # 删除一个ip地址
ip route
route
netstat -r
netstat -ant # 查看与tcp相关的路由信息
route -n#查看路由信息
ip route add default via 192.168.112.2
route add default gw 192.168.112.2 # 添加默认路由
ip route del default via 192.168.112.2
route del default gw 192.168.112.2 # 删除默认路由
ip route flush cache #刷新路由表
ip link set ens33 up
ifconfig ens33 up #启动网卡 down表示关闭
ss -anl
netstat -anlop #查看当前系统端口占有情况
traceroute命令
# Linux使用
traceroute ...
#Windows使用
tracert ...
# 跟踪到达目的网站的路由节点和路径 默认支持30个跃点
curl命令
curl http://www.baidu.com
curl -o du.html http://www.baidu.com
curl -O http://www.baidu.com/index.html
wget命令
wget ...
wget -O name ...
wget -c ... # 断点续传
wget -b ... # 后台下载
TCPDump流量监控
安装
yum install tcpdump -y
libpcap是Linux上标准的流量监控的库,大多数流量监控工具都是基于这个库开发
Windows上 winpcap npcap
使用
tcpdump -i ens33 #监控ens33网卡上的流量,输出到终端
tcpdump tcp and dst port 80 -i ens33 # 过滤 tcp并且端口为80
tcpdump tcp and dst port 80 -i ens33 -w ./tcp.pcap # 输出到文件
tcpdump tcp and dst port 80 -i ens33 -c 100 # 获取100个数据包就自动停下
Linux防火墙
IPTables防火墙
介绍
客户端代理,iptables是一个基于命令行的防火墙工具,使用规则链来允许/阻止网络流量。
① 防火墙是一层一层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的;
② 如果匹配上规则,即明确表明阻止还是通过,此时数据包就不再向下匹配新规则了;
③ 如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,则按照默认策略进行处理;
④ 防火墙的默认规则是对应的链的所有的规则执行完成后才会执行的
iptables的结构是由表组成,而tables是由链组成,链又是由具体的规则组成。
编写iptables规则时,先指定表,然后指定链。tables的作用是区分不同功能的规则,并存储这些规则
五张表
不同的规则存放在不同的表中
- filter表:默认表,负责过滤数据包。使用频率最高
- nat表:用于网络地址转换(IP、端口)和流量转发
- mangle表:主要应用在修改数据包、流量整形、给数据包打标识
- raw表:主要用于配置连接跟踪相关内容
- security表:用于安全Linux的防火墙规则,是新增的表
五条链
流量的方向
- input:匹配目标IP是本机的数据包,入站
- output:匹配源IP是本机的数据包,出战
- forward:匹配流经本机的数据包,转发
- prerouting:修改目的地址,用来做 DNAT。
- postrouting:修改源地址,用来做SNAT。
规则
基于防火墙策略设置的各类防护规则,防火墙规则执行顺序为从前到后依次执行,遇到匹配的规则就不向下检查,遇到不匹配的继续向下匹配。
安装和配置IPTbales
systemctl stop firrwalld # firewalld默认情况下拒绝所有流量
#
yum install iptables iptables-services
命令
查看规则
iptables -nL # 将端口号以数字的形式显示默认表filter中的规则
iptables -L # 将端口号以名称的形式显示默认表filter中的规则
配置规则
# 防火墙规则从上到下依次匹配,匹配好就退出
# -A:append 追加
# -I:input 插入到开头 优先级高
iptables -I INPUT -j DROP # 所有入站流量被丢弃 包括ssh
iptables -I OUTPUT -j DROP # 所有出站流量被丢弃 包括ssh
----> 断网状态,流量无法进来也无法出去
---->#DROP:直接丢弃数据包,不会对源端做任何回复
#REJECT:拒绝数据包,并向源端发送拒绝响应
#ACCEPT:允许数据包
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -p tcp --dport 22 -j ACCEPT# 打开目标端口22,接受流经该端口的流量
iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT# 允许响应的流量流出
iptables -I INPUT -p icmp -j ACCEPT
iptables -I OUTPUT -p icmp -j ACCEPT
iptables -I OUTPUT -p icmp -j REJECT
iptables -I OUTPUT -p icmp -j REJECT
# 以上的配置服务器无法访问其他网站 #
--------------------------------------------------------------------------------------
# 下面配置服务器可以访问外部网站 白名单 #
# 可以最大可能避免 反弹shell和挖矿程序 去试图通过本地访问目标服务器下载恶意程序或执行恶意指令
#出站 本机->外部网站
iptables -I OUTPUT -o ens33 -p tcp -d 101.37.65.91 --dport 80 -j ACCEPT
#入站:外部网站->本机
iptables -I INPUT -i ens33 -p tcp -s 101.37.65.91 --sport 80 -j ACCEPT
# 防止DDOS攻击,设置一些限定条件
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
# 同时设定多个端口运行
iptables -I INPUT -p tcp -m multiport --dport 80,22,443 -j ACCEPT
# 端口转发
# 第一种,本机端口转发:比如80端口对外封闭,开放一个45692供外部访问。可以避免协议猜测
# 第二种,远程端口转发,把本机接受到的请求转发到远程电脑和对应端口上
#PREROUTING先于filter执行,不需要端口ACCEPT
# 本机端口转发
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 80
# 远程端口转发
# 确保端口转发功能启用
vi /etc/syscysctl.conf
加 net.ipv4.ip_forward = 1
sysctl -p /etc/syscysctl.conf
#发 请求192.168.40.205:7777,转发到 192.168.11.153:80
iptables -t nat -A PREROUTING -d 192.168.40.205 -p tcp --dport 7777 -j DNAT --to-destination 192.168.11.153:80
#返回
iptables -t nat -A POSTROUTING 192.168.11.153 -p tcp --dport 7777 -j SNAT --to- 192.168.40.205
删除规则
iptables -L INPUT --line-numbers # 查看input链中的规则的行号
iptables -D INPUT 3 # 删除input链中的第三条规则
iptables -F # 清空
保存规则
# 默认情况,重启iptables就是丢失所有的规则。所以要保存
service iptables save # 保存 加载
保存到: /etc/sysconfig/iptables
firewalld防火墙
firewalld可以通过定义的源IP或网络接口将入站流量分类到不同区域zone。每个区域基于指定的准则按自己配置去通过或拒绝包。 基于IP tables进行语法简化
基本
# 启动
systemctl start firewalld
# 查看状态
systemctl status firewalld
# 禁用
systemctl stop firewalld
# 停止
systemctl disable firewalld
# 重启
systemctl restart firewalld
区域
在不同区域可以设置不同的防火墙策略,方便需要的时候切换。
默认为public
命令
基础
# 重载防火墙
firewall-cmd --reload
# 检查防火墙状态
firewall-cmd --state
# 设置区域(默认区域)
firewall-cmd --set-default-zone = drop
firewall-cmd --set-default-zone = trusted
# 增加的规则都是暂时生效,restart之后就消失;在命令后面加入 --permanent:表示永久生效(直接写入文件),需要 firewall-cmd --reload 重新加载
# 展示当前默认区域的信息
firewall-cmd --list-all
# 添加允许端口
firewall-cmd --add-port=80/tcp # 暂时开放,后面加入 --permanent:表示永久生效
# 允许服务 =右边要是 服务名 <- firewall-cmd --get-service
firewall-cmd --add-service = http
# 删除端口
firewall-cmd --remove-port=80/tcp
# 删除端口
firewall-cmd --remove-service=http
# 查看当前区域
firewall-cmd --get-active-zone
# 查看所有的区域
firewall-cmd --get-zones
# 拒绝所有的包
firewall-cmd --panic -on
# 取消拒绝状态
firewall-cmd --panic -off
# 允许服务通过多少时间 在拒绝的情况下
firewall-cmd --add-service=http --timeout 30s (s m h)
富规则
# 添加指定ip访问特定端口规则 192.168.10.22可以访问80端口
firewall-cmd --permanent --add-rich-rule 'rule family='ipv4' source address= '192.168.10.22' port port='80' protocol='tcp' accept'
# 删除指定ip访问特定端口规则
firewall-cmd --permanent --remove-rich-rule 'rule family='ipv4' source address= '192.168.10.22' port port='80' protocol='tcp' accept'
# 允许所有主机的http服务 与 firewall-cmd --add-service = http 一样
firewall-cmd --add-rich-rule 'rule family="ipv4" service name="http" accept'
# 禁止某个IP访问
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.10.22" frop'
# firewall使用iptables 增 1代表的优先级,数字越小优先级越大
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 192.168.10.22 -j ACCEPT
#查看
firewall-cmd --direct --get-all-rules
端口转发
# 8888端口的流量转发到80
firewall-cmd --add-forward-port=port8888:proto=tcp:toport=80
#开启IP伪装
firewall-cmd --query-masquerade # 检查是否允许伪装ip
firewall-cmd --add-masquerade # 允许防火墙伪装ip
firewall-cmd --remove-masquerade # 禁止防火墙伪装ip
# 远程转发
firewall-cmd --add-forward-port=port8888:proto=tcp:ttoaddr=101.67.26.1:toport=80
Shell语法
基础
shell脚本其实就是把一批命令集合在一起,类似程序设计但是又不是程序设计
shell程序复杂度无法与编程语言相提并论,但和操作系统集成一起,可执行更加底层的命令组合,且效率很高
类型
shell操作
bash基本操作
基本应用
echo命令
变量
环境变量
预先定义好的全局变量,PATH路径下的不需要输入完整的路径
执行脚本
. hello.sh
bash hello.sh
source hello.sh
sh hello.sh
chmod u+x hello.sh
./hello.sh
传递参数
echo "hello world";
echo "一共有$#个参数";
echo "参数一 $1";
echo "参数零 $0;
# 最多传9个参数,到$9
source hello.sh 1 2 3 4 5 6 7 8 9
sh hello.sh
引号
单引号、双引号、反引号
# 单引号 双引号 反引号
echo "环境变量:$PATH" # 双引号输出内容,进行解义
echo '环境变量:$PATH' # 单引号直接输出引号内部内容,不进行解义
echo `date "+%Y-%m-%d %H:%M:%S"` # shell中有空格就会报错,达不到想要的意思。加上反引号可以有空格
now=`date "+%Y-%m-%d %H:%M:%S"` # 执行结果赋值给now也需要``
echo $now
特殊用法
*和@区别
sh hello.sh 11 22 33
echo "$ @ result:$@"
echo "$ * result:$*"
结果:
$ @ result:"11" "22" "33" 每个参数加一个引号
$ * result:"11 22 33" 就加一个引号
expr数值计算
# shell空格要注意 第一次是传递三个参数,第二个是传递一个参数
[root@localhost learn]# expr 10 + 10
20
[root@localhost learn]# expr 10+10
10+
[root@localhost learn]# expr 10 = 10
1
# 不可以处理小数
test命令
test文件
逻辑处理
test字符串
test数值
高级
分支语句
if 条件 # if和elif后面给的是一个语句,语句的$?为0则执行命令
then
命令
fi
if 条件;then # if和elif后面给的是一个语句,语句的$?为0则执行命令
命令
elif 条件;then
命令
else
命令
fi
# 例子
if([ $# -ne 1 ]);then
echo "输入的参数不符合要求"
elif [ ! -e ${1} ];then
echo "输入的文件不存在"
else
grep -n root $1
fi
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
......
*)
echo "error"
esac
循环语句
# {1..100}默认步长为1 1,2,3...100 {1..100..2} 1 3 5 7 ...
for i in {1..100};do
语句
expr a + i
let a+=i
((a+=i))
done
for ((i=1;i<=100;i++));do
...
done
while 条件;do
命令
done
函数
function 函数名()
{...}
或者
函数名()
{...}
function add(){
let sum=$1+$2
echo $sum # 相当于 返回值 但不完全一样
}
result=`add 100 200`
result0=$(add 100 200)
echo -e "resule:$result\nresult0:$result0"
# 关于括号的用法
(()) 双圆括号,运算可以代替expr
${} 取特定参数或变量的值
$() 可代替``执行括号中的命令
$[] 整数运算 可代替expr
数组
declare -a weekday # 创建数组weekeday 下标从0开始
weekday[1]=Monday
weekday[2]=Tuesday
weekday[3]=Wednesday
weekday[4]=4
weekday[5]=5
weekady = (Monday Tuesday 123 321 dsa) # 创建数组并进行初始化
echo ${weekday[@]} # 获取数组所有的元素
for i in ${weekday[@]};do
echo $i
done
echo "当前数组的个数:${#weekday[@]}" # 数组的长度
for ((i=1;i<=5;i++));do
echo ${weekday[i]}
done
CronTab及定时任务
定时任务基本原理
# 每5秒输出一个内容
for i in {1..10};do
sleep 5
echo `date "+%Y-%m-%d %H:%M:%S"`
done
sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小时
-
每小时的第二十分钟执行
-
指定某个时间执行
-
dtime=15:57:00 ctime=`date "+%H:%M:%S"` echo "当前时间为$ctime,目标时间为$dtime" while [ "$dtime" != "$ctime" ];do sleep 1 # 一秒一秒的计算,防止在一秒之内多次判断 ctime=`date "+%H:%M:%S"` if [ "$dtime" == "$ctime" ];then echo "OK" fi done
-
Cron定时任务
命令实例 | 描述 |
---|---|
crontab | 每个用户都可以有一个crontab文件来保存调度信息,通过该命令运行任意一个shell脚本或者命令 |
/var/spool/cron | 保存所有用户的crontab文件 |
/etc/cron.deny /etc/cron.allow | 系统管理员可以通过cron.deny和cron.allow这两个文件禁止或者允许用户拥有自己的crontab文件(cron.allow需要自己新建) |
crontab域 | * * * * * command 第1列 分钟 0-59 第2列 小时 0-23 第3列 日期 1-31 第4列 月 1-12 第5列 星期0-6 第6列 执行的命令 |
常用规则 | *:匹配任何值 */n:匹配每n个单位(从起始值算起的第n个单位) x:匹配x x-y:匹配x-y的值 x,y,z:只匹配x y z 三个值 例如: 52 12 * * * command 每月每周每天的12点52执行command |
crontab [-u user] -e -l -r | -u 用户名 -e 编辑 -l 列出crontab文件内容 -r 删除crontab文件内容 |
systemctl start/stop crond | 启动 停止 crond进程 |
不发送邮件 | 再crontab -e中编辑任务时,在第一行添加 MAILTO=“”,则不会发送邮件 |
提示:编写定时任务时,确定好定时任务规则后,尽量将要执行的指令直接放在Shell脚本中,让cron直接执行脚本就好,尽量避免在定时规则文件中直接调用命令。例如
*/1 * * * *
opt/learn/time.sh (在crontab -e中编辑)
确保有执行权限,绝对路径
其他命令补充
命令实例 | 描述 |
---|---|
at | 单词定时任务 yum install at -y |
at 时间 | 指定某一特定时间去做某件事情 |
atq | 查询现有任务 |
atrm id | 删除某个任务 |
command& | 后台执行 |
nuhup command& | 后台执行,所有的输出都转存在nohup.txt文件中 |
sleep n | 脚本暂停n秒 s m h |
usleep n | 脚本暂停n纳秒。10的-9次方秒 |
time command | 计算某个命令或者脚本运行时花费的时间(精确到毫秒) |
站点可用性检测
利用crontab来判断web服务器是否可用。
一个站点无法访问两个原因:
-
WEB服务器没有打开,如何判断web服务器是否打开?
1、使用curl curl http://192.168.40.205/dashboard/ $?为0,则web服务器打开,否则没有 2、使用netstat netstat -ant | grep 80 如果端口被打开,$?为0 3、使用 ps -aux 查看对应进程
-
防火墙没有允许80端口打开
firewall-cmd --list-port | grep 80
#代码
curl http://192.168.40.205/dashboard/ > /dev/null
if [ $? -ne 0 ];then
/opt/lampp/lampp start
echo "开启web服务器"`date "+%Y-%m-%d %H:%M:%S"` >> /opt/站点检测web.txt
fi
firewall-cmd --list-port | grep 80
if [ $? -ne 0 ]; then
echo "防火墙允许80端口"`date "+%Y-%m-%d %H:%M:%S"` >> /opt/站点检测firewall.txt
firewall-cmd --add-port=80/tcp
fi
字符串
字符串处理
# 定义变量
url="http://www.baidu.com/index.html"
echo ${url#*//} # 删除掉从左边第一个字符到第一个//的内容
echo ${url##*/} # 删除掉从左边第一个字符到最后一个/的内容
echo ${url%/*} #从右边开始删除从右到左的第一个/和之后的内容
echo ${url%%/*} #从右边开始删除从右到左的最后一个/和之后的内容
# 定义变量
phone="19863015267"
echo ${phone:2:5} # 截取下标为2以及之后的5个字符 86301
echo ${phone:0-4:2} # 截取倒数第四个以及之后的2个字符 52
echo ${#phone} # 计算字符串长度
AWK
对文本进行逐行管理
awk 选项 处理逻辑 文件
echo "hello duyun welcome" | awk '{print $2}' # duyun
# 默认情况下,awk以空格将字符串分隔为列 默认值$0 整个字符串
awk -F '.' '{print $2}' # -F 指定分隔符
awk -F '[/.]' '{print $2}' #以 / or . 作为分割符
awk -F ':' '$1~/root/ {print $1}' /etc/passwd # $1~/root/ 第一行包含root的
# 统计/etc/passwd 中不包含root的行,并统计有多少行
awk -F : 'BEGIN {sum=0} $0!~/root/ {sum+=1} ERD {print sum}' /etc/passwd
# 第一个域包含root的话打印它,否则打印第三个域
awk -F : '{if ($1=="root") print $1;else print $3}'
sed
常见三个选项
- -e 指定脚本 或 进行多点编辑
- -n 显示处理后的结果
- -i 永久将编辑文件保存到指定文件中(不加的话仅仅在屏幕输出并不会影响文件内容)
常见六个动作
- a:新增。后接的字符串出现在目标的下一行
- c:取代。后接的字符串取代n1 n2 之间的行
- d:删除
- i:插入。后接的字符串出现在目标的上一行
- p:打印。
- s:取代。一般配合正则表达式
实例
head /etc/root >> test.txt
sed [选项] '操作' 参数
sed '5a hello' test.txt # 在第五行后面添加
sed '5i hello' test.txt # 在第五行前面添加
sed '2,4d' test.txt # 删除第二到四行
sed '2,$' test.txt # 删除第2行到最后
sed '2,4c Gooooooood' test.txt # 2-4行替换为 Gooooooood
sed -n '/root/p' test.txt # 搜索包含root的行
sed '/root/d' test.txt # 删除所有包含root的行
sed 's/要被取代的字符串/新的字符串/g' # 搜索并替换,g代表全局替换,不加按照行查找到第一个进行替换
sed -e '' -e '' -e '' # 多点编辑
sed -i '4a hello' test.txt # 直接修改文件,永久保存
性能指标监控与通知
介绍
系统的性能指标监控是比较常见的针对系统的管理场景。比如挖矿程序或者系统本身存在高CPU进程,除了CPU也可以监控内存、硬盘、网络流量等。通过监控和通知可以及时对系统的运行情况进行把控进而实现正确的处置,如果发现某些异常CPU消耗,甚至可以直接结束进程。
步骤
- 通过相应的命令能够输出需要的指标
- 通过awk对输出的指标进行过滤,找到要监控的值
- 根据对应的值进行判断,进而决定处理的方式
使用yes程序监控CPU
# 获得总的cpu的可用率 int型
cpu=`top -n 1 | grep %Cpu | awk '{print int($8)}'`
# 或
cpu=$(top -n 1 | grep %Cpu | awk '{print $8}' | awk -F . '{print $1}')
# 获取消耗CPU最大的进程 获得的数字/内核的个数
pcpu=`ps -aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $3}'`
echo pcpu / 3 | bc # bc 命令是任意精度计算器语言,通常在linux下当计算器用
# 获取消耗CPU最大的进程id
pcpu=`ps -aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $2}'`
# 或使用 top -n 1
# 搜集内存的使用信息 空闲的内存
mem=$(top -n 1 | grep "KiB Mem" | awk '{print $6}')
mem=`free|grep Mem|awk '{print $4}'`
# 硬盘使用信息
df -h | grep ^/dev/mapper
# 网络流量
ip -s link
## shell脚本
cpu=`top -n 1 | grep %Cpu | awk '{print int($8)}'`
if [ $cpu -lt 70 ];then
pcpu=`ps -aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $3}'`
ppcpu=$(echo $pcpu / 3 | bc)
cpuid=`ps -aux | sort -k 3 -r | head -n 2 | tail -n 1 | awk '{print $2}'`
echo "CPU可利用率过低,占用CPU最高的进程ID为$cpuid,占用$ppcpu%"
# kill -9 $cpuid
else
echo "CPU is Ok"
fi
发送邮件
安装:yum install mail
确保服务打开:systemctl status postfix
向本地用户发送
echo '内容' | mail -s '标题' root
mail -s '标题' -a 附件地址 root < /etc/passwd
cp /dev/null /var/spool/mail/root # 清空邮件
mail查看邮件,输入序号查看具体邮件,q退出,h邮件列表
向外部邮箱发邮件
编辑/etc/mail.rc 输入SMTP信息
set from=2673711750@qq.com # 发邮件的账户
set smtp=smtp.qq.com #发邮件的smtp服务
set smtp-auth-user=2673711750@qq.com
set smtp-auth-password=qq邮箱服务器生成的授权码
set smtp-auth=login
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hoclJv9O-1659627264661)(F:\笔记图片\image-20220801184027526.png)]
敏感文件监控
原理
入侵检测功能很多,总结起来分为:流量和文件
针对敏感文件进行监控:是否被篡改、是否新增内容、是否被删除等等
判断一个文件是否被篡改:使用md5sum查看md5数字指纹,不可逆的摘要算法。
在安全的状态下,针对敏感文件生成基线摘要数据,保存起来,下一次,再根据当前最新的文件状态生成一次,两次进行对比,可以知道是否被篡改。(潜在的风险:基线数据也被篡改,解决方案:离线保存)另外,针对文本型文件,还可以继续深入,去比较哪些内容被篡改了。
# 首先将需要监控的文件备份并且计算md5值
md5sum /opt/learn/* # md5无法针对文件夹进行摘要,所以,如果learn目录下有文件夹,则此命令无法成功执行
find /opt/learn -type f | xargs md5sum # 这是比较标准的用法
find /opt/learn -type f | xargs md5sum > opt/baselearn/learn.md5.base # 将基线数据保存起来
# 利用md5sum -c base 来检查文件是否被篡改
md5sum -c --quiet learn.md5.base > learn.diff # 将对比失败的文件信息保存到
# 比较两个文件具体内容的差异
diff 文件一 文件二
# d代表删除 a代表新增 c代表修改
# 检测被检测目录下有新的文件
diff /opr/learn/ opt/learnbase
diff ./learn ./learnbase | grep "只在"|awk -F : '{print $2}' #列出文件新增或删除的信息
diff ./learn ./learnbase | grep "^diff"|awk '{print $2}' # ;列出内容修改的文件
代码
要注意:diff比较筛选grep的条件不一样,中文和英文不一样 要改 !!!
# 通过参数传递监控的目标目录和基线备份目录
target=$1
base=$2
action=$3
# 判断两个参数是否是有效的目录
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
# tee作用:在输出的同时还要重定向到文件,-a是追加 本身属于替换
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 "关键文件监控警报" 15903523@qq.com < $base/result.log
# 调用
sh ...sh /opt/learn /opt/baselearn new
防火墙安全应急
如何判断SSH远程连接失败:日志 /var/log/secure来提取登录失败的特征,出现Failed pasword可以判定非法登录或者暴力破解。通过日志文件中的客户端ip地址,提取出来,进行阻止
# 统计出错次数
grep "Failed" /var/log/secure | wc -l
# 查找到ip uniq去重
tail /var/log/secure | grep "Failed" | awk '{print $13}' | uniq
# 代码
failcount=$(grep "Failed" /var/log/secure | wc -l)
if [ $failcount -ge 3 ];then
# ip=`tail /var/log/secure | grep "Failed" | awk '{print $13}' | uniq`
ip=192.168.1.1
## 查找到多个IP地址怎么办? ##
firewall-cmd --add-rich-rule="rule family="ipv4" source address="$ip" drop"
echo "防火墙阻止IP:$ip"
# 使用pkill强制终止ssh进程 pkill -kill -t 进程终端
## 多条进程怎么处理? ##
#循环读取
#先写入文件,然后while while read line;do echo $line;done<$filename
terninal=$(who | grep $ip | awk '{print $2}'|head -n 1)
pkill -kill -t $terninal
fi
pkill yes # 可以根据进程名字结束进程
[root@localhost ~]# cat blockip.sh
#!/bin/bash
# 功能描述:分析系统登录日志,过滤异常IP地址,并通过防火墙禁用该IP
# 强制退出时关闭所有后台进程
#trap 'kill $one_pid exit' EXIT INT
# 日志文件路径
logfile=/var/log/secure
blockfile=/tmp/blockip.txt
one_minute(){
while :
do
# 获取计算机当前时间,以及1分钟前的时间,时间格式:
# %b(月份简写,Jan) %e(日期,1) %T(时间 18:00:00)
# LANG=C 的作用是否防止输出中文
# 使用local定义局部变量的好处是多个函数使用相同的变量名也不会冲突
local curtime_month=$(LANG=C date +"%b")
local curtime_day=$(LANG=C date +"%e")
local curtime_time=$(LANG=C date +"%T")
local one_minus_ago=$(LANG=C date -d "10 minutes ago" +"%T")
# 将当前时间转换为距离 1970-01-01 00:00:00 的秒数,方便后期计算
local curtime_seconds=$(LANG=C date +"%s")
# 分析1分钟内所有的日志,如果密码失败则过滤倒数第4列的IP地址
# 通过管道对过滤的IP进行计数统计,提取密码失败次数大于等于3次的IP地址
# awk 调用外部shell的变量是,双引号在外面表示字符串("''"),单引号在外边便是数字('""')
pass_fail_ip=$(awk '$1=="'$curtime_month'" && $2=='"$curtime_day"' && $3>="'$one_minus_ago'" && $3<="'$curtime_time'" { if($6=="Failed" && $9!="invalid") {print $(NF-3)}}' $logfile | awk '{IP[$1]++} END{ for(i in IP){ if(IP[i]>=3) {print i} } }')
#echo "$pass_fail_ip"
# 将密码失败次数大于3次的IP写入黑名单文件
# 每次写入前需要判断黑名单中是否已存在该IP
# 写入黑名单时附加时间标记,实现仅将IP放入黑名单特定的时间
for i in $pass_fail_ip
do
if ! grep -q "$i" $blockfile
then
echo "$curtime_seconds $i" >> $blockfile
fi
done
# 提取无效账户登录服务器3次的IP地址,并将其加入黑名单
user_invalid_ip=$(awk '$1=="'$curtime_month'" && $2=='"$curtime_day"' && $3>="'$one_minus_ago'" && $3<="'$curtime_time'" { if($9=="invalid") {print $(NF-3)}}' $logfile | awk '{IP[$1]++} END{ for(i in IP){ if(IP[i]>=3) {print i} } }')
for j in $user_invalid_ip
do
if ! grep -q "$j" $blockfile
then
echo "$curtime_seconds $j" >> $blockfile
fi
done
sleep 60
done
}
# 记录了违规IP后将违规IP加入到防火墙策略中拒绝,并设置生效时间
firewall_answer(){
#开启防火墙
systemctl start firewalld &> /dev/null
if [ -f $blockfile ]
then
for z in $(awk '{print $2}' $blockfile)
do
firewall-cmd --add-rich-rule="rule family=ipv4 source address=$z reject" --timeout=1200
echo "$z"
done
fi
}
# 每隔20分钟检查一次黑名单,清理大于20分钟的黑名单IP
clear_blockip(){
while :
do
sleep 1200
# 将当前时间转换为距离1970-01-01 00:00:00的秒数,方便后期计算
local curtime_seconds=$(LANG=C date +"%s")
# awk 调用外部shell变量的另一种方式是使用-v选项
# 当前时间去黑名单中的时间标记
# 大于等于1200秒(20分钟)则将其从黑名单中删除
tmp=$(awk -v now=$curtime_seconds '(now-$1)>=1200 {print $2}' $blockfile)
for i in $tmp
do
sed -i "/$i/d"
done
done
}
#> $blockfile
one_minute &
noe_pid="$!"
firewall_answer
clear_blockip
Android
配置
ADB + 模拟器
a|b ↩︎