Linux笔记

Linux应用领域

  • Linux下部署项目
    Java EE 大数据 Python PHP C/C++ GO

  • Linux运维工程师

  • Linux嵌入式工程师

  • 个人桌面领域的应用

  • 服务器领域
    linux在服务器领域的应用时最强的
    linux免费、稳定、高校等特点在这里得到了很好的体现,尤其在一些高端领域尤为广泛

  • 嵌入式领域
    机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居

Linux概述

如何读?黎纽克斯

linux时一个操作系统,我们使用的过程中都会用到做应用的部署

常见的操作系统 Windows、IOS、Windows、Android、MacOS、Linux

吉祥物?企鹅

VMware虚拟机安装

CentOS7.X安装

网络连接的三种模式

桥接模式

NAT模式

XX模式

虚拟机克隆

如果你已经安装了一台linux操作系统,你还想要更多的,没有必要在重新安装,你只需要克隆就可以了

  • 方式一:直接拷贝一份安装好的虚拟机文件
  • 方式二:使用vmware的克隆操作
  • 注意,克隆时,需要先关闭linux系统

虚拟机快照

如果你在使用虚拟机操作的时候,你想回到原先的某一个状态,也就是说你担心可能有些失误的操作造成系统异常,需要回到原先某个正常运行的状态,wmare也提供了这样的功能,就叫快照管理。

  • 安装好系统之后,先做一个快照A
  • 进入到系统,创建一个文件夹,在保存一个快照B
  • 回到系统刚刚安装好的状态,即 快照A
  • 试试看,是否还能再次回到快照B

虚拟机的迁移和删除

虚拟系统安装好了,它的本质就是文件(访问文件夹的),英雌虚拟系统的迁移很方便,你可以把安装好的虚拟系统这个文件夹整体拷贝u哦这剪切到另外位置使用,删除也很简单,使用wmare进行移除,在点击菜单 => 从磁盘删除即刻,或者直接手动删除虚拟系统对应的文件夹即可。

vmtools

vmtools安装后,可以让我们在windows下更好的管理虚拟机

可以设置windows和centos的共享文件夹

安装vmtools的步骤

  • 进入centos
  • 点击vm菜单的 => instakk wmware tools
  • centos会出现一个vm的安装包,xx.tar.gz
  • 拷贝到/opt
  • 使用解压命名tar,得到一个安装文件 cd /opt 进入到opt目录  tar -zxvg xx.tar.gz
  • 使用该vm解压的目录,/opt目录下
  • 安装./vmware-install.pl
  • 全部使用默认设置即可,就可以安装成功
  • 注意:安装vmtools,需要有gcc

Linux目录结构

  • Linux的文件i系统采用该层级方式的目录结构,在此结果中最上层时根目录,然后子啊此目录下在创建其他目录
  • 深刻理解linux树状目录时非常重要的
  • 在linux的世界里,一些皆为文件

目录结构:

  • root root用户用到的文件 一般的用户进入不到此文件夹
  • boot 启动系统的核心文件,如果把这个文件夹删除,则系统会无法启动
  • dev 设备管理器 linux会将硬件映射成一个文件来管理
  • home 系统中所有的用户 比如  有一个用户andu 则/home/andu就有此文件夹
  • bin 存放常用的命令
  • sbin Super Bin 存在的时管理员使用的系统管理程序
  • etc 所有的系统管理所需要的配置我呢见和子目录 my.conf
  • lib 系统卡机所需要最基本的动态连接共享库
  • usr 用户的横夺应用程序和文件都放在这个目录下,类似于Windows下的Program Files目录下
  • proc 虚拟目录,它是系统内存的映射, 访问这个目录来获取系统信息
  • srv server做些,该目录存在一些服务启动之后需要提取的数据
  • sys 这是linux2.6内核的一个很大的变化,该目录下安装了2.6内核中新出现的一个文件系统sysfs
  • tmp 存在一些临时文件的
  • media linux系统会自动识别一些设备,例如U盘、、光驱、当识别后,linux会把识别的设备挂载到这个目录下
  • mnt 系统提供该目录时为了让用户零食挂载别的文件系统的,我们可以将外部的储存挂载在/mnt上,然后进入该目录就可以查看里面的内容了
  • opt 这是给主机额外安装软件所摆放的目录,如安装Oracle数据库就可以放在该目录下,默认为空
  • usr/local 这是另一个给主机额外安装软件所安装的目录,一般时通过编译源码方式安装的程序
  • var 这个目录中存放着不断扩充着的东西,习惯将经常背修改的目录放在这个目录下,包括各种日志文件
  • selinux SELinux是一种安全子系统它能控制程序只能访问特定文件,有三种工作模式,可以自行设置

远程登录

公司实际开发中,具体的应用场景时这样的

  • linux服务器时开发小组共享的
  • 正式上线的项目时运行在公网
  • 因此程序员需要远程登录到Linux服务器上面进行项目管理
  • 远程登录客户端有XShell,XFtp,MobaXterm,使用方式都差不多

远程文件传输

使用XFtp或者MobaXterm

vi/vim快熟入门

Linux系统会内置vi文本编辑器

Vim具有程序编辑的能力,可以看作时vi的增强版本,可以主动的以字体的颜色辨别语法的正确性,方便程序设计,代码补全。

  • 正常模式
    以vim打开一个档案可以直接进入一般模式(这里时默认的模式)。在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理档案的内容,也可以使用【复制、粘贴】来处理你的文本数据。
  • 插入模式
    按下i、I、o、O、a、A、r、R、等任何一个字母之后才会进入编辑模式,一般来说按i比较常用
  • 命令行模式
    当前在编辑模式下,先按ESC,在输入:(冒号)输入需要执行的命令即可,在这个模式中,可以提供你相关的命令,完成读取、存盘、替换、离开vim、显示行号等的动作,则时在模式中达成的!

使用vim开发一个Hello.java程序:

1
2
3
4
5
public class Hello{
public static void main(String[] args){
System.out.println("Hello World!");
}
}

vim的快捷键

在命令行下输入vim 文件名进入正常模式,

如果需要进入编辑模式就按i,然后就可以写内容了

写完之后需要进入命令模式,先按ESC,在输入:冒号,冒号后面紧接着命令,即可完成整个流程。

(:wq保存并退出 :q退出 :q!强制退出并且不保存)

如无特殊说明,则为 一般模式

  • 拷贝当前行yy,拷贝当前行向下的5行,5yy,并粘贴 p
  • 删除当前行dd,删除当前行向下的5行,5dd
  • 在文件中查找某个单词【命令行模式下 /关键字,回车 查找,输入n就是查找下一个】
  • 设置文件的行号,取消文件的行号【命令行下:set nu和:set nonu】
  • 编辑/etc/prfile文件,使用快捷键到该文档的最末行[G]和最首行[gg]
  • 在一个文件中输入”hello”,然后又撤销这个动作 u
  • 编辑/ect/profile文件,并将光标移动到20行 shift + g

开启、重启和用户的登录、注销

shutdown -h now 立刻继续宁关机

shuedown -h 1 1分钟之后关机

shutdown -r now 现在重新启动计算机

halt 关机,作用和上面一样

reboot 现在重新启动计算机

sync 把内存的数据同步到磁盘

注意事项:

1、不管是重启系统还是关系系统,首先要运行sync命令,把内存中的数据写入到磁盘中

2、目前的shutdown、reboot、halt等命令已经在关机前进行了sync。

登录注销:

