五大基本功能
(1)进程和线程的管理:进程线程的状态、控制、同步互斥、通信调度等
(2)存储管理:分配/回收、地址转换、存储保护等
(3)文件管理:文件目录、文件操作、磁盘空间、文件存取控制
(4)设备管理:设备驱动、分配回收、缓冲技术等
(5)用户接口:系统命令、编程接口
三个作用
(1)资源的管理者
(2)向用户提供各种服务
(3)对硬件机器的扩展
操作系统的应用场景
(1)嵌入式设备:如POS机、单反相机、游戏机、智能设备等
(2)移动端设备:如手机、平板电脑等
(3)个人桌面电脑:如上网本、游戏本、笔记本电脑、台式机等
(4)服务器:如云服务器、PC服务器、刀片服务器、小型机等
(5)超级计算机:各类超级计算机、大型服务器等
通常情况下,服务器端操作系统(Windows,Linux)不会安装GUI界面,只是一个内核加Shell,再加少量命令行。
SSH为Secure Shell 的缩写,由IETF的网络小组(Network Working Group)所制定;SSH为建立在应用层基础上的安全协议。SSH是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台,常见的可视化操作工具如本节内容所介绍的两款工具,也可以是基于命令行的SSH命令。SSH提供两种级别的安全验证。
1、第一种级别(基于口令的安全验证)
只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到"中间人"这种方式的攻击。
2、第二种级别(基于密匙的安全验证)
需要依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密"质询”(challenge)并把它发送给客户端软件。客户端软件收到"质询"之后就可以用你的私人密匙解密再把它发送给服务器。
用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令,相对来说更加安全。
SSH命令
c:\Users\Denny>ssh -1 root 192.168.157.136
[email protected]'s password:
Last login: wed Aug 11 01:44:40 2021 from 192.168.157.136
[root@zxgtwy ~]# uname
Linux
如果是首次连接,会提示类似以下的信息,输入"yes"回车即可:
The authenticity of host '192.168.157.136 (192.168.157.136)' can't be established.
ECDSA key fingerprint is SHA256:bj1deKY0toY2wWZ6RlX0k39iArND5MEcHqY8B93gkcU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
以下命令表明成功使用Windows的SSH内置命令连接到Linux上,进而可以不需要借助于XShell等工具进行远程连接。也可以使用以下方式进行连接:
c:\users\Denny>ssh [email protected]
[email protected]'s password:
Last login: wed Aug 11 02:01:50 2021 from 192.168.112.14
[root@zxgtwy ~]#
SCP命令
从Windows上传文件到Linux
C:\Users\lenovo>scp C:\Users\lenovo\Desktop\cccc.jpg [email protected]:/opt
[email protected]'s password:
cccc.jpg 100% 172KB 42.1MB/s 00:00
从Linux下载文件到Windows
C:\Users\lenovo>scp [email protected]:/opt/cccc.jpg E:\
[email protected]'s password:
cccc.jpg 100% 172KB 50.5MB/s 00:00
如果要传输的是文件夹,则添加-r参数即可
在Linux下运行"df -h"命令,可以查看到目前Linux中存在的硬盘分区情况,及每个分区的硬盘使用情况。
[root@zxgtwy ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 1.3G 49G 3% /
/dev/sda1 1014M 150M 865M 15% /boot
/dev/mapper/centos-home 46G 33M 46G 1% /home
tmpfs 378M 0 378M 0% /run/user/0
上述命令的结果中可以看到,Filesystem列表示文件系统,Size表示硬盘的大小,Used表示已经使用了多大,Avail表示剩余使用量,Use%表示占用百分比,Mounted on表示目前挂载到哪个目录下。
另外,对上述几个挂载的目录进行一下简单的说明。
(1) /dev: dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。
(2) /dev/shm: /dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。该分区的大小通常是系统内存的一半大小,由于该目录是驻留在内存中,所以对于在系统中需要使用的临时数据,可以将其存储在该目录中,就相当于我们直接在使用内存读写文件,速度相当快。(基本上来说,内存的读写速度可以达到硬盘的100倍左右)。
内存除了快以外,还有一个特性:断电则数据全部丢失。
(3) /run:一些运行过程中跟用户或进程有关的数据,属于内核级文件。
(4) /sys/fs/cgroup:关于运行过程中CPU、内存等数据,属于内核级文件。
(5)/∶根目录,用户可以使用的保存操作系统其他文件的目录,用户也可以创建自己的目录。
(6) /boot:操作系统的内核及在引导过程中使用的文件。
(7) /home:普通用户使用的根目录,通常也称之为“家目录",类似于Windows下的CNUsers目录。
(8) /run/user/0:编号ID为0的用户(通常是指root)在运行过程中产生的数据。
另外,在Linux中,文件系统诵常由以下类型构成,其特点总结如下:
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
ext2 | 255 bytes | 2 TB | 16TB |
ext3 | 255 bytes | 2 TB | 16TB |
ext4 | 255 bytes | 16TB | 1 EB |
XFS | 255 bytes | 8EB | 8EB |
1TB=1024GB,1PB=1024TB,1EB=1024PB,目前还没有单个存储器达到EB这个容量级别。
命令实例 | 作用 |
---|---|
/ | 表示根目录,是绝对路径 |
./ | 表示当前目录,是相对路径 |
…/ | 表示上—级目录,是相对路径 |
/root | root用户的主目录 |
/home/username | 存放普通用户的个人配置文件 |
/bin | 存放linux常用的命令 |
/boot | 存放系统启动时要用到的文件 |
/dev | 存放linux系统中使用的外部设备 |
/etc | 存放系统管理时用到的配置文件和子目录 |
/usr/sbin | 存放管理员的系统管理程序 |
/lib | 存放系统动态链接共享库 |
/lost+found | 系统运行异常时产生的错误,会将遗失的片断放在这里 |
/mnt | 可临时将别的外部设备挂接在此目录下 |
/proc | 存在系统内存中的信息 |
/usr | 用户的应用程序和文件都存放在这个目录下 |
/tmp | 存放临时文件的目录 |
通常情况下,我们可以使用/opt和/home目录,这两个目录均是由用户自由处理的,不存在敏感文件,也可以将程序安装在/opt/目录下,默认情况下,程序安装路径会在/usr/bin 或/var/目录下
top命令是全屏输出结果,如果要退出该命令,可以按"Q"键或"Ctrl+C"退出
命令 | 作用 |
---|---|
cd …/或cd … | 切换到上一层目录 |
cd 目录名 | 切换到对应目录 |
pwd | 查看当前所在目录 |
du -sh | 查看文件或文件夹的大小 |
fdisk -l | 查看磁盘分区列表 |
free | 查看内存使用情况 |
cat文件名 | 查看文本文件内容,如cat /etc/passwd可查看用户信息 |
cat /proc/meminfo | 查看内存信息 |
cat /proc/cpuinfo | 查看CPU信息 |
命令实例 | 作用 |
---|---|
文件/etc/inittab | 设置默认启动级别 |
0 | 代表halt,关机操作,这个0不能设置,否则机器将不能启动 |
1 | 代表单用户模式,采用这个设置,系统只能允许一个用户登 |
2 | 代表多用户模式,但不支持网络工作 |
3 | 代表命令行界面,即文本界面,是企业中服务器通用的启动模式 |
4 | 系统预留,该级别目前还没有使用 |
5 | 代表图形界面,也是Linux系统启动时带GUI的默认启动模式 |
6 | 代表重启模式,这个6也不能设置,否则系统反复重启 |
命令实例 | 作用 |
---|---|
reboot | 重启 |
shutdown -r now | 现在立刻重启 |
shutdown -r 11:30 | 等到11:30进行重启 |
shutdown -r +1 | 等1分钟后重启 |
halt | 关机 |
shutdown -h now | 现在立刻关闭系统 |
shutdown -h 11:30 | 等到11:30关闭系统 |
init 0 | 关机 |
init 6 | 重启 |
功能项 | 命令实例 | 作用 |
---|---|---|
文件创建 | vi /opt/learn/hello.txt | 在目录/opt/learn下创建文件hello.txt并进入vi编辑界面 |
touch /opt/learn/test | 在目录/opt/learn下创建空白文件test | |
cat > /opt/learn/catfile <创建文件catfile并在屏幕上输入内容,最后输入EOF结束,如果不使用< | | |
文件查看 | vi /etc/passwd | 在vi编辑器中输出文本内容 |
cat /etc/passwd | 在屏幕上输出文本内容 | |
more /etc/passwd | 分屏输出文本内容 | |
less /etc/passwd | 分屏输出文本内容并按需加载文件(适用于大文件的查看) | |
head -n 10 /etc/passwd | 只输出文件的头10行 | |
tail -n 20 /etc/passwd | 只输出文件末尾的20行 | |
tail -f 文本文件 | 表示通过流的方式实时查看文件 | |
strings /bin/ls | 查看二进制文件中的可打印字符 |
编辑一段文本,在命令行模式下,vi是默认编辑器,进入vh界面后,有两种处理模式:命令模式和编辑模式。默认命令模式进入,按"i"或"a"“进入编辑模式,在编辑模式下,按“ESC”"进入命令模式。
命令实例 | 作用 |
---|---|
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 | 重做(同标准编辑器中的Ctrl+Y) |
功能项 | 命令实例 | 作用 |
---|---|---|
文件操作 | cp hello.txt /opt/test | 把文件hello.txt复制到文件夹/opt/test下 |
cp hello.txt /opt/test/hello.cp | 把文件hello.txt复制到文件夹/opt/test下并重命名成hello.cp | |
mv hello.txt /opt/test | 将文件hello.txt剪切到文件夹/opt/test下 | |
mv hello.txt /opt/test/hello.mv | 将文件hello.txt剪切到文件夹/opt/test下并重命名成hello.mv | |
mv hello.txt hello2.txt | 重命名 | |
rm /opt/test/hello.cp | 删除文件 | |
rm -f /opt/test/hello.mv | 强制删除文件,不会有提示信息 | |
du -sk hello.txt | 查看文件hello.txt的大小(以K为单位) | |
链接 | ln -s hello.txt shello | 为hello.txt文件创建一个名为shello的软链接(类似于快捷方式) |
ln -d hello.txt dhello | 为hello.txt文件创建一个名为dhello的硬链接硬链接表示所有文件中更改任意一个,其他文件的所有属性会跟着变化,如大小,更新时间,权限等 |
功能项 | 命令实例 | 作用 |
---|---|---|
ls / tree | ls [option][file/directory] | 显示指定目录下的所有文件或文件夹(同Windows->dir命令) |
ls | 显示当前目录的内容 | |
ls -l | 显示当前目录详细内容 | |
ls -a | 显示当前目录下的所有文件,包括隐藏文件 | |
ls *.txt | 显示目前下所有以.txt为后缀名的文件 | |
ls /opt/training | 显示目录/opt/training下的内容 | |
ls -R/opt/ | 列出所有/opt目录及其子目录的内容 | |
tree /opt | 用树状结构显示目录及文件 | |
pwd | pwd | 显示当前所在目录 |
cd | cd directory | 切换到指定目录 |
cd | 切换到当前用户所有的主目录 | |
cd … | 回退到当前目录的上一级目录 | |
cd /opt/learn | 用绝对路径切换到/opt/training目录下 | |
cd …/ …/ | 使用相对路径切换到当前目录的上—级的上—级目录下 | |
cd . | 切换到当前用户,相当于什么也没做 | |
mkdir | mkdir [option][director1] [directory2] … | 创建目录 |
mkdir /opt/learn/other | 在目录/opt/learn/下创建目录other | |
mkdir dir2 dir3 dir4 | 同时创建dir2 dir3 dir4三个目录 | |
mkdir -p /dir1/dir2/dir3/dir4 | 同时创建一个4层目录 | |
rmdir | rmdir dir1 | 删除—个空目录 |
其他操作 | cp -r /opt/learn lopt/learn2 | 拷贝文件夹 |
mv /opt/learn2 /opt/learn3 | 重命名文件夹 | |
rm -rf /opt/learn3 | 强制删除文件夹 | |
rm -rf / | 无提示地强制递归删除文件 | |
rm -rf /* | 无提示地强制递归删除全部文件 | |
xxx -h或 XXx --help或 man xXx | 查看命令的帮助 |
功能项 | 命令实例 | 作用 |
---|---|---|
用户组 | cat /etc/group | 查看当前系统存在的用户组 |
groupadd testing | 添加一个新的用户组testing | |
cat /etc/group | 查看组是否被新增成功 | |
groupmod -n test testing | 将testing重命名成test | |
groupdel test | 删除组test | |
groups root | 查看用户root所在的所有组 | |
useradd | cat /etc/passwd | 查看当前系统的用户信息 |
useradd qiang | 新增一个用户qiang(默认时将新增一个对应的名为qiang的组) | |
useradd -g test denny | 新增一个用户denny并将其加入test组 | |
useradd -g test -G dev mary | 新增用户mary,其主组为test,并附加到组dev中 | |
usermod | usermod -g dev qiang | 将用户qiang换到dev组 |
usermod -G 502 qiang | 将用户qiang附加到gid为502的这个组 | |
usermod -d /home/temp/mary | 将mary的主目录从/home/mary改为/home/temp | |
userdel | userdel qiang | 删除用户qiang |
userdel -f qiang | 强制删除用户qiang(即使该用户已经登录) | |
userdel -r qiang | 删除用户qiang并删除其主目录 |
任意一个文件或者文件夹,用ls -l的命令可以显示其基本信息和权限信息
drwxr-xr-x. 2 root root 6 Aug 12 11:31 myfolder
-rw-十--r--.1 root root 57504164 Aug 11 20:16 MySQL -server-5.6.40-1.e16.x86_64.rpm
第一栏的10个字符,共分为4个部分:
第1个字母:–代表普通文件,d 代表目录
第2、3、4:代表当前文件或文件夹所属用户〈 owner〉的权限
第5、6、7:代表当前文件或文件夹所属的用户组( group)的权限
第8、9、10:代表其他用户组和其他用户(other)的权限
权限的表示方式:
r读:也可以使用数字4来表示
w写:数字2
x执行:数字1
功能项 | 命令实例 | 作用 |
---|---|---|
chmod | chmod *[*权限][文件或目录] | 更改文件或目录的权限 |
Is -l hello.txt | 查看文件的详细属性,对其进行解释 | |
左边10位中的第一位代表文件类型 | d代表目录 -代表普通文件 l 代表链接文件 | |
左边10位中的后9位代表权限 | 前3位代表文件所有者的权限(用u表示)中间3位代表文件所在组的权限(用g表示)后3位代表其他组的权限(用o表示) | |
权限rwx的意义 | 权限r或数字4-表示可读权限w或数字2-表示写权限x或数字1 --表示可执行 | |
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 | 去除hello.txt的所有权限(此时仅root可编辑) | |
chmod 777 hello.txt | 将hello.txt的权限设为rwxrwxrwx | |
chmod 643 hello.txt | 将hello.txt的权限设为rw-r—wx | |
chmod 777 /opt/test | 将目录/opt/test的权限更改为777 | |
chmod -R 755 /opt/test | 将目录/opt/test及其下所有文件和子目录的权限更改为755 | |
chown | chown mary hello.txt | 将hello.txt的文件所有者改为mary |
chown mary /opt/test | 将目录/opt/test的所有者改为mary | |
chown -R mary /opt/test | 将目录/opt/test及其所有子目录和文件的所有者改为mary | |
chgrp | chgrp test hello.txt | 将hello.txt所在的组改为test |
chgrp mary /opt/test | 将目录/opt/test所在的组改为mary | |
chgrp -R mary /opt/test | 将目录/opt/test及其所有子目录和文件所在的组改为mary | |
passwd | passwd mary | 修改mary的密码 /etc/shadow保存了所有用户的密码,默认只有root能操作 |
功能项 | 命令实例 | 作用 |
---|---|---|
find | find 起始目录 查找类型 查找条件 | 查找起始目录及所有子目录下的文件及文件夹 |
find . -name “hello.txt” | 查找当前目录下文件名为hello.txt的文件或文件夹 | |
find . -name “hello” | 查找当前目录下文件名包含hello的文件或文件夹 | |
find /home -name “bash” | 查找目录/home下文件名包含bash的文件或文件夹 | |
find . -name “*” | 查找当前目录下的所有文件或文件夹(作用同Is -R) | |
find . -name “[h]*” | 查找当前目录下以h开头的文件或文件夹 | |
find . -name “[h |f]*” | 查找当前目录下所有以h或f开头的文件或文件夹 | |
find . -name “[a-z]*” | 查找当前目录下所有以小写字母开头的文件或文件夹 | |
find . -name"[A-Z]*" | 查找当前目录下所有以大写字母开头的文件或文件夹 | |
find . -name “[a-Z]*” | 查找当前目录下所有以字母开头的文件或文件夹 | |
find . -name “[h-w]*” | 查找当前目录下所有以字母h-w开头的文件或文件夹 | |
find . -name “[0-9]*” | 查找当前目录下所有以数字开头的文件或文件夹 | |
find . -name “[5-8]*” | 查找当前目录下所有以数字5-8开头的文件或文件夹 | |
find . -name “h?llo*” | 查找当前目录下所有以h后面带一个字符再加llo开头的文件或文件夹 | |
find . -name " [^a-h】*" | 查找当前目录下所有不以a-h开头的文件或文件夹 | |
find . -name ‘\\’ | 查找当前目录下所有包含特殊字符的文件(注意使用单引号) | |
find . -perm 777 | 查找当前目录下权限为777的文件或文件夹 | |
find . -path “./test” -prune -o -name “hello” | 查找当前目录下除test目录的其他所有目录中包含hello的文件或文件夹 | |
find . -user mary | 查找当前目录下文件所有者为mary的文件或文件夹 | |
find . -group dev | 查找当前目录下文件或文件夹所在组为dev的内容 | |
find . -mtime -3 | 查找当前目录下在3天内更新过的文件或文件夹 | |
find . -mtime +3 | 查找当前目录下在3天前更新过的文件或文件夹 | |
find . -newer helllo.txt | 查找当前目录下比hello.txt新的文件或文件夹 | |
find . ! -newer helllo.txt | 查找当前目录下比hello.txt 旧的文件或文件夹 | |
find . -type d | 查找当前目录下所有的文件夹(普通文件的类型为f),了解Linux文件类型:1)f:普通文件,如文本文件,可执行文件 2)d:目录3)l:软链接文件4)c:字符设备,如终端,磁带机等5) b:块设备,如光盘,硬盘等 | |
find . -type l | 查找当前目录下所有的软链接文件 | |
find . -size 602c | 查找当前目录下文件大小为602字节的文件,可用单位为: c- byte, k -,Kilobytes,M - Megabytes, G- Gigabytes | |
find . -size +602c | 查找当前目录下文件大小大于602字节的文件(用-表明小于) | |
find . -name “hello*” -exec ls -l {} ; | 查找当前目录下所有以hello开头的文件并将其细节显示出来,如果查找出了目录,那么此时要注意目录会被ls-l列出来 | |
find . -name “hello*” -exec rm {} ; | 查找当前目录下所有以hello开头的文件并将其删除 | |
find . -name “hello*” xargs ls -l | 查找当前目录下所有以hello开头的文件并将其细节显示出来 | |
Linux命令中的| | 管道,前面的输出就是后面的输入 |
功能项 | 命令实例 | 作用 |
---|---|---|
grep | grep[选项]匹配模式目标文件 | 基于行对目标文件的内容进行查找 |
grep “root” /etc/passwd | 查找到/etc/passwd文件中包含root的行 | |
grep -n “root” /etc/passwd | 查找到/etc/passwd文件中包含root的行并输出行号 | |
grep “^ma” /etc/passwd | 查找以ma为行首的行 | |
grep “bash$” /etc/passwd | 查找以bash为行尾的行 | |
grep “1” /etc/passwd | 查找以r或d为行首的行 | |
grep -v "内容” | 排除包含“内容""的行 | |
ls |grep test | 从ls的输出中过滤出包含test的文件名 | |
grep -r games /etc | 在/etc目录下查找所有包含games的文件 | |
grep “^s.*login$” ./passwd | 以sy开头,并且以login结尾的行 | |
find与grep结合 | find ./ -name "*” |xargs grep word | 遍历某个目录下的所有文件中包含word的文件,与上一条命令的功能类似xargs grep word |
wc | wc -l | 统计文件行数或输出的个数,-c或–bytes或–chars只显示Bytes数。-l或–ines 显示行数。-W或–words只显示字数,如果不指定参数,则统计所有信息 |
更多操作功能项 | 命令实例 | 作用 |
---|---|---|
tar / gzip | tar -cvf hello.tar hello.txt | 将hello.txt归档并命名成hello.tar |
tar -cvf test.tar /opt/test | 将目录/opt/test归档并命名成test.tar | |
tar -tf test.tar | 将归档文件test.tar中的文件显示出来 | |
tar -xvf test.tar | 提取归档文件中的内容 | |
gzip hello.tar | 将归档文件hello.tar压缩成hello.tar.gz | |
gzip -d hello.tar.gz | 解压缩文件成hello.tar | |
tar -zcf hello.tar.gz hello.txt | 将hello.txt归档并压缩成hello.tar.gz | |
tar -zxvf hello.tar.gz | 解压缩 | |
zip / unzip | zip hello.zip hello.txt | 将hello.txt压缩并命名成hello.zip |
zip -r test.zip /opt/test | 将/opt/test目录压缩 | |
unzip -v hello.zip | 查看压缩文件hello.zip中的文件信息 | |
unzip hello.zip | 解压缩hello.zip |
进程(Process):操作系统正在运行的应用程序,任意一个进程,都会有进程ID,都会消耗CPU和内存资源,服务(Service):通过服务控制面板或命令直接启动的应用程序,也可能是操作系统启动时自动启动的后台应用程序。服务一旦运行,也是一个进程。在Windows中,可以运行"services.msc"命令打开服务控制面板。
进程相关命令
ps:当前终端启动的进程
ps -ef或ps aux:查看当前操作系统里面所有进程信息
ps aux l grep sbin查找进程里面包含sbin的进程信息
ps aux | sort -k 3 -r | head -n 6:取出最消耗cPu的前5个进程的信息
top:查看进程信息和系统的性能情况
top -n 1 | sort -k 9 -r | head -n 6:取出最消耗cPu的前5个进程的信息
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可以不写)
#停止某个服务
service sshd stop
systemctl stop sshd
#重启某个服务
service sshd restart
systemctl restart sshd
#启用自动启动的功能
systemctl enable sshd
#禁止自动启动
systemctl disable sshd
#查看服务情况
systemctl list-unit-files
#启动自带防火墙服务
systemctl start firewalld
首先Xampp是一个自解压离线安装包,不需要下载,不需要额外命令,先确保上传,然后给安装包授予可执行权限
[root@zxgtwy opt]# xampp-7inux-x64-7.3.29-1-installer.run
-bash: xampp-linux-x64-7.3.29-1-installer .run: command not found
默认情况下,即使是执行当前目录下的可执行程序,也不能直接写文件名,而是必须在前面加上﹒/ , 这才表示是执行当前目录下的可执行程序如果不加 ./ ,Linux不会在当前目录下寻找,而是去系统预先配置好的环境变量当中去寻找,但是找不到,所以报错
安装完成后,/opt/lampp/lampp start启动Xampp的三个服务:Apache,MysQL,ProFTP
第一次启动时会报错,修改vi /opt/lampp/lampp,将2.2.5的内核版本号,修改为2.8.0,再次启动又可能会报错:
netstat : command not found
netstat是Linux中的一个常规的网络相关的命令,用于查看当前系统中开启了哪些端口,默认最小化安装时没有安装
yum install net-tools
先下载到本地,以.rpm文件名结尾,下载完成后,再安装。
rpm -qa | grep mysql
rpm -ivh mysq180-community-release-e16-1.noarch.rpm
rpm -e mysq180-community-release-e16-1.noarch
利用rpm安装MySQL服务器版:
[root@zxgtwy opt]# rpm -ivh MysQL-server-5.6.40-1.e16.x86_64.rpm
warning: MySQL -server-5.6.40-1.e16.x86_64.rpm: Header v3 DSA/SHA1 Signature,key ID 5072e1f5: NOKEY
error : Failed dependencies :
/usr/bin/per1 is needed by My5QL-server-5.6.40-1.e16.x86_64[root@centqiang opt]#
Failed dependencies:失败的依赖,缺少perl
源代码安装比较合适于专业人员,并不需要要求安装人员能看懂源码,但是要知道源代码的基本过程
解压后去源码目录找以下几个文件:configure, setup.sh, install.sh
./ configure
make
make install
安装nginx-1.21.2.tar.gz
[root@zxgtwy nginx-1.21.0]# ./configurechecking for os
+ Linux 3.10.0-1160.e17.x86_64 x86_64checking for c compiler ... not found
./ configure: error : c compiler cc is not found
[root@zxgtwy nginx-1.21.0]# yum install gcc -y
安装完成后再进行配置,如果提示缺少依赖库pcre或zlib等,则可以继续yum install pcre-devel.....
通常情况下,如果提示缺少什么库,一般先尝试yum install pcEe,如果不行,再尝试 yum install pcre-devel
Yum (全称为Yellow dog Updater,Modified)是一个在Fedora和RedHat以及Cent0S中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum list:查询本机已经安装的包
yum search mysql:在线搜索当前源(库)可用的包
yum repolist:列出当前的镜像仓库(repository)
yum install gcc:安装gcc
yum install gcc -y:不再提示是否确认,直接选择Yes
yum install gcc cmake gcc-c++ mysq1 wget -y:不再提示是否确认,直接选择Yes
yum deplist curl:查看应用程序curl的依赖库(library)
yum erase wget:卸载wget,卸载过程建议不要加-y,最好做二次确认
yum remove wget: 同上
yum clear all :清空缓存的镜像列表
yum makecache : 重新根据配置文件构建镜像缓存列表
yum update:更新
默认配置文件: /etc/yum.repo.d/CentOS-Base.repo
[base]
name=Centos-$releasever - Base
mirrorlist=http://mirror1ist.centos.org/release=Sreleasever&arch=Sbasearch&repo=os&infra=$infra4#baseur1=http: //mirror .centos.org/centos/$releasever/os /$basearch/
gpgcheck=1
gpgkey=file: ///etc/pki/rpm-gpg/RPM-GPG-KEY-Centos-7
mirrorlist并非镜像本身的地址,而是一堆镜像网址的集合,Centos会自动选择速度最快的一个
ping命令
ping www.woniuxy.com:测试是否也woniuxy. com的服务器连通,同时可以查看响应时间,及响应时间的分布情况
ping -i 3 www . woniuxy.com:每3秒钟访问一次
ping -c 5 www . woniuxy.com:一共发送5个数字包
ping -f www . woniuxy.com:快速发送ICMP数据包,进行压力测试
ping -f -c 200 www.woniuxy.com:设定具体的发包数量,用于快速检测响应时间等数据
ping -s 1024 www . woniuxy. com:设定每个ICMP数据包的大小
ip命令
ip addr:查看网卡及IP信息
ifconfig:同上
ip neigh : ARP协议,查看相邻计算机
arp -an:同上
ip link:查看网卡MAC地址等
ip -s link:查看网卡的收发数据包大小,RX:收,TX:发
ifconfig -s :同上
ip addr add 192.168.112.225/24 dev ens33:临时为ens33网卡添加一个IP地址,systemct1 restart network后消失
ifconfig ens33 192.168.112.225:l临时修改IP地址
ip addr del 192.168.112.225/24 dev ens33:删除一个IP地址
查看路由IP地址:
ip route :route:或netstat -r或route -n
ip route add default via 192.168.112.1:为当前网络添加默认路由(网关)
route add default gw 192.168.112.1:同上
ip route del default via 192.168.112.1:删除路由地址
route del default gw 192.168.112.1:同上
ip route flush cache:刷新路由表
ip link set ens33 up:启动网卡
ifconfig ens33 up:同上,down表示关闭
ss -anl:查看当前系统中的端口占用情况
netstat -anlop:同上
老版本上的工具 | iproute2工具 | 说明 |
---|---|---|
ifconfig | ip addr, ip link, ip -s | 地址及链接配置 |
route | ip route | 路由表 |
arp | ip neigh | 邻居 |
iptunnel | ip tunnel | 通道 |
nameif | ifrename, ip link set name | 网络接口更名 |
ipmaddr | ip maddr | 多播 |
netstat | ip -s,ss, ip route | 多种网络统计数据 |
mii-tool | ethtool | 用mii与网卡自动协商工作状态 |
要使用老版本的命令,必须安装net-tools: yum install net-tools
traceroute命令
Linux :
traceroute www.woniuxy.com:跟踪到达woniuxy.com的所有路由节点和路径,默认支持30个跃点
windows :
tracert www.woniuxy.com:同上
wget命令
wget http://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar. gz
wget -o wordpress.tar.gz http://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
wget -c https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz:断点续传
wget -b https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz:后台下载
对于一个通信过程的分析,首先需要把握5个最基本的数据:
源IP:谁发起的请求,谁就是源,任意一端都可能是源,也可能是目标。
源端口:通常情况下,第一次发起请求的,可以称之为客户端,第一次的目标机,称之为服务器端。
目标IP:通常情况下,目标IP地确定的,并且目标端口也是确定的
目标端口:对于服务器端来说,通常是固定的
协议:事先约定好的规则,http, https, ssh是最为流行的应用层协议,
yum install -y tcpdum
Installing:
tcpdump x86_64 14:4.9.2-4.e17_7.1
Installing for dependencies :
libpcap x86_64 14:1.5.3-12.e17
libpcap是Linux上标准的流量监控的库,大多数流量监控工具都是基于这个底层库进行开发
在windows上,比较知名的是winpcap和npcap
目前市面上主流的防火墙、IDS、IPS、包过滤工具、只要涉及到流量的产品或系统,底层均基于以上这些库
tcpdump -i ens33: 监控ens33网卡上的流量,并输出到终端
tcpdump tcp and dst port 80 -i ens33:只监控当前服务器端的80端口的流量
tcpdump tcp and dst port 80 -i ens33 -w ./target.pcap:将流量保存到target.pcap
tcpdump tcp and dst port 80 -i ens33 -c 100:只捕获100条就自动结束
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个""安全框架"才是真正的防火墙,这个框架的名字叫netfilter。netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。netiter/iptables (下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
iptables是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。当一条网络连接试图在你的系统中建立时,iptables 会查找其对应的匹配规则。如果找不到,iptables将对其采取默认操作。
iptables的结构是由表(tables)组成,而tables是由链组成,链又是由具体的规则组成。因此我们在编写iptables规则时,要先指定表,再指定链。tables的作用是区分不同功能的规则,并且存储这些规则。
五张表: filter, nat, mangle,raw,security:表主要用于将不同的规则存贮在不同的表中
(1 ) filter表:默认表,负责过滤数据包,使用频率最高
(2) nat表:用于网络地址转换(IP、端口)
(3) mangle表:主要应用在修改数据包、流量整形、给数据包打标识
(4) raw表:这个表很少被用到,主要用于配置连接跟踪相关内容,使用频率较少
(5) security表:这个表用于安全Linux的防火墙规则,是iptables最近的新增表,使用频率较少
五条链:
(1 ) input:匹配目标IP是本机的数据包,入站
(2) output:出口数据包,出站
(3) forward:匹配流经本机的数据包,转发
(4) prerouting:修改目的地址,用来做DNAT。如:把内网中的80端口映射到互联网端口
(5) postrouting:修改源地址,用来做SNAT。如:局域网共享一个公网IP接入Internet。
规则:基于防火墙策略设置的各类防护规则,防火墙规则的执行顺序认为从前到后依次执行、遇到匹配的规则就不在继续向下检查、如果遇到不匹配的规则则会继续向下进行。
systemctl stop firewalld
firewalld默认在没有设定规则的情况下,是拒绝所有流量,而iptables默认没有设定规则的情况下,是允许所有流量
yum install iptables iptables-services
iptables -nL:将端口号以数字的形式显示黑认表fi1ter中的规则
iptables -I INPUT -j DROP:所有入站流量全部丢弃,包括SSH请求
iptables -I OUTPUT -j DROP:所有出站流量全部丢弃,包括SSH响应
上述两条命令一旦执行:所有流量无法进来,所有流量无法出去,断网状态
-I 插入到开头 -A跟着
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -p tcp --dport 22 -j ACCEPT:打开目标端口22,接受流经该端口的流量iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p icmp -j REJECT
iptables -I OUTPUT -p icmp -j DROP
DROP:直接丢失数据包,不会向源端做任何回复
REJECT:拒绝接收数据包,并向源端发送拒绝响应
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-request -j REJECT
iptables -I OUTPUT 1 -p icmp --icmp-type echo-reply -j DROP
iptables -L INPUT --line-numbers
iptables -D INPUT 1
iptables -F
service iptables save
cat /etc/sysconfig/iptables
iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT
iptables -I INPUT -s ☆☆☆.☆☆☆.☆☆☆.☆☆☆ -j DROP
iptables -D INPUT -s ☆☆☆.☆☆☆.☆☆☆.☆☆☆ -j DROP
#允许本地访问外部IP地址和端口号,通过设定良名单的方式可以防止本机去访问别的服务器
#通过这种场景的设置,可以最大可能避免反弹she11和挖矿程序去试图通过本地访问目标服务器下载恶意程序或执行恶意指令。
iptables -I INPUT -i ens33 -p tcp -s 192.168.112.153 --sport 8088 -j ACCEPT
iptables -I 0UTPUT -o ens33 -p tcp -d 192.168.112.153 --dport 8088 -j ACCEPT
#防止DDoS攻击,设定一些数据的限制条件
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
#端口转发
#第一种:本机端口转发,比如80端口对外封闭,开放一个45692供外部访问,外部只知道45692,不知道80,可以避免协议猜测
#第二种:远程端口转发,把本机接收到的请求转发到远程电脑和对应端口上(远程可以是本地局域网,也可以是公网服务器)
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 80
#远程端口转发:
#需要确保端口转发功能是启用的
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.conf
iptables -t nat -A PREROUTING -d 192.168.112.188 -p tcp --dport 8888 -j DNAT --to-destination192.168.112.153:8088
iptables -t nat -A POSTROUTING -d 192.168.112.153 -p tcp --dport 8088 -j SNAT --to 192.168.112.188
参数 | 说明 |
---|---|
-A | 添加—条规则,即添加在规则的最后 |
INPUT | 链名、常用、大写 |
PREROUTING | 链名、大写 |
OUTPUT | 链名、大写 |
-l | 指定链中插入规则,即添加到规则最前 |
-s | 指定源地址,可以是IP地址,也可以是网段"192.168.109.10/24"; “-s为空”,表示所有 |
-d | 目标地址 |
-p | 指定协议 |
–dport | 指定主机端口(本机开放或拒绝端口) |
–sport | 指定主机端口(如:禁止连接对方某端口) |
-i | 指定网卡名,表示报文流入的接口 |
-o | 指定网卡名,表示报文流出的接口 |
-j | 指定所需要的操作 |
ACCEPT | 允许 |
REJECT | 拒绝,拒绝提供服务 |
DROP | 拒绝,丢弃数据包不回应 |
–src-range | 源地址范围,(如:拒绝某IP段访问) |
–dsc-range | 目标地址的范围 |
–mac-source | 源主机的mac地址 |
-t | 指定表名,默认是filter查看详细信息 |
-v | 查看详细信息 |
-nvL --line-nurbers | 查看fliter表中规则的顺序 |
-nvL -t mangle | 查看mangle表中的防火墙规则 |
-F | 清空filter表 |
-I | 指定链中插入规则 |
-R | 替换规则 |
-m | 指定模块 |
iptables的功能总结
1、常用的两张表: filter、nat、filter用于过滤数据包,nat用于路由转发功能
2、常用的两条链:INPUT、OUTPUT
3、常见的三个行为:ACCEPT、DROP、REJECT
4、限制流量的三个特征:端口、协议、IP(五元组), -d -s --dport --sport-pc
5、端口转发:本机端口、远程端口
firewalld的基本使用
启动:systemctl start firewalld
查看状态:systemctl status firewalld
停止:systemctl disable firewalld
禁用:systemctl stop firewalld
重启: systemctl restart firewalld
firewalld中,没有表,没有链,没有行文,默认拒绝所有流量
区域
在不同的区域下,可以设置不同的防火墙策略,以便在需要的时候可以实现快速切换,而不需要从O开始配置一套。对于一套服务器环境来说,通常情况下,没有那么多需要去切换。drop.public、其他
drop:丢弃
任何传入的网络数据包都被丢弃,没有回复。只能进行传出网络连接。
block:阻止
任何传入的网络连接被拒绝,其中包含用于IPv4的icmphost-prohibited消息和用于IPv6的icmp6-adm-prohibited。只能从系统内启动网络连接。
public:公共(默认)
用于公共场所。您不相信网络上的其他计算机不会损害您的计算机。仅接受选定的传入连接。
external:外部网络
用于特别为路由器启用伪装的外部网络。您不相信网络上的其他计算机不会损害您的计算机。仅接受选定的传入连接。
dmz:管制区
适用于非军事区中的计算机,这些计算机可公开访问,并且对内部网络的访问权限有限。仅接受选定的传入连接。
work :工作
用于工作区域。您最常信任网络上的其他计算机,以免损害您的计算机。仅接受选定的传入连接。
home:家庭
适用于家庭领域。您最常信任网络上的其他计算机,以免损害您的计算机。仅接受选定的传入连接。
internal :内部
用于内部网络。您最常信任网络上的其他计算机,以免损害您的计算机。仅接受选定的传入连接。
trusted:受信任
接受所有网络连接。
可以将这些区域中的一个指定为默认区域。将接口连接添加到NetworkManager时,会将它们分配给默认区域。安装时,firewalld中的强认区域将设置为公共区域。
配置firewalld-cmd
运行firewall-cmd --list-all查看基础配置信息:
[root@zxgtwy ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:在一个区域中优先处理的高级配置
default:
public (default,active) :表示 public区域是默认区域〈当接口启动时会自动黑认),并且它是活动的。
interfaces : ens33列出了这个区域上关联的接口。
sources:列出了这个区域的源。现在这里什么都没有,但是,如果这里有内容,它们应该是这样的格式xxx,XXX.XXX.xXX/Xxo
services: dhcpv6-client ssh列出了允许通过这个防火墙的服务。可以通过运行firewall-cmd --get-services得到一个防火墙预定义服务的详细列表。
ports:列出了一个允许通过这个防火墙的目标端口。它是用于你需要去允许一个没有在 firewalld 中定义的服务的情况下。
masquerade: no表示这个区域是否允许IP伪装。如果允许,它将允许IP转发,它可以让你的计算机作为一个路由器。
forward-ports:列出转发的端口
icmp-blocks:阻塞的icmp流量的黑名单
rich rules:在一个区域中优先处理的高级配置
default:是目标区域,它决定了与该区域匹配而没有由上面设置中显式处理的包的动作
查看所有打开的端口:firewall-cmd --zone=public --list-port
更新防火墙规则:firewall-cmd --reload
列出所有区域: firewall-cmd --get-zones
查看区域信息: firewall-cmd --get-active-zones
设定认区域,立即生效: firewall-cmd --set-default-zone=public
查看指定接口所属区域: firewall-cmd --get-zone-of-interface=ens33
查看所有规则: firewall-cmd --list-all
通过以下两种手段可以进行永久修改:
firewall-cmd --permanent
firewall-cmd --reload
常见使用场景
拒绝所有包:firewall-cmd --panic-on
取消拒绝状态: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic
暂时开放ftp服务:firewall-cmd --add-service=ftp
永久开放ftp 服务:firewall-cmd --add-service=ftp --permanent
查询服务的启用状态:firewall-cmd --query-service ftp
开放mysql端口: firewal-cmd --add-service=mysql
阻止http端口:firewall-cmd --remove-service=http
查看开放的服务: firewall-cmd --list-services
查看对应规则库文件:cd /usr/ lib/firewalld/services
开放通过tcp访问3306: firewall-cmd --add-port=3306/tcp
阻止通过tcp访问3306: firewall-cmd --remove-port=80/tcp
永久开放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
查看80端口: firewall-cmd --zone=public --query-port=80/tcp
查看所有开放端口:firewall-cmd --zone=public --list-ports
删除80端口: firewall-cmd --zone=public --remove-port=80/tcp --permanent
开放postgresq1服务: firewall-cmd --add-service=postgresql --permanent
允许http服务通过1分钟: firewall-cmd --zone=public --add-service=http --timeout=1m,这个timeout 选项是一个以秒(s)、分(m)或小时(h)为单位的时间值。
重载防火墙: firewall-cmd --reload
检查防火墙状态:firewall-cmd --state
让设定生效: systemctl restart firewalld
检查设定是否生效: iptables -L -n | grep 21 或 firewall-cmd --list-all
富规则
添加指定ip访问特定端口规则:
firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 sourge address=192.168.112.1 port port=80protocol=tcp accept'
删除指定某个ip访问特定端口规则:
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.112.1" portprotoco1="tcp" port="80" accept"
禁止某个ip访问:
iptables -I INPUT -s 138.138.138.138 -jDROP
firewall -cmd --add-rich-rule= 'rule family=ipv4 source address="192.168.112.1" drop'
允许ping:
firewall-cmd --add-rich-rule='rule family="ipv4" protocol value="icmp" source address="192.168.112.1"accept '
与iptables一致:富规则中的动作可以设置为: accept,drop,reject(注意是小写)
端口转发:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
接受192.168.112.0网段所有IP访问SSH服务:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.112.0/24" service name=sshaccept '
直接模式:
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -5 192.168.112.1 -j ACCEPT
"1"表示优先级,数字小优先级高
查看:
firewall-cmd --direct --get-all-rules
端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定ip的话就默认为本机,如果指定了ip却没指定端口,则默认使用来源端口。
如果配置好端口转发之后不能用,可以检查下面两个问题:
比如我将80端口转发至8080端口,首先检查本地的80端口和目标的8080端口是否开放监听了
其次检查是否允许伪装IP,没允许的话要开启伪装lP
#将8888端口的流量转发至80
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
firewall-cmd --remove-forward-port=port=8888:proto=tcp:toport=80
#开启伪装IP
firewall-cmd --query-masquerad # 检查是否允许伪装IP
firewall-cmd --add-masquerade #允许防火墙伪装IP
firewall-cmd --remove-masquerade #禁止防火墙伪装IP
# 将8888端口的流量转发至101.37.65.91的80端口
firewall-cmd --add-forward-port=port=8888:proto=tcp:toaddr=101.37.65.91:toport=80
当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置一个防火墙的端口转发,将流量转发过去。
端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
在Linux中,通常配置文件是在/etc/目录下,所以可以使用find /etc/ -name “*firewall”,另外,Linux下的很多日志信息都保存在/var/log目录下。
在网络安全领域,各类应用系统或操作平台的配置信息和日志信息,是进行安全分析非常重要的参考。
什么是Shell脚本?到底能解决什么问题?Shell脚本其实就是把一批命令集合在一起,解决一些复杂的问题。有点类似于程序设计(在Shel中,变量、分支、循环、函数、数组等与程序设计完全类似的功能),但是本质上来说是不程序设计。Shell的程序复杂度是无法真正与编程语言相提并论的,但是由于与操作系统是集成在一起的,所以能够执行一些更加底层的命令组合,且效率很高。
Shell的类型
命令 | 作用 |
---|---|
Bourne Shell | 是贝尔实验室开发的,Unix普遍使用的Shell,在编程方面比较优秀,但在用户交互方面没有其他Shell优秀。 |
Korn Shell | 是对Bourne Shell的发展,在大部分内容上与Bourne Shell兼容,集成了C Shell和Bourne shell优点。 |
c Shell | 是SUN公司Shell的BSD版本,语法与c语言相似,比bourne shell更适合编程 |
BASH | 是GNU的Bourne Again Shell,是GNU操作系统上默认的Shell,在Bourne Shell基础上增强了很多特性,如命令补全,命令历史表 |
Shell操作
命令 | 作用 |
---|---|
cat /etc/shells | 列出系统中所有的Shell |
ksh/csh/zsh/bash | 切换到其它Shell |
chsh qiang | 使用命令chsh更改用户qiang的默认Shell |
cat /etc/passwd | 查看用户使用的默认的Shell |
echo $SHELL | 查看当前环境变量$SHELL的值 |
Bash基本操作
命令 | 作用 |
---|---|
TAB键 | 命令补全功能(很实用) |
history命令或上下箭头 | 命令的历史记录 |
alias gohome=“shutdown -h now” | 命令别名功能 |
alias myfirewall=“systemctl start firewalld; firewall-cmd --add-port=80/tcp” | 通过设定一个别名来执行长命令 |
crontab | 作业控制功能 |
shell脚本编程 | 非常灵活的脚本编程能力 |
ls;cat /etc/passwd;mount | 三个命令放在一起通过;分隔 |
echo命令
命令 | 作用 |
---|---|
echo “HelloWorld” | 在屏幕上输出Helloworld |
echo “Hello\nWorld” | 在屏幕上输出Hello\nWorld |
echo -e “Hello\nWorld” | 在屏幕上输出Hello World |
\a | 蜂鸣 |
\b | 退格,覆盖前一个字符 |
\c | 不带换行符打印一行 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 制表符 |
\v | 纵向制表符 |
\\ | 反斜杠 |
\0nnn | ASCII码是nnn(八进制)的字符 |
环境变量
环境变量是指当前操作系统预先定义好的一批全局变量,可以用于任意位置的引用。在Linux和Window中,均有环境变量的概念。其中使用频率最高的环境变量是PATH,PATH里面定义了一批文件夹/路径,表示只要是在这个目录下的命令,可以直接在命令行执行,不需要输入完整路径。
命令 | 作用 |
---|---|
set | 显示当前shell的变量,包括当前用户的变量 |
env | 显示当前用户的变量 |
export | 显示当前导出成用户变量的shell变量 |
cat /etc/profile | 全局的环境变量,对任何用户生效 |
cat ~/.bash_profile | 用户主目录下的环境变量,仅对当前用户生效(本地变量定义在此) |
export NAME=Denny | 定义一个NAME环境变量并赋值为Denny |
echo $NAME | 输出一个环境变量的值 |
unset NAME | 删除环境变量 |
echo $USER | 当前登录的用户名 |
echo $UID | 当前登录的用户ID号 |
echo $SHELL | 当前所使用的SHELL |
echo $HOME | 当前用户的主目录 |
echo $PWD | 当前命令行所在的目录 |
echo $PATH | 当前可执行程序的路径(设定了PATH,执行命令就不用输入命令的绝对路径) |
echo $PS1 | 命令的提示字符串(可以试一下export PS1="Welcome Linux#“ |
echo $PS2 | 命令一行未写完时换行提示符 |
普通变量
命令 | 作用 |
---|---|
read NAME Bill Gates | 从终端将值读入并赋值给变量NAME |
echo $NAME | 将变量NAME的值输出 |
read NAME SURNAME Bill Gates | 此时会将BilI赋值给NAME,而将Gates赋值给SURNAME |
cat ~/.bash_profile | 本地变量在此定义,将只对本用户生效 |
NAME=Denny echo $NAME | 在命令行定义变量NAME并取得其值,在shell中定义变量时不能在等号两端加空格,否则会将变量名处理为一个命令,等号是命令的第一个参数 |
SOURCE=/etc/passwd DEST=/opt/learn cp SOURCEDEST | 利用变量代替对应值进行操作 |
NAME=Denny readonly NAME | 设置只读变量,此时变量的值将不能被修改 |
管道及重定向
命令 | 作用 |
---|---|
set | grep USER | 从set的输出中查找包含USER的行 |
ls | wc -l | 根据ls输出的行数来统计该文件夹下的文件数量 |
head /etc/passwd >passwd.txt | 将/etc/passwd文件的输出重定向到文件passwd.txt中 |
tail /etc/passwd>>passwd.txt | 在文件passwd.txt后面累加 |
cat < /etc/passwd | 将/etc/passwd文件作为cat的输入 |
cat < /etc/passwd > passwd2.txt | 将/etc/passwd文件作为cat的输入,并将输出结果重定向到passwd2.txt中 |
ifconfig | tee ifconfig.tee | 将ifconfig的内容输出到屏幕上同时输出到文件ifconfig.tee中 |
ifconfig |tee -a ifconfig.tee | 以追加的方式输出到文件ifconfig.tee中 |
ifconfig 1> ifconfig.out | 标准输出重定向到文件ifconfig.out中 |
ifconfige 1>ifconfig.error | 将标准输出重定向到文件ifconfig.error中,此处由于不存在命令ifconfige,所以ifconfig.error中将没有内容 |
ifconfig 2>ifconfig.error | 标准错误重定向到文件ifconfig.error中,由于此处没有错误,所以ifconfig.error文件中将没有内容 |
ifconfige 2>ifconfig.error | 标准错误重定向到文件ifconfig.error中 |
ls /opt /optt 2> cat.error | 将标准输出输出到屏幕而将标准错误重定向到cat.error中 |
ls /opt /optt 1> cat.error | 标准输出和标准错误─起重定向到一个文件 |
ls /opt /optt 2> ls.err 1> ls.out | 正确的输出和错误的输出分别重定向到不同的文件 |
ls /opt /optt 1> cat.error 2>&1 | 标准输出和标准错误—起重定向到一个文件 |
ls /opt /optt 2> /dev/null | 标准错误信息会输送到系统垃圾箱,而不会输送到屏幕,也不会输出到任何地方 |
命令1&&命令2 | 命令1成功执行后才执行命令2 |
命令1||命令2 | 命令1执行失败后才执行命令2 |
tty | 查看当前终端设备编号 |
编写一个最简单的脚本并保存到/opt/learn/helloworld.sh下
#!/usr/bin/bash
#这是一个最简单的shell脚本
echo "Hello woniuxy ! "
使用如下命令运行helloworld.sh
. helloworld.sh
sh helloworld.sh
bash helloworld.sh
source helloworld.sh
chmod u+x helloworld.sh
./helloworld.sh
传递参数给Shell脚本
命令 | 作用 |
---|---|
echo “Hello,$1,$2 $3” | 程序体输出Hello后面带三个参数的值 |
sh hello.sh Denny Bill Mary | 运行时会输出Hello, Denny,Bill, Mary |
1 | 代表第一个参数 |
2 | 代表第二个参数 |
… | 以此类推,但不能超过9个参数 |
0 | 特殊的,$0表示该Shell脚本的名称 |
引号的特殊用法
命令 | 作用 |
---|---|
echo “$1" | 输出第一个参数的值 |
echo ‘$1’ | 输出$1 |
echo ‘date’ | 输出date |
echo date | 输出当前的时间(注意这里使用的是~下面的那个反引号而不是单引号) |
now=date "+%Y-%m-%d %H:%M :%S " | 格式化输出发时间,同时赋值 |
#在shell中,有三个引号:单引号,双引号,反引号
echo "环境变量的路径为:$PATH"
echo '环境变量的路径为:$PATH'
echo 'date "+%Y-%m-%d %H : %M : %S" '
echo `date "+%Y-%m-%d%H : %M : %S"`
now=`date "+%Y-%m-%d %H:‰M:%S"` # dat命令的执行结果赋值给变量now,也需要使用反引号echo $now
单引号 '
由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。
双引号 "
由双引号括起来的字符,除$、倒引号(`)和反斜线(\)仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换,即用其后指定的变量的值来代替$和变量;倒引号表示命令替换;仅当“\”后面的字符是下述字符之一时,“\”才是转义字符,这些字符是:“$”、“`”、“””、“\”或 换行符。转义字符告诉Shell不要对其后面的那个字符进行特殊处理,只是当作普通字符。
反引号 `
反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(')混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
特殊变量
命令 | 作用 |
---|---|
$# | 传递到脚本的参数个数 |
$0 | 脚本的名称 |
$* | 以一个单字符串的形式显示所有向脚本传递的参数,与位置变量不同,此项参数可超过9个 |
$$ | 脚本运行的当前进程id号 |
$! | 后台运行的最后一个进程的进程id号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$? | 显示最后命令的退出状态,0表示正确,其他任何值表示错误特别的:在脚本中可自定义0~255的退出状态码 |
$_ | 代表上一个命令的最后一个参数 |
理解* 和 @ 的区别:
sh hellowor1d.sh 11 22 33 44 55 66
echo"使用$*的结果为:$*""
echo"使用$ 的结果为:$@"
上述脚本得到的结果是:
使用$ *的结果为: 11 22 33 44 55 66,#其结果是所有参数构成一个字符串: "11 22 33 44 55 66"
使用$ @的结果为: 11 22 33 44 55 66,#是给每一个参数单独加上引号:"11""22”"33"“44""55""66"
expr表达式
命令 | 作用 |
---|---|
expr 10 +10 | expr为一个手工计算器,此处会输出20(注意空格) |
expr 10+10 | 此处会输出10+10 |
expr 10.1 +1 | expr不能处理小数 |
expr “hello” = “hello” | 成功返回1,失败返回0 |
命令 | 作用 |
---|---|
test -e /etc/passwd | 测试文件/etc/passwd是否存在,存在则$?返回0,否则返回1 |
[ -e /etc/passwd ] | 与test -e /etc/passwd作用一样,注意空格 |
-d file | 如果文件为一个目录,则为真 |
-e file | 如果文件存在,则为真 |
-f file | 如果文件为一个普通文件,则为真 |
-r file | 如果文件可读,则为真 |
-w file | 如果文件可写,则为真 |
-x file | 如果文件可执行,则为真 |
-s file | 如果文件的长度不为零,则为真 |
-L file | 如果文件为符号文件,则为真 |
逻辑处理
命令 | 作用 |
---|---|
[ -e letc/passwd -a -r/etc/passwd] | 逻辑与,操作符两边均为真,结果为真,否则为假 |
[ -e letc/passwd -o -r /etc/passwd] | 逻辑或,操作符两边一边为真,结果为真,否则为假 |
[ ! -e /etc/passwd ] | 逻辑否,条件为假,结果为真 |
test字符串
命令 | 作用 |
---|---|
[ $USER = "root” ] | 字符串比较 |
[ "$USER”= “root” ] | 建议使用此方式 |
= | 等于 |
!= | 不等于 |
-z | 为空字符串 |
-n | 非空字符串 |
test数值
命令 | 作用 |
---|---|
[ $$-eq 18646] | 对数值的测试 |
-eq | 数值相等 |
-ne | 数值不相等 |
-le | 第一个数小于等于第二个数 |
-ge | 第一个数大于等于第二个数 |
-gt | 第一个数大于第二个数 |
-lt | 第一个数小于第二个数 |
if 或 elif 后面跟的条件,事实上是一条可执行的程序,判断的依据是该程序是否执行成功
if 条件
then
命令
fi
如果脚本的参数个数少于3个,则提示用户需要3个参数:
if [ $# -lt 3 ]
then
echo "sorry, it needs 3 args"
fi
if 条件; then
命令
fi
if 条件; then
命令1
else
命令2
fi
提示用户输入他的账号,并显示欢迎信息,如为空则提示:
echo "please input your name : "
read NAME
if [ "$NAME"=""]; then
echo "Your name is null"
else
echo "welcome,$NAME"
fi
if 条件1 ; then
命令1
elif 条件2; then
命令2
else
命令3
fi
如果用户输入的帐号为空,则提示,否则如果帐号在/etc/passwd中能找到,则欢迎,否则拒绝服务:
echo "Please input your name : "
read NAME
if [ "$NAME" =""]; then
echo "Your name is null"
elif grep $NAME /etc/passwd > /dev/null ; then
echo "welcome,$NAME"
else
echo "sorry,$NAME"
fi
用grep查找进也可按查找到的具体行数进行判断:grep -c ^$NAME /etc/passwd
$num=$1
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "saturday"
;;
7)
echo "sunday"
;;
*)
echo "error"
esac
for 变量名 in 列表
do
命令
done
以脚本的参数作为循环依据,将参数输出
#for loop in 1 2 3 4 5 6
for loop in "$@"
do
echo $loop
done
统计出某个目录下有多少个文件:
counter=0
for file in `ls`
do
counter=`expr $counter + 1` # 也可以使用let counter+=1
done
echo "There are $counter files in `pwd` "
--注意变量counter赋值时等号前后不能有空格,否则会认为counter是一个命令
练习:
1、运算所有脚本参数的乘积,如果参数中包含0,则提示用户
2、求1~~100之间的所有整数和
((a++))运算赋值常用
for i in {1..100}
while 条件
do
命令
done
根据参数1决定循环次数,并将每次结果输出:
i=0
while [ $i -lt $1 ]
do
echo "Hello,$i"
i=`expr $i +1`
done
从某文件中一行一行读取内容,并将其加上行号输出:
line=1
while read FILE
do
echo "$line: $FILE"
line=`expr $line + 1`
done < /etc/group
从某文件中一行一行读取内容,并将其中用空格或者TAB分隔的内容按列输出:
Data文件为:
NAME EMAIL PHONE
Denny [email protected] 12345678
Qiang [email protected] 45678900
Angel [email protected] 087y8438
代码为:
line=0
while read NAME EMAIL PHONE
do
line=`expr $line + 1`
if [ $line -eq 1 ]
then
continue
fi
echo "----$line----"
echo "$NAME"
echo "$EMAIL"
echo "$PHONE"
done < $1
以下代码如果用break,则只会输出1,2,3,4,如果用continue,则只有5不会输出
i=0
while [ $i -lt 10 ]
do
i=`expr $i + 1`
if [ $i -eq 5 ]; then
#continue
break
fi
echo $i
done
函数的作用
函数可以将一个专门的功能进行封装,用于解决一个特定的问题,并且可以通过传递不同的参数给某个函数,实现处理不同数据的能力。函数的参数跟脚本的参数比较类似。
函数的使用
函数名,参数,返回结果,其中函数名是必须的,参数和返回结果可选,根据需要进行处理
function函数名()
{ .... }
或
函数名()
{ 命令1 }
示例:
#定义一个函数
function add(){
let sum=$1+$2
echo $sum#函激的返回结果,注意,不是使用return 0
}
#调用add函数
#result=`add 100 200` #要将函数的输出结果赋值给某个变量,使用反引号或$()
result=$ (add 100 200)
echo "result的结果为: $result"
在上述示例中,在调用函改add 100 200时s类似于命令的参数传递,并且在函数体中也是使用$1,$2的取值方式,没有编程意义上所谓的形参和实参一说。
几个特殊的关于括号的用法
1、(())双圆括号,用于运算,可以代替expr
2、${} 可以取特定参数或变量的值,比如${1},${username}
3、$() 可以代替反引号执行圆括号中的命令
4、$[] 用于整数运算,可以代替expr
检查参数是否是一个目录(注意此处参数的调用)
function is_directory {
if [ -d $1 ]; then
echo "Great , $1 is a directory ... "
else
echo "sorry,$1 is not a directory ..."
fi
}
echo "check if the input is a directory.."
is_directory $1
echo "check end ..."
function myfunc(){
i=$1
j=$2
echo `expr $i \* $j`
}
result= `dyfunc 59 100`
if [ $result -lt 6000 ] ; then
echo "Too Low"
else
echo "Great"
fi
写一个脚本,实现创建目录的功能,目录的名称由用户给出,需要对如下情况进行判断处理:
(1)用户没有给出参数,提示脚本用法
(2)用户给出的目录名称是否存在,如果存在,则提示存在并退出脚本,否则询问用户是否需要重新创建:如果Y,则创建目录,否则,退出脚本
(3)目录创建成功或者失败,都给出说明信息
DIRECTORY=$1
if [ $# -lt 1 ]
then
echo "Usage: `basename $0` dirname"
exit 1
fi
if [ -d $DIRECTORY ]
then
echo "Directory is existent"
else
echo "The $DIRECTORY doesn't exist"
echo -n "Create it now?[y...n]: "
read ANS
if [ "$ANS" = "y" ]||[ "$ANS" = "Y”]
then
echo "creating now ..."
mkdir $DIRECTORY >/dev/null 2>&1
if[$? -eq 0 ]
then
echo "create directory $DIRECTORY successfully ...""
else
echo "Failed to create direcotory SDIRECTORY""
exit 1
fi
fi
fi
在Bash中,可以采用显示的delare -a variable语句引入整个数组。
如: declare -a weekday
weekday[O]=sunday
weekday[1]=Monday....
输出数组中的所有元素:${weekday[@]},输出某一元素${weekday[1]}
使用#字符求取整个数组有多少个元素: echo ${#weekday[@]}或echo ${#weekday[*]}
还可以使用#号求取数组元素的长度:echo $ {#weekday[0]},将输出6。
unset命令可以删除数组元素,甚至整个数组。如:
unset weekday[1],将去除weekday[1]的值。
unset weekday,将去除数组weekday所有元素的值。
通过赋值语句可以实现数组的复制,如:
array2="${array1[@]]”或array2=("$array1[@]}")
declare -a weekday
weekday[1]=Monday
weekday[2]=Tuesday
weekday[3]=wednesday
weekday[4]=Thursday
weekday[5]=Friday
weekday[6]=Saturday
weekday[7]=sunday
echo "This week has ${#weekday[*]} Days"
echo "${weekday[@]}"
for day in 1 2 3 4 5 6 7
do
echo ${weekday[day]}
done
另外一种简便的数组定义方式:
weekday=(Monday Tuesday wednesday Thursday Friday Saturday Sunday)
echo ${weekday[1]}
也可以按照以下方式进行遍历:
for day in ${weekday[@]}
do
echo ${day}
done
#每5秒钟向文本中输出一次时间
#for i in {1..10}; do
while [ 1 -eq 1 ]; do
date "+%Y-%m-%d %H:%M:%S" >>/opt/learn/date.txt
date "+%Y-%m-%d %H:%M:%S"
sleep 5
done
命令实例 | 作用 |
---|---|
crontab | 每个用户都可以有一个crontab文件来保存调度信息,通过该命令运行任意一个shell脚本或者命令 |
/var/spool/cron | 保存所有用户的crontab文件 |
/etc/cron.deny /etc/cron.allow | 系统管理员可以通过cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的crontab文件(cron.allow需要自己新建) |
crontab的域 | * * * * *command 第1列分钟059第2列小时023(0表示子夜)第3列日131第4列月112第5列星期0~6(0表示星期天)第6列要运行的命令 |
常用规则 | *:匹配任何值 */n:匹配每n个单位(从起始值算起的每n个单位) x:匹配x x-y:匹配从x-y的值x,y,z:只匹配x, y,z三个值 |
crontab [ -u user ] -e -l -r | -u用户名-e编辑crontab文件-l列出crontab文件中的内容-r删除crontab文件 |
systemctl start/stop crond | 启动停止crond进程,如crond进程停止,则不会有任务被自动执行 |
不发送邮件 | 在crontab -e中编辑任务时,在第一行添加:MAILTO=“”,则不会发送邮件,可以通过/var/log/cron查看执行的日志 |
提示:编写定时任务时,确定好定时规则后,要执行的指令建议直接写在Shell脚本中,让Cron直接执行该脚本即可,尽量避免在定时规则文件中直接调用命令,比如
*/1* * * * /opt/learn/crondate.sh
一定要确保Shell脚本是有执行权限的,并且在Cron文件中指定的是绝对路径。
命令实例 | 作用 |
---|---|
at | 单次定时任务,yum install at -y; systemctl start atd; |
at时间 | 指定某一特定时间去做某件事情 |
at HH:MM | at 16:00 |
at HH:MM YYYY-MM-DD | at 16:00 2009-10-11 |
at now +5 minutes | 从现在开始的5分钟后 |
如何退出at编辑模式 | Ctrl+D |
atq | 查询现有任务 |
atrm id | 删除某个任务 |
command & | 后台运行,如有输出,则会输出到前台 |
nuhup command & | 后台运行,所有输出将会转存到nohup.out文件中 |
sleep n | 让Shell脚本暂停n秒 |
usleep n | 让shelI脚本暂停n钠秒 |
time command | 计算某一个命令或者脚本运行时花的时间(精确到毫秒):如: time ls (ls这个命令所花的时间) time sh myshell.sh(运行myshell.sh这个脚本所花的时间) |
利用Crontab来判断Web服务器是否可用,如果不可用,则自动启动,并且将过程的操作写入到日志文件中。一个站点如果无法访问,可能的原因有两个:
(1) Web服务器没有正常启动:如何使用Shell进行判断?
使用curl直接访问对应网页,如果成功,则$?为0,否则非O
使用netstat -ant | grep :80进行查询,如果端口被打开,则$?为0,表示成功启动80端口
也可以使用ps -ef 查询对应的进程
(2)防火墙没有允许80端口通过:让Shell执行firewall-cmd添加端口通过的命令即可。
firewall-cmd --list-port | grep 80
完成上述特征的识别后,在Shell中编写脚本,并让Cron定时执行。
curl http://192.168.157.188/dashboard/phpinfo.php > /dev/null
if [ $? -ne 0 ]; then
/opt/lampp/lampp start
echo "检测到lampp没有启动,已经完成启动 - "`date "+%Y-%m-%d %H:%M:%S"` >> /opt/learn/site _check.log
fi
firewall-cmd --list-port | grep 80
if [ $? -ne 0 ]; then
firewall-cmd --add-port=80/tcp
echo "检测到80端口没有通过,已经完成添加 - "`date "+%Y-%m-%d %H:%M:%S"` >> /opt/learn/site_check.log
fi
假设有变量url="http://www.woniuxy.com/index.html",以下用法及结果输出
*// 从左边开始删除第一个 / /号及左边的所有字符:
echo ${url#*//} 输出结果:www.woniuxy.com/index.html
##*/表示从左边开始删除最后(最右边)一个/号及左边的所有字符:
echo ${url##*/} 输出结果:index.html
%/*表示从右边开始,删除第一个/号及右边的字符:
echo ${url%/*} 输出结果:http://www.woniuxy.com
%%/*表示从右边开始,删除最后(最左边)一个/号及右边的字符:
echo ${url%%/*] 输出结果:http:
假设有变量: phone="18812345678",利用 : 进行字符串截取:
echo ${phone:0:5] 从第1个位置开始往后截取5个字符,输出为:1881217
echo ${phone:6} 从第7个位置开始往后直到结束,输出为:4567818
echo ${phone:0-7:5] 从右边第7个字符开始,截取5个,输出为:2345619
echo ${phone:0-7} 从右边第7个字符开始,直到结束,输出为:234567820
echo ${#phone} 取得phone的字符数量,即字符串长度
对文本进行逐行处理的编程语言,它来源于3个创作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan,与sed和grep很相似,awk是—种样式扫描与处理工具,但其功能却强于sed和grep。
awk 选项 处理逻辑 文件或文本
echo "Hello woniuxy welcome chengdu" | awk '{print $2}’
#按照空格隔开,并输出第2列的内容: woniuxy
echo -e "Hello woniuxy welcome chengdu\nA B C D" | awk '{print $2}'
woniuxy
B
从awk的处理视角来看,任意一段文本,均可以按照行列〈二维表〉的形式进行理解
要有列的视角,分隔符至关重要
echo "http://www.woniuxy.com/index.html" | awk '{print $2}' #无第2列
echo "http://www.woniuxy.com/index.html" | awk -F . '{print $2}' # woniuxy
echo "http://www.woniuxy.com/index.html" | awk -F / '{print $3}'
# www. woniuxy. com
echo "http://www.woniuxy.com/index.html" | awk -F [/.] '{print $3}’
# www,同时以/和.作为分隔符
查找/etc/passwd下面第一个域为root的行并将其第一个域打印出来(-F ︰表示以冒号分隔域)
awk -F : '$1~/root/ {print $1}' /etc/passwd
通过_ping www. woniuxy.com -c 1结合awk或其他已经学习过的知识,输出woniuxy.com的IP地址〈不能有其他内容)
ping www.woniuxy.com -c 1 | grep ^PING | awk -F [\(\)] '{print $2}'
ping www.woniuxy.com -c 1 | grep icmp_seq | awk '{print $4}'
ping www.woniuxy.com -c 1 | awk '$4~/A[0-9]*1.[0-9]*\./ {print $4}'
#如果没有规则可以grep的情况下,则head和tail联合使用来定位具体的行
ping -c 1 www. woniuxy.com | head -n 2 | tail -n 1
查找/etc/passwd中不包含root的行并统计一个有多少行
awk -F : 'BEGIN {sum=0} $0!~/root/ {sum+=1} END {print sum} ' /etc/passwd
文件/etc/passwd中如果第一个域包含root则打印它,否则打印第三个域的值
awk -F : '{if ($1=="root") print $1; else print $3}' /etc/passwd
打印文件中不包含bin或者root的行((特别的$0表示整行)
awk -F : '$0!~/ (bin|root)/' /etc/passwd34
查找进程中包含yes的进程并打印出其cpu使用率
top -d 1 | awk '$0~/yes/ {print $10}'
ps -aux|sort -k 3 -r |head -n 5|awk '{printf "%-10s %-10s\n",$2,$3}'
cpu='top -n 1 | grep "^%Cpu" | awk -F " " '{print int($8)}'
sed可依照脚本的指令来处理、编辑文本文件。
sed的基本用法
常用的三个选项:
常用的6个动作:
示例
head /etc/passwd > test.txt 先准备一份简单的文本文件
sed '5a Hello woniu' test.txt 在第5行后面添加 He11o woniu 的新行
sed '5i Hello chengdu ' test.txt 在第5行前面添加He11o chengdu的新行
sed '2d' test.txt 删除第2行
sed '2,5d' test.txt 删除第2行到第5行
sed '3,$d' test.txt 删除第3行到最后
sed '2,5c Goooooood' test.txt 将第2行到第5行的内容替换为Goooooood
sed -n '/root/p' test.txt 搜索包含r oot的行
sed '/root/d' test.txt 删除所有包含root的行
sed 's/要被取代的字串/新的字串/g' 搜索并进行替换,支持正则表达式,其中 g代表全局替换,可以不加,按行找第一个
sed -e '' -e '' -e '" 多点编辑
sed -i '4a He1lo' test.txt 直接修改文件,永久生效
系统的性能指标监控是比较常见的针对系统的管理场景,比如系统有挖矿程序,或者系统本身存在高CPU进程(正常应用),除了CPU之外,也可以监控内存,硬盘,网络流量等使用情况。通过监控和发送通知,可以及时对系统的运行情况进行把控进而实现正确的处置。如果发现某些异常CPU消耗,甚至可以直接结束掉进程。
(1)通过相应的命令能够输出需要的指标
(2)通过awk对输出结果进行过滤,找到对应的值。
(3)根据对应的值进行判断,进而决定后续处理方式。
#获取总的CPU使用率并转化为整数用于后续判断
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 / 4 | bc #计算单核CPu的使用率,与总cpu使用率才有可比性
pid=ps aux |sort -k 3 -r | head -n 2 |tail -n 1 | awk '{print $2}'
#获取消耗CPU最多的进程ID
#如何搜集内存使用信息
top -n 1 | grep "^KiB Mem” | awk '{print $6}'
或者使用free 也可以采集内存使用情况
#如何搜集硬盘使用信息
df -h | grep ^/dev/mapper
#网络流量
ip -s link
cpu=$(top -n 1 | grep ^%Cpu | awk '{print int($8)}')
if [ $cpu -lt 75 ]; 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%"
else
echo "CPU is OK"
fi
安装mailx邮件客户端
yum install mailx
早期的邮件客户端通常使用sendmail来发送邮件,而新版本上使用的是postfix进行邮件的发送和接收。在Linux中,只要配置好邮件客户端及SMTP账号后,不仅可以向当前系统的任意账号发送内部邮件,即我们看到的/var/spool/mail/user的文本型邮件,也可以向外网正常的邮箱地址发送邮件,如向[email protected]发送邮件。
向本地系统用户发邮件
systemctl start postfix #先确保postfix邮件发送服务启动
echo "This is email body" | mail -s "test email" root #直接使用管道发送简单邮件正文
mail -s "test email" root < /etc/passwd #直接使用输入重定向的方式读取一个文件内容作为正文
cp /dev/null /var/spoo1/mail/root #先清空邮件
使用mail命令可以直接查看邮件,输入序号查看邮件正文,输q退出,输入 h回到邮件列表
向外部邮箱地址发邮件
(1)确定邮件账号的SMTP信息,使用QQ邮箱账号。
(2)编辑/etc/mail.rc,将上述SMTP信息输入
set [email protected]
set smtp=smtp.qq.com
set [email protected]
set smtp-auth-password=fasdfasdfas
set smtp-auth=login
(3)使用以下命令发送邮件
mail -s "test email" [email protected] < /etc/passwd
mail -s "test email" -a /opt/picture.png [email protected] < /etc/passwd
#带附件
mail -s "Beautiful Picture" -a /opt/cccc.jpg [email protected] < /etc/shadow
#发送图片
https://github.com/akopytovlsysbench
安装:
curl -s https://packagecloud.io/insta11/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
执行:
sysbench cpu run --threads=20 --time=100
sysbench memory run --threads=20
判断一个文件是否被篡改:可以使用md5sum 命令记录文件的md5的数字指纹。md5是一种摘要算法,是不可逆的加密,主要用于标识某个文件是否被篡改,或者用于保存密码。可以针对任意文件类型进行摘要。
在安全的状态下,针对敏感文件生成基线摘要数据,保存起来,下一次,再根据当前最新的文件状态生成一次,两次进行对比,可以知道是否被篡改。(潜在的风险:基线数据也被篡改,解决方案:离线保存)
另外,针对文本型文件,还可以继续深入,去比较哪些内容被篡改了。
cd /opt
mkdir baselearn
cd baselearn/
cp ../learn/* ./files/
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 learn.md5.base
md5sum -c --quiet learn.md5.base > learn.diff#将对比失败的文件信息保存到learn.diff
[root@zxgtwy baselearn]# diff /opt/learn/date.txt /opt/baselearn/files/date.txt
2d1
<2021-08-18 15:44:06
[root@zxgtwy baselearn]# diff /opt/baselearn/files/date.txt /opt/learn/date.txt
1a2
>2021-08-18 15∶44:068
比较两个文件内容的不同之处:
d 代表删除 a 代表新增 c 代表修改
#如何检测被检测目录下有新的文件
diff /opt/learn/ /opt/baselearn/files/
diff /opt/learn/ /opt/baselearn/files/ | grep ^diff | awk '{print$2}’
#列出内容发生变化的文件名
diff /opt/learn/ /opt/baselearn/files/ | grep ^Only
#列出文件新增或删除的信息
#继续基于上述信息,通过sed进行替换,拼接出完成的文件名
diff /opt/learn/ /opt/baselearn/files/ | grep ^Only | sed -e 's/Only in //g' -e 's/://g'
diff /opt/learn/ /opt/baselearn/files/ | grep ^只在 | awk '{print $3}' | sed -e 's/ 存在://g'
#安装Docker:
1.安装网络相关命令: yum install nqt-tools
2.安装实用工具: yum install -y yulutils device-mapper-persistent-data lvm2
3,添加yum镜像: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum缓存:yum makecache fast
5.安装docker-ce: yum -y install docker-ce
6.启动docker服务: systemctl start docker,对应的还有stop,restart等
7.查看docker信息: docker info
8.查找centos可用镜像: docker search centos
9,镜像仓库地址: https://hub.docker.comhttps://hub.daocloud.io
10.注意事项:建议在centos 7版本上安装Docker,确保有足够的硬盘空间,确保内存和cPt资源足够。
11.查看Docker服务,systemctl list-unit-files | grep docker,如果显示disabled,说明Docker服务不会随操作系统的启动而自动启动。systemctl enable docker
1.搜索镜像: docker search hello-world
2.拉取镜像: docker pull hello-world,默认情况下,会拉取最新版本镜像,如果需要拉取指定版本,则必须指定Tnc标签。
3.运行镜像: docker run hello-world
4.查看镜像: docker images
5.查看容器: docker ps, docker container ls -a
6.启停容器: docker start/stop/restart hello-world(容器名)
7.删除容器: docker rm 容器名 (可通过container ls -a查看)
8.删除镜像: docker rmi hello-world
1.从docker hub上拉取镜像: docker pull mysql:5.6.46
2.从daocloud上拉取镜像: docker pull daocloud.io/library/mysql:5.6.22
3,创建一个容器,并指定容器名称和主机名: docker create --name mysq1-5.6 -h mysq156 daocloud.io/library/mysq1:5.6.22(可以理解为复制了一台虚拟机过来)
4.列出所有容器: docker container ls -a
5.查看目前正在运行的容器: docker ps
6,启动容器: docker start mysql-5.6(可以理解为启动了一个虚拟机的概念),此时可通过docker ps查看容器启动状态
7.重新创建并启动: docker run --name mysql-5.6 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.6.22
8.删除一个容器: docker rm mysql-5.6
9.添加端口映射:
/var/lib/docker/containers/ [hash_ of_the_container]/hostconfig.json修改为:"PortBindings":("80/tcp";[ { "HostIp":"", "HostPort" :"8080"}]}
并确认:ExposedPorts":{"3306/tcp":{}} 在config.v2.json文件中。
10.停止容器: docker stop mysql-5.6,重启docker服务: systemctl restart docker,重启容器。
rld ↩︎