1、登录时尽量少用root账号登录,因为它是系统管理员,最大的权限,避免操作失误,可以利用普通用户登录,登录后在使用”su - 用户名”来切换成系统管理员身份

2、在提示符下输入logout即可注销用户

使用细节:logout注销指令在图形运行级别无效,在指令运行级别有效

Linux用户管理

Linux是一个多用户多任务的操作系统,任何一个要使用系统i资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统

添加用户

useradd 用户名

1、当创建用户成功后,会自动的创建和用户名的home目录

2、也可以通过useradd -d 指定目录,新的用户名,给新创建的用户指定home目录。

useradd andrew 自动会在/home/andrew创建一个andrew文件夹

指定/修改密码

passwd 用户名

如果不指定用户名就会给当前的用户修改密码!!!

passwd andrew

删除用户

userdel 用户名

1、删除用户andrew,但是要保留/home/andrew目录(默认)

2、删除用户以及主目录 userdel -r andrew

一般情况下,建议保留用户的home目录

查询用户信息

id 用户名

切换用户

在操作Linux中,如果当前用户的权限不够。可以使用su - 指令,切换到高权限用户,比如root

su - 用户名

1、从权限高用户切换到权限低得用户,不需要输入密码,反之需要

2、当需要返回到原来得用户时,使用exit/logout指令

查看当前用户/登录用户

whoami/ who am I

用户组

类似于角色,系统可以对有共性得多个用户进行统一的管理

新增组

groupadd 组名

删除组

groupdel 组名

增加用户时直接加上组

useradd -g 用户组 用户名

修改用户的组

usermod -g 用户组 用户名

用户和组相关文件

  • /etc/passwd文件
    用户(user)的配置文件,记录用户的各种信息
    每行的含义:用户名:口名:用户标识号:组标识号:注释性描述:主目录:登录Shell
  • /etc/shadow文件
    口令的配置文件
    每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不阔东时间:失效时间:标志
  • /etc/group文件
    组(group)的配置文件,记录Linux包含的组的信息
    每行含义:组名:口令:组标识号:组内用户列表

运行级别

运行级别说明:

  • 0:关机
  • 1:单用户(找回丢失密码)
  • 2:多用户状态没有网络服务
  • 3:多用户状态有网络服务
  • 4:系统未使用保留给用户
  • 5:图形界面
  • 6:系统重启

常用运行级别是3和5,也可以执行默认运行级别

应用实例:init[0 1 2 3 4 5 6] 应用案例:通过init来切换不同得运行级别,比如动5-3,然后关机

指定默认运行级别

在CentOS7以前,/etc/inittab文件中,进行了简化,如下:

multi-user.target: andlogous to runlevel 3

graphical.target: andlogous to runlevel 5

查看默认运行级别

systemctl get-default

设置默认运行级别

systemctl set-default mluti-user.target

找回root密码

如何找回root密码?

有很多方式,最简单的方式就是登录阿里云平台从控制面板修改

帮助指令

man获取帮助信息

man [命令或者配置文件] (功能描述:获取帮助信息)

man ls

linux下隐藏文件时以.开头的

ls -la  && ls -al

命令可以组合输入,并且不需要注重顺序

help指令 获得shell内置帮助文档

百度搜索

文件目录

pwd 显示当前工作目录的绝对路径

ls 查看当前目录下的文件信息

ls:查看当前目录下 的文件

ls -l:显示文件的详细信息,权限,大小…..

**cd 切换目录 **

cd ~ :回到自己的home目录

cd ..:回到上一级

cd 文件夹名称:切换到当前目录下的某个文件夹

cd 绝对路径:切换绝对路径下的文件夹

mkdir 创建目录

mkdir [选项] 要创建的目录

选项:

-p:创建多级目录

创建单级目录:mkdir hello

创建多级目录:mkdir -p /www/xiaoyes

rmdir 删除空目录

rmdir [选项] 要删除的目录名称

rmdir删除的时空目录,如果目录下有内容则是无法删除的

如果要删除非空目录,需要使用rm -rf 要删除的目录,谨慎使用!

touch 创建空文件

touch 文件名称

cp 拷贝

cp [选项] 要拷贝的文件 拷贝到哪里

选项:

-r:递归复制整个文件

rm 移除文件或者目录

rm [选项] 要删除的文件或者目录

选项:

-r:递归删除整个文件夹

-f:强制删除不提示

mv 移动文件与目录或者重命名

mv oldFile newFile 就是重命名

mv /temp/moveFile /targetFolder 移动文件

cat 查看文件内容

cat [选项] 要查看的文件

选项:

-n:显示行号

cat Hello.java

cat -n Hello.java

cat -n Hello.java | more 竖杠表示管道命令

more 按页显示文本文件内容

more执行时一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容,more指令中内置了若干快捷键。

more 要查看的文件

操作 功能说明
空白键(space) 代表向下翻一页
Enter 向下翻一行
q 立即离开more
Ctrl + F 向下滚动一屏
Ctrl + B 返回上一层
= 输出当前行号
:f 输出文件名和当前行号

less 分屏查看文件内容

less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端。less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于大型文件具有较高的效率。

less 要查看的文件

操作 功能说明
空白键 向下翻动一页
[pagedown] 向下翻动一页
[pageup] 向上翻动一页
/字串 向下搜寻[字串]的功能; n : 向下查找;N : 向上查找
?字串 向上搜寻[字串]的功能; n : 向上查找;N : 向下查找
q 离开less这个程序

echo 输入信息到控制台

echo [选项] [输出内容]

使用echo指令输出环境变量  echo $PATH

使用echo指令树池Hello World!

head 显示文件开头部分内容

head用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容

head 文件 查看文件头10行内容

head -n 5 文件 查看文件头5行内容,5可以是任意行数

tail 显示文件尾部的内容

tail用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容

tail 文件 查看文件后10行内容

tail -n 5 文件 查看文件后5行内容,5可以是任意行数

tail -f 文件 实时追踪该文档的所有更新

> 指令 和 >> 指令

一个箭头表示覆盖 两个箭头表示追加

ls -l > 文件 列表的内容写入文件a.txt中(覆盖写)

ls -al >> 文件 列表的内容追加到文件aa.txt的末尾

cat 文件1 > 文件2 将文件1的内容覆盖到文件2

echo “内容” >> 文件

案例:

将/home目录下文件列表写入到/home/info.txt中

ls -l /home > /home/info.txt

如果info.txt不存在则回自动创建

1
2
3
4
5
6
# 写入的结果
drwx------. 15 andu andu 4096 9月 14 11:59 andu
-rw-r--r--. 1 root root 0 9月 14 09:54 haha.txt
-rw-r--r--. 1 root root 0 9月 14 12:12 info.txt
-rw-r--r--. 1 root root 12136 9月 14 10:20 text.txt
drwx------. 3 1001 1001 4096 9月 13 14:38 zwj

将当前日历信息追加到/home/mycal文件中

cal >> /home/mycal

1
2
3
4
5
6
7
8
# 写入的结果
九月 2021
日 一 二 三 四 五 六
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

ln 软链接也称为符号链接

类似于Windows里的快捷方式,主要存放了链接其他文件的路径

ln -s [原文件或目录] [软链接名] 给原文件创建一个软链接

案例:

在/home目录下创建一个软链接myroot,链接到/root目录

1
2
3
4
5
6
7
8
ln -s /root /home/myroot


[root@andu01 /]# cd home
[root@andu01 home]# ls
andu haha.txt info.txt mycal myroot text.txt zwj
[root@andu01 home]# cd myroot/
[root@andu01 myroot]#

删除软连接myroot

rm /home/myroot

注意::当我们使用pwd指令查看目录时,仍然可以看到的时软链接所在目录

history 查看历史执行过的命令

history 查看所有

history 10 最近执行的10条

history !5 执行曾经执行过的第5条指令

时间日期类

data 显示当前日期

date 显示当前时间

date +%Y 显示当前年份

date +%m 显示当前月份

date +%d 显示当前是哪一天

date “+%Y-%m-%d %H:%M:%S” 侠士年月日时分秒

cal 查看日历

cal 显示本月日历

cal 2020 显示2020年日历

搜索查找类

find 查找

find指令将从指定目录下向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端

find [搜索范围] [选项]

选项 功能
-name<查询方式> 按照指定的文件名查找模式查找文件
-user<用户名> 查找属于指定用户名所有文件
-size<文件大小> 按照指定的文件大小查找文件

案例:

按文件名:根据名称查找/home目录下的hello.txt文件

find /home -name hello.txt

按拥有者:查找/opt目录下,用户名称为nobody的文件

find /opt -user nobody

查找整个linux系统下大于200M的文件(+n大于 -n大于 n等于,单位有K、M、G)

find / -size +200M

locate 快速定位文件路径

locate指令可以快读定位文件路径。kicate指令利用用实现建立的系统中的所有文件名称以及路径的locate数据库实现快速定位给定的文件,locate指令无须遍历整个文件系统,查询速度较快。为了保证查询结果的准确性,管理员必须定期更新locate时刻

locate 搜索文件

由于locate指令基于数据库进行查询,所以,第一次运行之前,必须使用updatedb指令创建locate数据库。

案例:

请使用locate指令快速定位hello.txt文件所在目录

1
2
3
4
[root@andu01 CentOS 7 x86_64]# updatedb
[root@andu01 CentOS 7 x86_64]# locate hello.txt
/hello.txt
/www/bbb/hello.txt

which 查看某个指令在哪个目录下

which 命令

which ls

grep和管道符号|

grep过滤查找,管道符号。”|”,表示将前一个命令的处理结果输出传递给后面的命令处理

基本语法:

grep [选项] 查找内容 源文件

常用选项:

选项 功能
-n 显示匹配行及行号
-i 忽略字母大小写

应用案例:

请在hello.txt文件中,查找”yes”所在行,并且显示行号

cat hello.txt | grep yes

1
2
[root@andu01 bbb]# cat hello.txt | grep yes
yes My name is Bi Jizhuang

不使用管道符号的方式

grep yes hello.txt

显示行号的写法

cat hello.txt | grep -n yes

压缩和解压类

gzip/gunzip

gzip是用于压缩文件,gunzip用来解压文件

gzip 压缩文件,之恩将文件压缩为*.gz文件

gunzip 解压缩文件命令

gzip压缩,将/home下的haha.txt文件进行压缩

gzip /home/haha.txt

解压

gunzip haha.txt.gz

zip/unzip

zip用于压缩文件,unzip用于解压

zip [选项] xxx.zip 压缩

unzip [选项] xxx.zip 解压

zip常用选项:

-r:递归压缩,即压缩目录

unzip常用选项:

-d<目录>:指定解压后文件的存放目录

将/home文件夹下的所有文件压缩成myhome.zip

zip -r myhome.zip /home

将myhome.zip解压到/opt/tmp目录下

unzip myhome.zipi -d /opt/tmp

tar 打包/解压

tar命令是打包指令,最后打包后的文件是.tar.gz的文件

tar [选项] xx.tar.gz 打包的内容

选项 功能
-c 产生tar打包文件
-v 显示详细信息
-f 之后顶压缩后的文件名
-z 打包同时压缩
-x 解压tar文件

压缩多个文件将/home/pig.txt 和 /home/cat.txt 压缩成pc.tar.gz

tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

将/home压缩成myhome.tar.gz

tar -zcvf myhome.tar.gz /home

将pc.tar.gz解压到当前目录

tar -zxvf pc.tar.gz

将myhome.tar.gz解压到/opt/tmp2目录下

tar -zxvf home.tar.gz -C /opt/tmp2

Linux组

在linux中的每个用户必须属于一个组,不能独立于组外,在Linux中每个文件有所有者、所在者、其他组的概念

  • 1、所有者
  • 2、所在组
  • 3、其他组

比如有一个hello.txt文件,它是andu用户创建的,andu就是hehllo.txt的所有者,也可以将hello.txt的所有者修改为andew

当然,由于hello.txt的创建者 andu是组 tencent的,则hello.txt的所在组就是tencent,该tencent组下的用户则拥有hello.txt的权限

还有一个ali组,则hello.txt相对于ali的关系就是其他组

每个用户都属于一个组

文件/目录所有者

一般为文件的创建者,谁创建了该文件,就自然称为该文件的所有者

  • 查看文件的所有者
    指令:ls -ahl
  • 修改文件的所有者
    chown 用户名 文件名
    修改apple.txt的文件所有者为andu
    chown andu apple.txt

组的创建

groupadd 组名

创建组master

groupadd master

创建用户bjz,放入master组内

useradd -g master bjz

文件/目录所在组

当某个用户创建了一个文件之后,这个文件的所在组就是该用户所在的组

使用bjz创建一个文件,看看这个文件所在的组

创建文件 touch banana.txt

查看文件信息 ll

修改文件所在的组

chgrp 组名 文件名

使用root用户创建文件orange.txt,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到fruit组

创建组 groupadd fruit

创建文件 orange.txt

查看文件组信息 ll

chgrp fruit orange.txt

其他组

除文件的所有者和所在组的用户外,系统的其他用户都是文件的其他组

改变用户所在组

在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组

改变用户所在的组:

usermod -g 组名 用户名

usermod -d 目录名 用户名 改变该用户登录的初始目录

Linux权限

权限的基本介绍

ls -l中显示的内容如下:

drwx——. 15 andu andu    4096 9月  15 13:19 abc

0-9位说明:

  • 第0位确定文件类型(d, -, l, c ,b)
    l是链接,相当于windows的快捷方式
    d是目录,相当于windows的文件夹
    c是字符设备文件,鼠标,键盘
    b是块设备,比如硬盘
  • 是一个文件(txt、zip、png…)
  • 第1-3位确定所有者(该文件的所有者)拥有该文件的权限,—User
  • 第4-6位确定所属组(同用户组的)拥有该文件的权限,—Group
  • 第7-9位确定其他用户拥有该文件的权限 —Other

在Linux中权限也可以使用数字表示:r=4,w=2,x=1 因此rwx=4 + 2 + 1 = 7

其他说明:

15 文件:硬连接数或目录:子目数

andu 用户

andu 用户组

4096 文件大小(字节),如果是文件夹,显示4069字节

9月  15 13:19 最后修改日期

abc 文件名

rwx

  • rwx作用到文件

1、[r]代表可读(read):可以读取,查看

2、[w]代表可写[write]:可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件

3、[x]代表可执行(execute):可以被执行

  • rwx作用到目录

1、[r]代表可读(read):可以读取,ls查看目录内容

2、[w]代表可写(write):可以修改,对目录内创建+删除+重命名目录

3、[x]代表可执行(execute):可以进入该目录

修改权限

通过chmod指令,可以修改文件或者目录的权限

第一种方式:+、-、= 变更权限:

u:所有者 g:所有组 o:其他人:a:所有人(u、g、o的总和)

1、chmod u=rwx,g=rx,o=x 文件/目录名

2、chmod o+w 文件/目录名

3、chmod a-x 文件/目录名

案例:

1、给abc文件的所有者读写执行的权限,给所在组读执行权限,给其他组读执行权限

chmod u=rwx,g=rx,o=rx abc

2、给abc文件的所有者除去执行的权限,增加组写的权限

chmod u-x,g+w abc

3、给abc文件的所有用户添加读的权限
chmod a+r abc

第二种方式:通过数字变更权限

1
2
r=4 w=2 x=1	rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名 相当于 chmod 751

案例:

1、将/home/abc.txt文件的权限系改成rwxr-xr-x,使用给数字的方式实现

1
chmod 755 /home/abc.txt

修改文件/目录所有者

chown newowner 文件/目录 改变所有者

chown newowner:newgroup 文件/目录 改变所有者和所在组

-R 如果是目录 则使其下所有子文件或目录递归生效

案例:

1、将/home/abc.txt文件的所有者系改成tom

1
chown tom /home/abc.txt

2、将/home/kkk目录下所有的文件和目录的所有者修改成tom

1
chown -R tom /home/kkk

修改文件/目录所在组

chgrp newgroup 文件/目录 改变所在组

案例:

将/home/abc.txt文件的所在组修改成shaolin(少林)

1
2
groupadd shaolin
chgrp shaolin /home/abc.txt

将/home/kkk目录下所有的文件和目录的所在组都修改成shaolin(少林)

1
chgrp -R shaolin /home/kkk

权限管理实践

警察和土匪游戏

警察组(police) 土匪组(bandit)
jack xh
jerry xq

1、创建组

1
groupadd police	groupbandit

2、创建用户

1
2
useradd -g police jack	useradd -g police jerry
useradd -g bandit xh useradd -g bandit xq

3、jack创建一个文件,自己可以读写

首先jack登录

1
2
vim jack.txt
chmod 640 jack.txt

4、jack修改该文件,让其他组人可以读,本组人可以读写

1
chmod 644 jack.txt  或者 chmod o=r,g=r jack.txt

5、xh投靠警察

1
usermod -g police xh

6、看看xh和xq是否可以读写该文件,小结论:如果要对目录内的文件进行操作,需要先有对该目录的相应权限

1
chmod 770 /home/jack

西游记案例

1、建立两个组:神仙(sx)、妖怪(yg)

1
2
groupadd sx
groupadd yg

2、建立四个用户(唐僧、悟空、八戒、沙僧)

1
2
3
4
useradd ts
useradd wk
useradd bj
useradd ss

3、设置密码
密码统一设置为用户名
4、把悟空、八戒放入妖怪,唐僧、沙僧放入神仙组

1
2
3
4
usermod -g yg wk
usermod -g yg bj
usermod -g sx ts
usermod -g sx ss

5、用悟空创建一个文件(monkey.java 该文件要输出i am monkey)
登录 vim monkey.java
5、给八戒一个可以rw的权限
因为八戒和悟空是同一个组的,所以给当前组添加写的权限就OK

1
chmod g+w monkey.java

6、八戒修改monkey.java加入一句话(i am pig)

1
2
[bj@andu01 ~]$ cd /home/wk
-bash: cd: /home/wk: 权限不够

发现wk这个目录进不去也是无法修改文件的
所以我们要对该目录进行权限修改

1
2
3
4
chmod g+r+w+x wk // 将wk当前组的权限修改为读写执行

cd /home/wk
vim monkey.java

7、把沙僧放入妖怪组
此时沙僧还是无法进入wk目录

1
2
3
4
5
[ss@andu01 /]$ cd /home/wk
-bash: cd: /home/wk: 权限不够

// 我们将沙僧修改为妖怪组
usermod -g yg ss

然后看一看沙僧是否可以进入wk的文件夹

1
2
[ss@andu01 /]$ cd /home/wk
-bash: cd: /home/wk: 权限不够

发现还是进不去,很奇怪!

进不去的原因是因为沙僧,在登录之前是神仙组,然后在沙僧的登录过程中,root用户修改了沙僧的权限,所以,沙僧自己都没有反应过来自己的组被修改了,所以当然是无法进入自己组的用户共享的目录,所以我们要做的就是,重新登录沙僧账户,然后组状态才会重新加载

8、沙僧修改monkey.java
vim /home/wk/monkey.java

细节分析:
假如此时,我们使用root用户对wk目录的权限进行修改

1
2
3
4
5
# 组的所有权限都移除
chmod g-r-w-x wk

# 添加执行权限
chmod g+x wk

然后我们使用悟空同组的八戒登录,并且尝试进入wk目录

1
2
3
[bj@andu01 /]$ cd /home/wk
[bj@andu01 wk]$ ls
ls: 无法打开目录.: 权限不够

发现是可以进去的(因为有了x权限),但是不能使用ls访问该文件夹下的文件
但是此时,我们虽然看不见此目录下有哪些文件,但是我们知道该目录下有个monkey.java文件,我们尝试修改一下这个文件

1
[bj@andu01 wk]$ vim monkey.java

结果是可以正常修改文件的!!!
这是因为,我们虽然对wk这个目录只赋予了x的权限,但是wk目录内的文件monkey.java,确是有着本组用户可以读取和修改的权限的

1
2
3
4
5
6
7
8
9
10
11
12
-rw-rw-r--. 1 wk yg 92 9月  17 14:46 monkey.java

# 当然,直接使用cat查看也是可以的

[bj@andu01 wk]$ cat monkey.java
i am monkey

i an pig

我是沙僧,我现在是妖怪了!

八戒来偷吃西瓜了!

此时,我们使用root用户或者悟空把wk这个目录的读取权限在开放给本组的 用户

1
[root@andu01 /]# chmod g+r /home/wk

然后现在八戒是可以正常读取到该目录下的文件的,ls是针对于目录的权限

1
2
3
4
[bj@andu01 home]$ cd wk
[bj@andu01 wk]$ ll
总用量 4
-rw-rw-r--. 1 wk yg 92 9月 17 14:46 monkey.java

现在因为monkey.java对本组开放了写的权限,我们尝试一下操作

1
2
[bj@andu01 wk]$ rm monkey.java
rm: 无法删除"monkey.java": 权限不够

我们发现,拥有写权限并不代表可以创建或者删除,而是可以修改

如果我们此时尝试再wk目录下创建ok.txt呢?

1
2
3
# 这里创建文件的权限是针对于wk目录的
[bj@andu01 wk]$ touch ok.java
touch: 无法创建"ok.java": 权限不够

因为wk文件夹没有对本组开放写的权限,所以导致无法创建文件
我们此时再使用悟空对wk目录进行本组写的权限开放,然后再尝试再wk目录下创建ok.txt文件

1
2
3
4
[root@andu01 /]# chmod g+w /home/wk

[bj@andu01 wk]$ touch ok.txt
[bj@andu01 wk]$

此时是可以正常创建文件的(在Linux中,无输出内容则表示命令执行成功)

对文件夹rwx的细节分析:

  • x表示可以进入到该目录,比如cd
  • r表示可以ls,将目录的内容显示
  • w表示可以在该目录删除或者创建文件

定时任务调度

crond任务调度

crontab进行 定时任务的设置
概述:
任务调度:是指系统在某个时间主席那个的特定的命令或程序
任务调度分类:

  • 系统工作:有些重要的工作必须周而复始地执行,如病毒扫描等
  • 个别用户工作:个别用户工作可能希望执行某些程序,比如对MySQL数据库的备份。

基本语法:
crontab [选项]

选项 说明
-e 编辑crontab定时任务
-l 查询crontab任务
-r 删除当前用户所有的crontab任务

快速入门

设置任务调度文件:/etc/crontab
设置个人任务调度:执行crontab -e 命令
接着输入需要执行的任务到调度文件
如:*/1 * * * * ls -l /etc/ > /tmp/to.txt
意思说每小时的每分钟执行ls -l /etc/ > /tmp/to.txt 命令

参数细节说明:

项目 含义 范围
第一个 * 一小时当中的第几分钟 0-59
第二个 * 一天当中的第几小时 0-23
第三个 * 一个月当中的第几天 1-31
第四个 * 一年当中的第几月 1-12
第五个 * 一周当中的星期几 0-7(0-7都代表星期日)

特殊符号说明

特殊符号 含义
* 代表任何时间。比如第一个 “*” 就代表一小时中每分钟都能执行一次的意思
, 代表不连续的时间。比如 “0 8,12,16 * * * “命令,代表在每天的8点0分,12点0分,16点0分都执行一次命令
- 代表连续的时间范围。比如” 0 5 * * 1-6 “命令,代表在周一到周六的凌晨5点0分执行命令
*/n 代表每隔多久执行一次,比如 “ */10 * * * * “命令,代表每隔10分钟就执行一遍命令

特定时间执行任务案例

时间 含义
45 22 * * * 在22点45分执行命令
0 17 * * 1 每周1的17点0分执行命令
0 5 1,15 * * 每月1号和15号的凌晨5点0分执行命令
40 4 * * 1-5 每周一到周五的凌晨4点40分执行命令
*/10 4 * * * 每天的凌晨4点,每隔10分钟执行一次命令
0 0 1,15 * 1 每月1号和15号,每周1的0点0分都会执行命令。注意:星期几和几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。

任务调度实例

每隔一分钟就将当前的日期信息,追加到/tmp/mydate文件中

1
*/1 * * * * date >> /tmp/date

每隔1分钟,就将当前日期和日历都追加到/home/mycal文件中

1
2
3
4
5
6
7
# 编写shell脚本 my.sh
date >> /tmp/mycal
cal >> /tmp/mycal

# 设置定时任务
crontab -e
*/10 * * * * /home/my.sh

每天凌晨2:00将MySQL数据库 testdb备份到文件中。

1
0 2 * * * mysqldump -uroot -phelloworld testdb > /home/db.bak

crond相关指令:

  • crontab -r:终止任务调度
  • crontab -l:列出当前有哪些任务调度
  • service crond restart [重启任务调度]

at定时任务

1、at命令是一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列来运行
2、默认其工况下,atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业
3、at命令时一次性定时计划任务,执行完了一个任务后不在执行此任务了
4、在使用at命令的时候,一定要保证atd进程的启动,可以使用相关指令来查看
ps -ef 检查当前所有在运行的进程
ps -ef | grep atd 可以检查atd是否在运行 如果可以看到结果,表示atd正在运行

语法:
at [选项] [时间]
Ctrl + D 结束at命令的输入

命令选项:

选项 含义
-m 当指定的任务被完成后,将给用户发送又将,即使没有标准输出
-I atq的别名
-d atm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q <队列> 使用指定的队列
-f <文件> 从指定文件读入任务而不是从标准输入读入
-t <时间参数> 以时间参数的形式提交到运行的任务

at指定时间的方法

1、接受在当天的hh:mm(小时:分钟)式的时间指定。加入时间已过去,那么就放在第二天执行。例如:04:00
2、使用midnight(深夜),noon(中午),teatime(饮茶时间,一般时下午4点)等比较模糊的词语来指定时间。
3、采用12小时制,即在时间后面加上AM(上午)或PM(下午)来说明时上午还是下午。例如:12pm
4、指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面。例如:04:00 2021-09-17
5、使用相对计时法。指定格式为:now + count time-units,now就是当前时间,time-untis就是时间安慰,这里能够使minutes(分钟)、hour(小时)、day(天)、week(星期)。count时时间的数量,几天,几小时,例如:now + 5 minutes
6、直接使用today(今天)、tomorrow(明天)来指定完成命令的时间

应用实例

1、2天后的下午5点指定/bin/ls /home

1
2
3
4
at 5pm + 2 days
# 回车之后输入任务
/bin/ls /home
# 然后使用两次Ctrl + D保存

2、atq命令来查看系统中没有指定的工作任务

1
atq

3、明天17点钟,输出时间到指定文件内 比如/root/date100.log

1
2
3
at 5pm tomorrow
date > /root/date100.log
Ctrl + D * 2

4、2分钟后,输出时间到指定文件内 比如/root/date200.log

1
2
3
at now + 2 minutes
date > /root/date200.log
Ctrl + D * 2

5、删除已经设置的任务,atrm 编号

1
2
# 比如此时要删除任务的编号为3
atrm 3

Linux分区

原理介绍:
1、Linux来说无论有几个分区,分给哪一目录使用,它归根结底只有一个根目录,一个独立且唯一的文件结果,Linux中每隔分区都是用来组成整个文件系统的一部分
2、Linux采用了一种叫 “载入” 的处理方法,它的整个文件系统在红包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这是要载入的一个分区将使它的储存空间在一个目录下获得。

可以使用lsblk命令查看分区以及挂载情况:

1
2
3
4
5
6
7
[root@andu01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 2G 0 part [SWAP]
└─sda3 8:3 0 17G 0 part /
sr0 11:0 1 4.4G 0 rom /run/media/root/CentOS 7 x86_64

硬盘说明:
Linux硬盘分IDE硬盘和SCST硬盘,目前基本上是SCSI硬盘

磁盘挂载案例

增加一块硬盘为例来熟悉下磁盘的相关指令和深入理解磁盘分区、挂载、卸载的概念。

如何添加一块硬盘:
1、虚拟机添加硬盘
2、分区
3、格式化
4、挂载
5、设置可以自动挂载

略…

网络配置

1
2
3
4
5
6
7
8
# Linux下查看网络信息
ifconfig

# Windows下查看网络信息
ipconfig

# 检查主机与网络之间的互通性
ping

NAT网络原理图

image.png

网络环境配置

第一种(自动获取):
Linux启动后会自动获取IP,缺点是每次自动获取的,IP地址可能不一样

第二种(指定IP):
直接修改配置文件来指定IP,并且可以连接到外网(程序员推荐)
编辑:vi/etc/sysconfig/network-scripts/ifcfg-ens33
要求:将ip地址配置为静态的,比如ip地址为:192.168.200.130

ifcfg-ens33文件说明:

1
2
3
4
5
6
7
8
9
DEVICE=eth0		# 接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx # MAC地址
TYPE=Ethernet # 网络类型(通常是Ethernet)
UUID=xxx-xx-xx-xxx- # 通常是随机的
ONBOOT=yes # 系统启动时候网络接口是否有效
BOOTPROTO=static # IP的配置方法[none|static|bootp|dhcp](引实时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
IPADDR=192.168.200.130 # IP地址
CATEWAY=192.168.200.2 # 网关
DNS1=192.168.200.2 # 域名解析器

设置主机名和host映射

设置主机名

1、为了方便记忆,可以给Linux系统设置主机名,也可以根据需求修改主机名
2、指令hostname,查看主机名
3、修改文件在/etc/hostname指定
4、修改后重启生效

设置Host映射

如何通过主机名能够找到(比如ping)某个linux系统?

Windows:
在C:\Windows\System32\drivers\etc\hosts 文件指定即可
案例:192.168.200.130 andu

Linux:
在/etc/hosts 文件指定
案例:192.168.200.1 ZhanShen

Linux进程

1、在Linux中,每个执行的程序都称为一个进程。每一个进程都分配一个号(pid,进程号)。
2、每隔进程都可能以两种方式存在,前台与后台,所以前台进程就是用户目前的屏幕上可以进行该操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
3、一般系统的服务都是在后台进程的方式存在,而且都会常驻在系统中。直到关机才结束。

显示系统执行的进程

ps命令是用来查看目前系统中,有哪些正在执行,以及他们执行的情况。可以不加任何参数。

字段 说明
PID 进程识别号
TTY 终端名称
TIME 进程所消耗CPU时间
CMD 正在执行的命令或进程名
STAR S-睡眠,s-表示进程绘画的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等。
USER 执行进程的用户
%CPU 进程占用CPU的百分比
%MEM 进程占用物理内存的百分比
VSZ 进程占用的虚拟内存大小(单位:KB)
RSS 进程占用的物理内存大小(单位:KB)
COMMAND 启动进程所用的命令和参数,如果过长会被截断显示

ps -a:显示当前终端的所有进程信息
ps -u:以用户的格式显示进程信息
ps -x:显示后台进程运行的参数
组合使用:ps -aux

显示系统执行的进程

以全格式显示当前所有的进程,查看进程的父进程
ps -ef是查看全格式显示当前所有的进程
-e显示所有进程 -f全格式
ps -ef | grep xxx 是BSD风格
UID:用户ID
PID:进程ID
PPID:父进程ID
C:CPU用于计算执行优先级的因子。数值越大,表示进程是CPU密集型运算,执行优先级会降低,数值越小,表示进程是I/O密集型运算,执行优先级会提高
STIME:进程启动的时间
TTY:完成的终端名称
TIME:CPU时间
CMD:启动进程所用的命令和参数

终止进程kill和killall

若是某个进程执行一般需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程,使用kill命令来完成此项任务。
语法:
kill [语法] 进程号(功能描述:通过进程号杀死/终止进程)
killall 进程名称(功能描述:通过进程名杀死进程,也支持通配符,这在系统因负载过大而变得很慢的时候很有用)
常用选项:
-9:表示强迫进程立即停止

最佳实践:
1、踢掉某个非法登录用户
比如我们此时有个非法用户andu,他此时已经通过ssh连接到了服务器,我们现在可以:
ps -aux | grep sshd
然后查看andu对应的进程PID,使用kill PID使andu强制下线
2、终止远程登录服务sshd,在适当的时候再次重启sshd服务
终止:kill sshd进程id 重启:/bin/systemctl start sshd.service
3、终止多个gedit
killall gedit
4、强制杀掉一个终端
ps -aux | grep bash
kill -9 bash进程id

查看进程树

pstree [选项] 可以更加直观的查看进程信息
-p:显示进程PID
-u:显示进程的所属用户

服务管理

服务本质就是进程,但是是在运行在后台的,通常都会监听某个端口,等待其他程序的请求,比如(mysqld、sshd、防火墙)等等。

服务管理指令

1、service 服务名 [start | stop | restart | reload | status ]
2、在CentOS7.0之后 很多服务不在使用service而是systemctl
3、service指令管理的服务在/etc/init.d查看

1
2
3
4
5
6
[root@andu01 ~]# ls -l /etc/init.d/
总用量 40
-rw-r--r--. 1 root root 18281 5月 22 2020 functions
-rwxr-xr-x. 1 root root 4569 5月 22 2020 netconsole
-rwxr-xr-x. 1 root root 7928 5月 22 2020 network
-rw-r--r--. 1 root root 1160 10月 2 2020 README

案例:

使用service指令,查看,关闭,启动network [注意:在续集系统演示,因为网络连接会关闭]

1
2
3
4
5
6
7
8
9
10
11
12
# 查看服务状态
service network status
已配置设备:
lo ens33
当前活跃设备:
lo ens33 virbr0

# 停止服务
service network stop

# 启动服务
service network start

注意:关闭之后ssh就无法连接此服务器了,直到重启network服务

查看服务名

方式一:使用setup就可以看到全部服务

1
2
3
4
5
6
7
8
9
10
11
[ ] saslauthd.service                         ↑ │
[*] smartd.service ▒ │
[ ] speech-dispatcherd.service ▒ │
[*] sshd.service ▒ │
[ ] sshd.socket ▒ │
[ ] sssd-autofs.socket ▮ │
[ ] sssd-nss.socket ▒ │
[ ] sssd-pac.socket

# 前面带*号的就是随着Linux系统的启动而启动的服务
# 如果想修改 则需要把光标移动到星号位置 然后输入空格即可

方式二:/etc/init.d看到service命令管理的服务

服务的运行级别

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

一般比较经常使用的运行级别为3和5

开启流程说明:

CentOS7后运行级别说明
在/etc/initab尽心简化,如下:

1
2
3
4
5
6
7
8
9
multi-user.target: analogousto runlevel 3
graphical.target: analogous to runlevel 5


// 获取运行级别
systemctl get-default

// 设置运行级别
systemctl set-default TARGET.target

chkconfig指令
介绍
1、通过chkconfig命令可以给服务的各个运行级别设置自启动/关闭
2、chkconfig指令管理的服务在/etc/init.d查看
3、注意:CentOS7.0后,很多服务使用systemctl管理
基本语法

1
2
3
4
5
# 查看服务
chkconfig -- lsit [| grep xxx]
chkconfig 服务名 --list
# 修改服务的自启动状态
chkconfig --level 5 服务名 on/off

对network服务修改运行级别为3并且关闭自启动

1
chkconfig --level 3 network off

chkconfig重新设置服务和偶自启动或关闭,需要重启机器reboot生效

systemctl服务管理

systemctl管理指令
1、基本语法:systemctl [start | stop | restart | status ] 服务名
2、systemctl指令管理的服务在/usr/lib/systemd/system查看

systemctl设置服务的自启动状态
1、systemctl list-unit-files [ | grep 服务名] (查看服务开机启动在黄台,grep可以进行过滤)
2、systemctl enable 服务名(设置服务开机启动)
3、systemctl disable 服务名(关闭服务开机启动)
4、systemctl is-enabled 服务名(查询某个服务是否是自启动的)

应用案例
查看当前防火墙的状况,关闭防火墙和重启防火墙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看防火墙服务的状态
systemctl status firewalld

# 关闭防火墙
systemctl stop firewalld

# 重启防火墙
systemctl restart firewalld

# 查看防火墙服务
[root@andu01 /]# ls -l /usr/lib/systemd/system | grep fire
-rw-r--r--. 1 root root 657 10月 1 2020 firewalld.service

[root@andu01 /]# systemctl list-unit-files | grep firewalld
firewalld.service enabled

# 设置服务开机启动
systemctl enable firewalld

# 关闭服务开机自启
systemctl disbale firewalld

# 查看防火墙是否开启启动
systemctl -is-endabled firewalld

细节分析
1、关闭或者启动防火墙后,立即生效。[telnet 测试 某个端口即可]
2、这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置
3、如果希望设置某个服务自启动或关闭永久生效,要使用systemctl [enable | disable] 服务名.

打开或者关闭指定端口

在真正的生产环境,往往需要将防火墙打开,但是问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器见日你刚起端口通讯。这时,需要打开指定的端口。比如80、22、8080 等,这个又怎么做呢?

firewall
打开端口:firewall-cmd --permanent --add-port=端口号/协议
关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
重新载入才能生效:firewall-cmd --reload
查询端口是否开放:firewall-cmd --query-port=端口/协议

应用案例
1、启动防火墙,测试111端口是否能telnet

1
telnet 192.168.234.130 111

2、开放111端口

1
firewall-cmd --permanent --add-port=111/tcp

3、再次关闭111端口

1
2
3
firewall-cmd --permanent --remove-port=111/tcp

firewall-cmd --reload

动态监控进程

top与ps指令相似,他们都用来显示正在执行的进程。top与ps最大的不同之处,在于top在执行一段时间可以更新更新正在运行的进程。
基本语法
top [选项]

选项说明

选项 功能
-d 秒数 指定top指令每隔几秒更新。默认是3秒
-i 使top不显示任何限制或者僵死进程
-p 通过指定监控进程ID来仅仅监控某个进程的状态

交互操作说明

操作 功能
P 以CPU使用率排序,默认就是此项
M 以内存的使用率排序
N 以PID排序
q 退出top
1
2
3
4
5
6
7
8
	  # 当前时间    # 系统运行时间     #用户数量  # 负载均衡        
top - 09:27:17 up 21 days, 11:58, 1 user, load average: 0.19, 0.18, 0.26
# 任务数:总任务数 # 3个正在运行 #119个正在等待 # 0个已停止
Tasks: 123 total, 3 running, 119 sleeping, 0 stopped, 1 zombie
# CPU占用情况
%Cpu(s): 7.2 us, 2.1 sy, 0.0 ni, 90.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882008 total, 85688 free, 784824 used, 1011496 buff/cache
KiB Swap: 1049596 total, 838140 free, 211456 used. 900512 avail Mem

应用实例
1、监视特定用户
top:输入此指令,按回车键,查看指定进程
u:然后输入”u”回车,在输入用户名,即可

2、终止指定的进程
top:输入此命令,按回车键,查看执行的进程
k:然后输入”k”回车,再输入要结束的进程ID号
在输入信号量为9(强制删除)

3、指定系统状态跟新的时间(跟新10秒自动更新)
top -d 10

监控网络状态

查看系统网路情况netstat
基本语法
netstat [选项]
选项说明
-an 按一定顺序排列输出
-p 选手显示哪个进程在调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
网络协议            本地地址                远程地址                状态
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:888 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
Linux的本地IP 使用MobaXterm远程连接机器的IP(本机IP)
tcp 0 0 10.0.4.10:22 61.163.127.93:22628 ESTABLISHED
tcp 0 0 10.0.4.10:51356 169.254.0.34:9988 ESTABLISHED
tcp 0 0 10.0.4.10:8888 89.248.165.52:51560 ESTABLISHED
tcp 0 0 10.0.4.10:8888 141.101.196.233:43560 ESTABLISHED

应用案例
请查看服务名为sshd服务的信息
netstat -anp | grep sshd

检测主机连接命令ping

网络检测工具,它主要是用于检测远程主机是否正常,或者是两部主机之间的网线活着网卡故障。
ping 对方ip地址
ping 1.15.235.91

包管理

rpm

rpm用于互联网下载包的打包以及安装工具,它包含在某些Linux分发版中,它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,类似鱼Windows的Setup.exe,这一文件格式名称虽然打上了RedHat的标志,但理念是通用的。
Linux的分发版本都有采用(suse,redhat,centos等等),可以算是工人的行业标准了。

查询

查询已安装的rpm列表

1
rpm -qa | grep xx

查看当前系统是否安装了火狐

1
rpm -qa | grep firefox

rpm包基本格式

1
2
3
4
5
rpm包名:firefox-60.2.2-1.el7.centos.x86_64
名称: 60.2.21
使用操作系统: el7.centos.x86_64
表示centos7.x的64位系统
如果是i686、i386表示32位系统,noarch表示通用

查询所安装的所有rpm软件包
rpm -qa | more

查询软件包是否安装
rpm -q firefox

查询软件包信息
rpm -qi firefox

查询软件包中的文件
rpm -ql firfox

文件全路径名 查询文件所属的软件包
rpm -qf /etc/passwd
rpm -qf /root/install.log

卸载

rpm -e RPM包的名称
删除firefox软件包
rpm -e firefox

安装

rmp-ivh RPM包全路径名称

参数
i=install 安装
v=verbose 提示
h=hash 进度条

卸载和安装firefox浏览器

yum

yum是一个Shell前端软件包管理器,依赖于RPM包管理,能够从指定的服务器自动下载RPM并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

查询yum服务器是否有需要安装的软件ea
yum list | grep 软件列表

1
2
3
[root@andu01 /]# yum list | grep firefox
firefox.i686 91.3.0-1.el7.centos updates
firefox.x86_64 91.3.0-1.el7.centos updates

安装指定的yum包
yum install xxx

使用yum安装firefox

1
yum install firefox

安装JDK

mkdir /opt/jdk
将JDK安装包通过XFTP6上传到/opt/jdk下
cd /opt/jdk
解压 tar -zxvf jdk-8u261-linux-x64.tar.gz
mkdir /usr/local/java
mv /opt/jdk/jdk1.8.0_261 /usr/local/kava
配置环境变量的配置文件vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile 让新的环境变量生效
java -version

tomcat安装

下载安装包解压,运行startup.sh文件
并且需要开启8080端口

idea安装

下载安装包并解压
启动bin目录下的./idea.sh

Shell编程

1、Linux运维工程师在进行服务器集群管理时,愮编写Shell程序来进行服务器的管理
2、对于JavaEE和Python程序员来说,可以编写一些Shell脚本进行程序活着是服务器的维护,比如编写一个定时备份数据库的脚本
3、对于大数据程序员来说,需要编写SHell程序来管理集群。

Shell是什么?
Shell是一个命令行解释器,他为用户u提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell脚本的执行方式
脚本格式要求
1、脚本以#!/bin/bash开头
2、脚本需要有可执行权限

脚本常用的执行方式
方式一(输入脚本的绝对路径或相对路径):
首先要赋予helloworld.sh 脚本的+x权限,在执行脚本

方式二(sh + 脚本)
不用赋予脚本+x权限,直接执行即可

编写一个Shel脚本,输出Hello World

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mkdir shCode
cd shCode
vim hello.sh

// i 输入内容
#!/bin/bash
echo "Hello World"

:wq 退出

chmod u+x hello.sh

./hello.sh
Hello World

sh hello.sh
Hello World

变量

变量介绍
1、Linux Shell中的变量分为,系统变量和用户自定义变量
2、系统变量:$HOME$PWD$SHELL$USER等等,比如:echo $HOME等等
3、显示当前shell中所有变量: set

变量的定义
1、定义变量:变量名 = 值
2、撤掉变量:unset 变量
3、声明静态变量:readonly 变量,注意:不能unset

变量的定义规则
1、变量名称可以由字母、数字和下划线组成,但是不能以数字开头
2、等号两侧不能有空格
3、变量名称一般习惯为大写

将命令的返回值赋值给变量
1、A=date反引号,运行里面的命令,并把结果返回给变量A
2、A=$(date)等价于反引号

快速入门
1、定义变量A

1
2
3
4
5
#!/bin/bash
A=100
echo A=$A
eho "A=$A"

2、撤销变量A

1
2
unset $A
echo "A=$A" $ A=

3、声明静态的变量B = 2,不能unset

1
2
3
4
5
6
7
8
readonly name="BJZ"

[root@andu01 shCode]# sh test.sh
A=100
A=100
BJZ
test.sh: 第 13 行:unset: name: 无法反设定: 只读 variable

4、可以把变量提升为全局环境变量,可供其他shell程序使用

设置环境变量
1、export 变量名=变量值 将shell变量输出为边境变量/全局变量
2、source 配置文件 让修改后的配置信息立即生效
3、echo $变量名 查询环境变量的值

1、在/etc/profile文件中定义TOMCAT_HOME环境变量

1
2
3
4
5
6
7
8
vim /etc/profile

# 定义TOMCAT的变量变量
export TOMCAT_HOME=/opt/tomcat


# 让配置生效
source /etc/profile

2、查看环境变量TOMCAT_HOME的值

1
echo $TOMCAT_HOME

3、在另外一个shell程序中使用TOMCAT_HOME

1
echo tomcat_home=$TOMCAT_HOME

注意:在输入TOMCAT_HOME环境变量前,需要让其生效source /etc/profile

注释

单行注释

1
# 单行注释

多行注释

1
2
3
4
5
6
:<<! 多行注释

多行注释
多行注释
多行注释
!

位置参数变量

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如:./myshell.sh 100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息

基本语法
$n(n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$*(这个变量代表命令行中的所有参数,$*把所有的参数看成一个整体)
$@(这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待)
$#(这个变代替命令行中所有参数的个数)

编写一个shell脚本 position.sh ,在脚本中获取到命令行的各个参数信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建脚本文件
vim position.sh


# 写入内容
#!/bin/bash

echo "0=$0 1=$1 2=$2"

echo "所有的参数=$*"

echo$@

echo "个数=$#"

# 赋予权限
chmod 777 position.sh

# 执行脚本
./position.sh 100 200
0=./position.sh 1=100 2=200
所有的参数=100 200
“100 200”
个数=2

预定义变量

基本介绍
就是shell设计者实现已经定义好的变量,可以直接在shell脚本中使用

基本语法

1
2
3
$$	当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
$? 最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体时候哪个数,由命令自己来决定),则证明上一个命令执行不正确了

应用实例
在一个shell脚本中简单使用一些预定义变量
preVar.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
echo "当前执行的进程ID => $$"


/shCode/test.sh &
echo "最后一个后台方式运行的进程ID => $! "

echo "执行的结果是=$?"



[root@andu01 shCode]# ./preVar.sh
当前执行的进程ID => 43261
最后一个后台方式运行的进程ID => 43262
执行的结果是=0
[root@andu01 shCode]# A=100
A=100
BJZ
/shCode/test.sh: 第 13 行:unset: name: 无法反设定: 只读 variable

运算符

基本语法
1、"$((运算式))""$[运算式]"活着expr m + n
2、注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用``
3、expr m - n
4、expr \*,/,% 乘,除,取余

应用案例
1、计算(2 + 3) * 4的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 第一种方式
#!/bin/bash

RES1=$(((2+3)*4))
echo "RES1 = "$RES1



[root@BJZ home]# chmod u+x oper.sh
[root@BJZ home]# ./oper.sh
RES1 = 20

# 第二种方式
#!/bin/bash
RES2=$[(2+3)*4]
echo "RES2 = "$RES2

[root@BJZ home]# chmod u+x oper2.sh
[root@BJZ home]# ./oper2.sh
RES2 = 20


# 第三种方式
#!/bin/bash
RES3=`expr 2 + 3`
RES4=`expr $RES3 \* 4`
echo "RES4"$RES4

[root@BJZ home]# chmod u+x oper3.sh
[root@BJZ home]# ./oper3.sh
RES420

2、求出命令行的两个参数[整数]的和

1
2
3
4
5
6
7
8
#!/bin/bash

SUM=$[$1+$2]
echo SUM$SUM

[root@BJZ home]# chmod u+x oper4.sh
[root@BJZ home]# ./oper4.sh 20 30
SUM50

条件判断

基本语法
condition
非空返回true,可使用$?验证(0为true >1为false)

应用案例
判断语句
1、=字符串比较
2、两个整数的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
3、按照文件权限进行判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
4、按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录

应用实例
1、”ok”是否等于”ok”

1
2
3
4
5

if [ "ok" = "ok" ]
then
echo "equal"
fi

2、23是否大于等于22

1
2
3
4
5

if [ 23 -ge 22 ]
then
echo "大于"
fi

3、/root/shcode/aaa.txt目录中的文件是否存在

1
2
3
4
5

if [ -f /root/shcode/aaa.txt ]
then
echo "文件存在"
fi

流程控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if [ 条件表达式 ]
then
代码
fi

# 或者多分支

if [ 添加表达式 ]
then
代码
elif [ 条件表达式 ]
then
代码
fi

注意:[ 条件表达式 ] 中括号和条件判断式之间必须要有空格

请编写一个shell程序,如果输入的参数大于等于60,则输出”及格了”,如果小于60,则输出”不及格”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15


if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi

[root@BJZ home]# chmod u+x ifdemo2.sh
[root@BJZ home]# ./ifdemo2.sh 20
不及格
[root@BJZ home]# ./ifdemo2.sh 70
及格了

case语句

基本语法
case $变量名 in
“值1”)
如果变量的值等于1,则执行程序1
;;
“值2”)
如果变量的值等于2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

当命令行参数是1时,输出”周一”,是2时输出”周二“,其他情况输出”other”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

[root@BJZ home]# chmod u+x ifcase.sh
[root@BJZ home]# ./ifcase.sh 2
周二
[root@BJZ home]# ./ifcase.sh 1
周一
[root@BJZ home]# ./ifcase.sh 5
other


循环控制

基本语法
for 变量 in 值1 值2 值3…
do
程序
done
应用实例
打印命令行输入的参数[这里可以看出$*和$@的区别]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# $*
#!/bin/bash
for i in "$*"
do
echo "num is $i"
done

[root@BJZ home]# ./testfor1.sh 100 200 300
num is 100 200 300


# $@
#!/bin/bash
for i in "$@"
do
echo "num is $i"
done

[root@BJZ home]# ./testfor1.sh 100 200 300
num is 100
num is 200
num is 300

基本语法2
for((初始值;循环控制条件;变量变化++))
do
程序
done
应用案例
从1加到100的值输出显示

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

SUM=0
for((i=1;i <= 100;i++))
do
SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

[root@BJZ home]# ./testfor2.sh
SUM=5050

while循环
基本语法1
while [ 条件判断式 ]
do
程序
done
应用案例
从命令行输入一个数n,统计1+..+n的值式多少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
# i自增
i=$[$i+1]

done
echo "执行结果 = "$SUM

[root@BJZ home]# vim testwhile.sh
[root@BJZ home]# ./testwhile.sh 10
执行结果 = 55
[root@BJZ home]# ./testwhile.sh 100
执行结果 = 5050

读取控制台输入

基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。
参数:
变量:指定读取值的变量名

应用案例
1、读取控制台输入一个num1的值

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"

[root@BJZ home]# chmod u+x testread.sh
[root@BJZ home]# ./testread.sh
请输入一个数NUM1=200
你输入的NUM1=200

2、读取控制台输入一个num2值,在10秒内输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

# 不输入任何字符等待10秒会自动退出
[root@BJZ home]# ./testread.sh
请输入一个数NUM2=你输入的NUM2=

[root@BJZ home]# ./testread.sh
请输入一个数NUM2=123
你输入的NUM2=123


作者

路远

发布于

2022-05-01

更新于

2023-04-21

许可协议