Linux

目录

普知识:Linux系统的大类

一、基础篇

1. 桌面与终端基础操作

2. Linux文件系统,目录介绍

3.初识vim编辑器(重要)

3.1 vim普通模式,复制粘贴删除

3.2 vim编辑模式

3.3 vim命令模式

4.网络配置(重要)

4.1 配置网络ip

4.2.修改为静态IP

4.3.配置主机名

5.远程登录

6. 系统管理(重要)

6.1 Linux服务管理

6.2 系统运行级别

6.3 服务开机启动和关闭防火墙

6.4 关机重启

二、实操篇(常用基本命令)(重要)

7.shell含义解释

8. 帮助命令

1. man(manual手册) 

2. help命令

9. 文件目录类

9.1 目录操作命令

1.  pwd  打印工作目录  显示当前工作目录的绝对路径。

2.  cd -  返回上一次的工作目录

3.  ls 常用选项-a,  -l 

4.  mkdir b c     

5.  rmdir   只能删除空目录

9.2 文件操作命令

1. touch

2. cp      如果cp的目的是一个文件,相当于要把源文件内容覆盖目的文件。

 3. rm    默认移除有提示。

4. mv命令 

5. cat   (catch捕捉) 适合查看内容少的内容文件

6. more   适合查看文件内容多的文件,可以分页显示。但他的效率还不是最高的。

7.less   less可以像vim一样输入命令查找编辑,比more功能强大

9.3 其他命令 

1. echo  输出内容到控制台        重定向

 2. 监控文件变化_head_tail

3. 软连接(link)  -s的s代表soft简写

4. history  查看已执行的历史命令

10. 时间日期类

10.1 date

 10.2 cal 查看日历信息

11. 用户权限类

11.1 用户命令

11.1.1  useradd

11.1.2 passwd

11.1.3  id

11.1.4  查看所有用户

11.1. 5 su 用户名

11.1. 6  who am i  查看当前的用户

11.1.8  userdel

11.1.9  usermod 修改用户

11.2 用户组管理

11.2.1 groupadd 组名

11.2.2  groupmod 修改组

11.2.3  groupdel 删除组

11.3  文件属性与权限

11.4 更改文件权限(change mode)

11.5 chown 改变文件所有者

11.6 chgrp 改变文件所属组

12. 搜索查找类

12.1  查找定位文件

12.1.1 find

12.1.2 locate查找

12.1.3  which /whereis  查找路径

12.2  内容过滤查找与管道操作

13 压缩解压类

13.1 gzip

13.2 zip

13.3 tar(实际中用的最多)

14.  磁盘管理类

14.1 查看目录占用空间大小

14.2  查看磁盘与内存使用情况 df/free

14.3 查看设备挂载情况(list block)

14.4  挂载与卸载(mount、umount)

14.5  磁盘分区

15.  进程管理类

15.1  查看进程类

15.1.1  基本语法

15.1.2  进程信息详解

15.1.3 查看远程登录进程

15.2 进程管理类

15.2.1 终止进程

15.2.2  查看进程树

15.2.3 实时监控进程

15.2.4  网络状态与端口监控

16. crontab 系统定时任务

三、扩展篇

17  软件包管理

17.1  rpm

1. rpm简介

2.  rpm查询命令(rpm -qa)

3. rpm卸载

4.  rpm 安装命令  (多看帮助文档)

17.2  YUM 

1. 为什么要使用yum呢? 

2.  YUM的常用命令 

 3. 修改网络YUM源提高下载速度

18.  克隆虚拟机

19. shell编程

19.1 shell概述

19.2 shell脚本入门

19.3 shell-变量

1. 系统预定义变量

2. 用户自定义变量

3. 全局变量_只读变量_撤销变量

4. 特殊变量

19.4  运算符

​编辑

19.5 条件判断

19.6 流程控制(重点)

19.6.1 if单分支

19.6.2 if多分支

19.6.3  case多分支

19.6.4  for循环

​编辑

19.6.5 while循环

19.7 读取控制台输入

19.8 函数

19.8.1 系统函数

19.8.2 自定义函数

19.9 综合应用案例,归档文件

19.10 正则表达式(入门)pattern

19.10.1 简单用法

19.10.2 扩展用法

19.11 文本处理工具

19.11.1 cut

19.11.2 awk

19.12 综合应用案例_发送消息

20 Linux入门正式完结


 

普知识:Linux系统的大类

Linux系统,主要分为Redhat系和Debian,这两个类别几乎涵盖了绝大部分常用Linux系统。
Redhat系,主要有Redhat、Centos、Fedora等,其中Centos系统是很多服务器用户选择的系统
Debian系,主要有Debian、Ubuntu、Mint等,这个系还有其他一些衍生版本的系统。
此外,还有一些其他系统,例如Gentoo,Arch Linux,LFS等。

1.用于开发的,大多使用Redhat系,其中Centos系统是很多企业服务器使用的系统。
2.相对简单的开发,则可以选择Debian系,优选Ubuntu和mint这两种版本。
3.还有一部分技术相对比较成熟的用户,会选择其他系别中的Gentoo、LFS,Slackware等。

一、基础篇

1. 桌面与终端基础操作

super键就是键盘上的Windows徽标。

办公字典可以查单词。

应用程序附件下有一个文本编辑器。

直接删除一个文件不需要放入回收站------选中,shift+delete。

54616917089044168067e7e6ebab3efd.png

 终端实际上是命令解释层

桌面下的shell是一个仿真环境。并不是真正的shell。打开真的shell,Ctrl+Alt+f2--6

返回桌面环境是ctrl+alt+f1

ctrl+alt释放鼠标

不同的OS有不同操作。乌班图ctrl+alt+f7图形化界面 f1-f6终端界面

编辑---首选项进行字体光标的设置即可

#代表root用户

$代表是普通用户

exit退出终端页面

2. Linux文件系统,目录介绍

位置--计算机。可以看到更多的目录

rm -rf /* 他的含义删除根目录下的所有。递归强制。

Linux里面用的是 / 正斜杠。但Windows是反斜杠。反斜杠编码是转义字符。处理麻烦。所以经常在Windows看到 \\。

挂载点。让硬盘分区挂载到一个文件目录下,首先这块硬盘分区要设置文件格式,然后这个文件系统就可以挂载,被挂载的目录里所以文件都放在这块分区内。根分区下的目录不一定是在根分区所在的硬盘里,可以在其它的硬盘。

Linux就一棵树,根树。而不像windows一样有C,D,E多个树。 

9c3c9e320d764151bb9b70b09b719203.png

如上图,除/boot放在引导分区下,中间最大的一块放在/根分区下。从硬盘上看,boot与/是平行的,但从目录结构(逻辑)上看,boot是在/下面的。  所以称Linux是虚拟目录,它是逻辑上的结构关系。

 /下的文件夹有的带有箭头,他们是软链接,实际上他指向了其他文件下下,他指向的和他本身文件夹内容完全一样。

/boot目录很重要,被挂载到了一个单独的分区

opt全称optional是用于第三方软件的目录

mnt全称mount目录。他的作用类似于media目录。是可移动设备的挂载

proc目录是进程process目录,,对系统很重要 var目录,一般存放日志文件,他是变量的简称。

3.初识vim编辑器(重要)

vim是Unix的文本编辑。vim是vi的升级版,更强大。vim是系统自带的。还有一款更庞大的的体系编辑emacs。它几乎可以做任何事情。vim主做文本编辑,是编辑器之神。

设置---语言中添加汉语。默认第一个汉语设置。

Windows徽标键加空格切换中英文。

进入vim:vim in按下tab键自动补齐

4cea5e5884584f7ca2cb1e79513fe2e8.png

 vim三种模式。保存 :w 意思就是将缓存区写入。起到了保存的效果。:q即是退出的意思。i表示insert插入的意思

3.1 vim普通模式,复制粘贴删除

yy复制一行,P粘贴。按3,然后按P,粘贴3行

8,然后按yy,复制8行

dd删除一行,3dd删除3行

u撤销键。

选择性复制,y,按下$,从光标之后的都会复制。

y,然后按^号,表示光标之前的一行复制。

按w键跳单词,y,加w可以复制一个单词。

d,w删除一个单词

删除行也是同样的用法,d$,d^。

x剪切单个字符。大写x光标之前的会一个一个剪切。

r表示修改当前光标字符,之后按任意字符就完成修改为指定字符。

大写R,之后会从光标不断的复写之后的字符。

shift加^移到行前。shift加$移到行尾。

w移到下一个单词行头,e,end移到下个单词词尾。

b,begin,跳到上一个单词的词头。

gg跳到最开头。大写的G跳到最后。

5,然后按大写的G跳到指定的第五行。

进入命令模式,:set nu(number)这样可以显示行数。

:set nonu取消行号。

3.2 vim编辑模式

delete键删除。

大段内容修改在普通模式,编辑模式适合小修小改。

esc键退出编辑。

3aed5e3c9b0340c1a6df59e9db57acfa.jpg

3.3 vim命令模式

3207cf2c07644432acb57d913c1ad5f4.png

 :q!  不保存强制退出

/查找内容  n 下一个 N上一个

替换substitute

:s/被匹配字符/新字符     只是光标所在的一行    而且只是第一个被匹配的。

:s/old/new/g       加上g代表全局的意思。

:%s/old/new      加上%全部行第一个都被替换。

:%s/old/new/g    加上%全部行都替换,g代表全部替换。

4.网络配置(重要)

4.1 配置网络ip

ifconfig         if 代表了interface。接口

虚拟机三种网络模式图

03fbd4eb97bb49149a3325adf514360e.png

c6c0819a965845d9bfde39a73a53321a.png

 

3b2e6ca918984131a8668734896748e4.png

6719e3cafc97462eab3efa0bf36a01bf.jpeg

77d25b960a5b4f18a24186690bab6ed1.jpeg

nat 为什么要虚拟出一个网卡呢?

因为外网无法访问一个虚拟内网的主机,从而保证内网安全性,这是自己的电脑主机也无法与虚拟机进行通信,但为了让本机与虚拟机通信,就虚拟出一个网卡连接本机,保证主机能与处于内网的虚拟机进行通信。  vmnet8就是虚拟出的网卡。

nat虚拟网卡与虚拟机实际上是平等的,真正的网关是nat路由器。vmnet8与虚拟机共同连接到nat路由器上。虚拟机通过nat转换为真正的主机地址。主机地址再经过他的路由器nat转换成外网ip,实现上网。

仅主机相当于主机与虚拟机在同一个局域网。虚拟机无法与外网连接。因为主机的ip与虚拟机的ip根本不在一个网段,所以无法通信。但由于有虚拟网卡,主机与虚拟机在同一个网段,所以可以通信。因为虚拟网卡ip与虚拟机是同一个网。本机相当于一个双网卡设备。

仅主机模式也一样虚拟出一个网卡,他的网卡名为vmnet1。

配置桥接很简单,只需要在编辑中将将桥接模式桥接到真正的网络。

同一个网络用交换机,不同网络用路由器。

4.2.修改为静态IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33      修改网络配置文件。

service network restart   服务网络重启。可以刷新自己已修改的IP。sevice本身是一个Linux命令

4.3.配置主机名

hostname //返回当前主机名
vim /etc/hostname  //可以修改查看主机名

 hostnamectl set-hostname linux(主机名)    //实时修改主机名为Linux。

 hosts文件将主机与ip对应关系保存起来,以便本机可以寻找到其他主机。

这样的话,主机就可以ping Linux  代替 ping ip地址了。

当然,主机名也可以是域名。

域名劫持就是非法修改hosts文件,让本机故意访问到钓鱼网站,窃取信息。

5.远程登录

ssh root@ip  .如果配置了hosts文件也可以ssh root@主机名 。推荐使用Xshell。

ssh端口号22.

xshell为了让它复制粘贴更方便,在工具选项中勾选如下内容。

08bfde79430946e9b9a2b0fcffc41283.png

 为了上传与下载文件,还要配套使用Xftp。

4eb3db089f37411d82f69b1f966e3686.png

如果Xftp远程系统文件夹显示乱码,还需要修改一下字符集。如下图,

c4a4d06a71484d1894730fc7ae82597e.png

6. 系统管理(重要)

6.1 Linux服务管理

30d096c75aee4224a776af81937554d1.png

从系统开始到关闭都存在执行的服务叫做守护服务,执行这些服务的进程就叫做守护进程。守护进程守护的就是系统服务。daemon希腊语, 半人半兽的守护神。所以Linux服务中很多以字母d结尾的。

centos6(了解)   语法:service 服务名 start|stop|restart|status

333add8a9d1b44c9bc5dec66d1a43ac0.png

centos7(重点) 语法: systemctl start|stop|restart|status|disable 服务名   (ctl是control)

 更多的服务需要在新版本系统查看。b734ed6d073644afb049dbfb09f7313c.png

 之所以老版本服务文件夹还有个别服务是因为在新版本服务文件夹中已有替代类似功能的服务。

network 和NetworkManager一样功能,它们是Linux的网络服务。

6.2 系统运行级别

Linux配置服务开机自启动设置,shell下输入setup就进入了桌面化的服务配置工具。

有星号代表了开机自启动,选中按下空格键就取消了星号。 tab换选选项框。

77d64a81a51242949eb2df5d81d8b08d.png

最上面的俩个服务是老版本的。systemd是新版本的系统服务,为什么新版本基于systemd的?

早期的Linux的版本,是基于Unix进行的设计和优化,在Unix里,它对于系统服务的管理也影响了Linux的做法。Unix有一个非常重要的稳定的版本就叫System5,即SystemV,在这个版本,系统第一个启动的用户进程就叫init,后面的所有进程都是基于init进行调用的。接下来init进程会通过调用init.d目录下所有的脚本来启动相应服务的守护进程。这里的init进程,它其实是整个系统在Linux内核自身初始化之后主动启动的第一个用户进程,所以之后,init进程就会根据用户自己定义的系统运行级别,来去启动不同的服务进程。这里的服务进程到底去选取哪些去进行开机的自启动,是与根据当前系统运行的级别有关系的。

运行级别runlevel,这是centos6的。常用的就是3 ,4与5 。随着运行级别的提高,相应的服务也会增多。

7a2fc4bfe44947db80631518efbc7813.png

centos7为了简化,就做出如下的修改。默认只保留了俩包服务。这俩包服务就对应了老版本centos6运行级别3和运行级别5所对应包含的一组服务。

91cf5dd1adcd49ec878cc13929a09490.png

 a7c6503c6cb041b5a9073367a3d64946.png

补充:如何在之前centos6查看系统默认运行级别

vim /etc/inittab

2e881d5533b747dcb89fc232e1b258a0.png

 之前我们知道Ctrl+alt+f2可以切换到大黑屏。如果在命令行可以输入 init 3命令进入。

6.3 服务开机启动和关闭防火墙

chkconfig --list     查看老版本(cent7之前)的系统服务。这是老版本命令。

老版本系统初始时启动一个init进程,新版本系统替换成了systemd进程。新版本的systemd是一个大家族,它还可以并行启动,所以启动效率比老版本高。

3dd7108cdd614599b471fd4d644a55f4.jpg

上图输出结果,根据不同的运行级别,服务呈现出启动的不同。network服务会在2345级别开机启动。

输入setup结果

1e89e68046bb49caa4a83783a99f9cb7.jpg

当我们把network的*取消后,再次查看服务,发现0-6全部运行级别都处于关闭状态。

我们演示了图形化配置服务自启动,那么命令行如何配置呢?

chkconfig network off/on

chkconfig --level 对应级别 network off/on  //指定某个级别的服务开启与关闭。

services开启   chkconfig配置,发现老版本很麻烦。那么新版本就用systemctl统一了。

查看networkmanager的状态

5cde503f85f7460bb9870d8d8e799bc4.jpg

禁止开机自启动

008fc4c90cc142ee8a5e7cc374243fdf.jpg

得到所有服务开机自启动的信息

systemctl list-unit-files

Linux把systemd下服务和tar包都当做单元来看。

实战:开启关闭Linux防火墙服务,配置防火墙开机自启动。

老版本防火墙是iptable,新版本变成了firewalld。加了字母d表示是守护进程。

关闭,禁止

10e15f49a88e4fb4a7057d394752c2fe.jpg

42df7e002a624fbc96aafb61f78e4372.jpg 开启,打开 a0449300d2e84e73aecee0943b4db4f1.jpg

 注:active,enabled开启,vendor preset默认开启自启。

6.4 关机重启

shutdown    默认一分钟关机

shutdown -c   取消关机

shutdown now  立即关机

shutdown 3    3分钟后关机

为什么关机要等一分钟,有延迟?因为Linux系统的系统特性,预读与延迟。数据读写的时候,在内存中的效率比硬盘快的多的多,所以在内存中单独拿出来一个缓存区域,等这个缓冲区域满的时候在送入磁盘,而不是像Windows那样保存缓冲直接写入磁盘。这样做的目的是为了提高系统读写效率。

注:buffer缓冲

这种方式有好处也有坏处。他的坏处就是在当写入缓冲区域,这是如果手动执行立即关机操作,会导致缓冲没有写入硬盘造成丢失。或者意外断电导致无法及时写入硬盘。

为此,Linux有一个sync命令。它的作用就是立即将缓冲区域内容写入磁盘。

其实在执行shutdown now时首先就执行sync,然后再关机。

71573bed0e1448cf9b3e4e2f597108d6.jpg

 注:halt停止  --halt 等价于 -H

二、实操篇(常用基本命令)(重要)

7.shell含义解释

325b8745cd0944d09e0a5810b50e174d.jpg

bin目录下的sh命令就是shell入口,所以Linux执行文的拓展名也用.sh标注。

Unix最终解释执行的终端sh(全称 Bourne Shell): 是UNIX最初使用的 shell,而且在每种 UNIX 上都可以使用,它的优点是可以进行功能强大的shell编程,但它处理起与用户的交互就差一点。bash(全称 Bourne Again Shell): LinuxOS 默认的终端,它是 Bourne Shell 的扩展。因为Bourne shell在与用户交互方面比较差,所以Linux对齐做出了改进。

bash的由来即使如此。

但是bash又显得复杂,这样其他的Linux版本对此做出一些简化,Debian,Ubuntu它们的shell解释端口是dash。

52322664573845729ed0b4595c170c7b.jpg

除了bash,dash还有一种shell是csh。

67aade51c8034b9084348b53a1807b99.jpg

ls -l /bin/          l代表了行,表示以一行显示详细信息。

8. 帮助命令

1. man(manual手册) 

man命令实现中文化

yum install manpages-zh

如果发现查命令不存在这个包。那就在yum库查找

yum list |grep man.*zh

这时会查到一个包,进行安装

sudo yum install 包名

如果找不到包名,进行yum更新

yum -y update

man cd  发现显示的并不是cd的手册信息。因为cd区别于ls命令,cd是一个内置命令。内置命令还有exit等等。

fee4a000d80248a9b8d4bf2b795ea124.png

如何查看命令是否为内部命令还是外部命令?  使用type命令。例如type cd。

9c08e0f4afd14bb2b0bd1ff77e4ebc9e.png

5cf4502616784c28a4cdcee89840a297.png

history命令把我们之前打出的命令全部显示出来。

既然cd是内置命令,那我们怎么才能查看到cd呢?     man -f cd

结果显示了cd有好几个文档标准的解释,如图

9bec3056340b4703bb8740a7256a9e71.png

 接着输入  man 1p cd   就查看到1p关于cd的详细解释了

最后在查看一个man命令。 man man 查看man手册的信息

2. help命令

我们发现man命令现实的内容很多,过于复杂,那么有一种更简洁的帮助信息手册。

格式:help 命令

例如help cd  。

但是help命令只能查看内置命令。如果外部命令查不到。例如 help ls 

那如何用help命令查看外部命令?  外部命令给我们提供了一些简化帮助信息。我们可以输入ls(要查询的命令) --help获取外部命令的帮助手册

最后,建议都用命令 --help,内置命令也可以采用这种help查询方法。

补充:shell使用技巧

reset重新启动shell。clear清屏。

 e3c0b7fbc4664adfa1b25b18bdc08492.png

9. 文件目录类

9.1 目录操作命令

1.  pwd  打印工作目录  显示当前工作目录的绝对路径。

c3521f45856b4c3b9eaed8d6486b17c1.png

如上图,我们知道在用户1文件夹下,yonghu1是当前目录,但是当我们忘记用户1文件在哪时pwd就发挥它的作用了 。pwd也是一个内嵌命令。

2.  cd -  返回上一次的工作目录

3.  ls 常用选项-a,  -l 

45ec9b3f6d924ab9b22ef2edf3a2652f.png

Linux用不同颜色区分了目录和文件。配置文件.bashrc非常重要是用户的重要信息配置。ll命令其实是ls -l的别名,它俩效果相同。

87c210faa3114e7e806736ee6655748d.png

4.  mkdir b c     

创建俩个文件夹    mkdir d/e/f  这种创建方法错误   纠正: mkdir d d/e d/e/f

上面创建嵌套目录的方法很麻烦,还有一种简洁方法 mkdir -p d/e/f   

-p 是parent父的缩写。

5.  rmdir   只能删除空目录

rmdir -p d/e/f     如果删除f后e文件夹为空,则继续删除e,依次类推。

9.2 文件操作命令

1. touch

   文件名可以不带后缀名,默认是文本文件。

2. cp      如果cp的目的是一个文件,相当于要把源文件内容覆盖目的文件。

cp前加一个\cp 表示直接覆盖不提示。不加\是有覆盖提示的。

02c842f45cee46b49840c38d2c23cc4f.png

为什么cp默认提示覆盖?

ddf0fdacea804868aa04d2793b4dd247.png

因为cp是cp -i的别名。-i是interactive交互的缩写。用help cd发现-i的描述如下

b9606eb203564c0db8509f03daa014df.png

加\的意思是使用linux里的原生命令。

注意cp也可以复制目录,如果要复制文件夹的子文件夹和文件需要加  -r选项。递归的 recursive,递归recursion

拓展:为什么ls命令输出结果为带颜色的?因为ls是一个别名,实际上ls已经做出了颜色处理。--color的作用。

8477c3276e3b40eb81358d2bb82cd861.png

45a9c0b31f6648c6b28c957b80c737bd.png

如何查看Linux中带别名的命令?  使用命令alias(别名)即可。

cf02d674e9de41da99dc95b8deca7c51.png

 3. rm    默认移除有提示。

1f1f6964cf4e4ffa82d5798130c8ca23.png

rm默认是删除文件的,不能删除目录。要删除目录,需要加-r选项

rm -rf a/   意思是删除a目录和a目录以下的所有文件。注意包括a目录。

4. mv命令 

e6fa478f66d341ddaf96160a7efcb73c.png

5. cat   (catch捕捉) 适合查看内容少的内容文件

-n选项显示所有的行号。

6. more   适合查看文件内容多的文件,可以分页显示。但他的效率还不是最高的。

7.less   less可以像vim一样输入命令查找编辑,比more功能强大

9d220167de824c13bde8ef8d1081f684.png

因为less是动态加载,所以打开大文件的速度很快。

less查看文件是按下  =  会显示详细的文件信息。 

0cc90e9a9ae04273a8fbeffef1aa9013.png

9d472e132bda4df4b9324ffcae754155.png

9.3 其他命令 

1. echo  输出内容到控制台        重定向

echo 【选项】【输出内容】

5b07ec9177bf454bbca20a8615066434.png

没有加-e之前的输出     \n换行没有起作用

c33b2bba86674c23a5fc182e3d63bf7b.png

 有-e选项时

c78b01393c8a4d9b8087aad0da9dc06c.png

那么如何将控制台输出写入文件呢?echo加重定向  echo可以将自己要写的内容加入文件

 3a73a9f32e7c47b4bea8d6aa0447d47f.png

echo写入相比于vim,不易产生误操作。

echo $接着按下tab,  查看系统环境变量。

 为什么ls,cp,mv这些命令不在当前目录下,为什么可以执行?

因为这些命令的路径都在系统的path环境变量下

243295022be5453f86a17f734d82a87e.png

 2. 监控文件变化_head_tail

9633f970790847feb2498dedf5ebe0c4.png

 

ad96f8a8b6554859a4a46560071c7cda.png

 注意  tail -f 文件         监控日志文件

这条命令相当于启动一个进程用来监视,它并不会直接退出。

Ctrl+s暂停    Ctrl+q继续   Ctrl+c直接退出此进程。

如果监控文件,但是用vim进行编辑,发现监控不到变化,这是因为监控室按照文件索引号进行监控的,vim编辑导致文件索引号发生变化,所以不能进行追踪监控(ls -i 文件  查看文件索引号),涉及到系统底层知识。索引号变化因为vim貌似是先写临时文件里,保存是直接覆盖的。

3. 软连接(link)  -s的s代表soft简写

d352384a5e2248f1a3afbdf4eae4e2d5.png

软链接后面/解释:其实可以理解为加个/就进入了真实目录中了,这时的路径代表真实目录下的所有内容

 b8a5a447dc144e41a4610b2bedfc9dda.png

最前面是 l 表示是一个链接。

当然上面的软链接名也可以是指定路径。如下图myflider指向了一个目录,myinfo指向文件

987c0e4b343446059f114b58b6c6bbd4.png

在一个链接文件下,如果要查看真正的路径,可以直接使用目录pwd -P,作用:直接查看物理路径,如下图

8171ac98e029422a95a8de6875696e02.png

同样-P也可以适用于其它命令。例如cd -P 链接文件  ,这会直接跳转到实际的物理路径。

2eebde52a8494235b1b22bb0cfe529f1.png

/bin 的实际路径为 /usr/bin

硬链接语法:ln 文件 链接名

硬链接相当于直接连接元数据,与原本的文件名平等;软链接相当于保存对应文件的地址,没有直接连接文件的元数据。当硬链接数为0时,文件就删除了。原始的文件名指向文件的iNode信息,软链接不直接指向文件的iNode,而是指向原始文件名的地址硬链接是直接指向文件的iNode

4. history  查看已执行的历史命令

history 10   显示过去最近的十条命令。

使用历史命令直接  !历史命令编号

history -c  清除历史命令

10. 时间日期类

10.1 date

6c4cc3d9d3a64fcf9f69a8d6bec67095.png

(1) 提取具体信息

02f91a52d2794beda6be5b375ddd4688.png

07162541348b4b2a9b4b0b7511820a55.png

 93e38d6e6a394cc798dec55a92906a29.png

 小写s 表示一个时间戳。时间戳是从1970.1.1开始到现在的总和。

(2)date显示非当前时间   也可以是其他的时间例如hours,

52332def303c42f9b690d0ab72f8d2b3.png

(3)date设置系统当前时间

 dc54153835f246efad25846726d6bc1a.png

 10.2 cal 查看日历信息

8ca487bc62ba47e18f58231a6f8dcb4b.png

cal -数字  查看相邻月份日历 

查看系统当前本年度的日历 cal -y  查看

cal -m 以星期一为第一天显示(Monday)

bc32ac3877f8478ab0798726892d17f7.png

11. 用户权限类

11.1 用户命令

11.1.1  useradd

Linux是多用户的操作系统。

1f685c6af01d41618e87cf7798a813e9.png

超级管理员在/root下, 普通用户要求在/home目录下。

更改用户主文件夹名使用-d选项。默认用户名与主文件夹名称相同。

fecafb57a9894dcd8c1dba3ed963d8bf.png

11.1.2 passwd

passwd 用户名      密码默认要8位以上,当然123456也是有效的密码。

11.1.3  id

id 用户名

11.1.4  查看所有用户

9f82f9cc5217440493c89d73351836ed.png

发现大量的系统用户,它们去单独执行系统服务。

密码只能在/etc/shadow文件查看,而且还加密过的;/etc/passwd 中x本来显示的是用户的明文密码的,为了安全考虑,就为密码单独创建一个文件,来专门存放用户的密码信息。 俩个数字一个是UID一个是gid。

各字段的含义:

第一字段:用户名;第二字段:密码占位符,第三字段:用户UID;第四字段:用户GID,第五字段:用户的全名;第六字段:用户家目录;第七段:用户的登录shell

自定义的uid从1000开始

我们发现上图的一些系统用户是nologin,无须登录的。

11.1. 5 su 用户名

11.1. 6  who am i  查看当前的用户

查看最初的以哪个用户登进来的。相当于一个进程监控。

c363d755fbd44dd5a936740a285366e1.png

因为是root登入进去的。whoami显示当前的用户。 

11.1.7  sudo命令

5ad5486defea465dac347383d5c6709e.png

4194c24757e440ddb8bc2e7876cae653.png

a806f33713fe4906b7c063b3fca96e95.png

如果普通用户不在sudoers文件里,是不能使用sudo命令的。(kali每次都会提醒你。权力越大,责任越大。 )

11.1.8  userdel

userdel 用户      删除了用户,但该用户的文件夹还存在。在日常工作中大部分是删除用户不删除该用户的文件夹。提示:已转岗或离职的员工曾经的工作文件以后可能还有用。

userdel -r 用户   同时删除文件夹和用户

11.1.9  usermod 修改用户

50d50286ffed4f11bf5eb13d4146ac8e.png

11.2 用户组管理

11.2.1 groupadd 组名

为什么有的用户不在sudoers文件中,但也能使用sudo命令?因为组赋予了它的权限。

07aa7b90fb7f4ca88b3613feada9f100.png

921fdfe4b9414ff99856c4613780c9d9.png

用户在wheel组中即可使用sudo命令。

11.2.2  groupmod 修改组

11.2.3  groupdel 删除组

11.3  文件属性与权限

不同的用户与组对系统的文件权限有所不同。 

a33ef917c5f44b01bb005a72ab5133c9.png

文件的属性:

c, b类型表示设备文件。c表示字符类型的设备(鼠标,输入操作涉及到字符,b表示块设备类型文件,比如硬盘)。此外还有- ,l ,d类型。

37fa0fc12beb43da8866a4cc23bf34f2.png fdf547ed693046a180c4fa47cbd87d04.png

像一些文本文件,配置文件,属主用户也没有可执行权限。

87dc99bcd27b438cb5a78b36fcd91fd5.png

3da03d1d8fe849639818ce73bf8a3d93.png

文件的第二块内容才是硬链接意思,而目录不是硬链接。公共目录的第二块内容就是它目录下的子文件夹数量。

11.4 更改文件权限(change mode)

语法:

7d264d1f50a6467a8e590c95a95b20be.png

=是赋予权限,+-是在原有权限的基础上做权限的改动。文件权限更改需要root。之前加wheel组,加sudoers未免给用户赋予的权限过大,所以这种chemod更细粒度。

c0f5498b38934371bf128538fdd44b7b.png

11.5 chown 改变文件所有者

39fd623441324defb73eb1b53a7757a9.png

11.6 chgrp 改变文件所属组

d37fe99566c74af6b3f0c6de146ab7e6.png

12. 搜索查找类

12.1  查找定位文件

12.1.1 find

ebaa0cfa18914dcbae2d7bee522e5844.png

fe2ec21f4c03488cbe4a52d1ca4d7c35.png

0ef7be3cd1ea4f94a6870548bf44b7ac.png

寻找/root下的文件大小大于10M的文件

c06ce5537ce843638c117fa3757b0053.png

12.1.2 locate查找

find是在本机硬盘进行查找,而locate命令是实现建立本机文件与路径对应的数据库,默认每天更新一次,所以会产生延迟不同步,如果修改某些文件路径后需要查找需要先更新一下数据库。locate命令查找很快。

36936bae39d94a8d9b800219d7d9ef9e.png

updatedb

locate 文件 

locate是一个模糊查找,只要包含想要搜索的名字都能列出。

12.1.3  which /whereis  查找路径

d0d366254d7c47d6a6669745469d09fc.png

12.2  内容过滤查找与管道操作

17f4b42b08c24810ba56bad9cd0e7133.png

直接查找文件的内容

2b05320917544722ba8203d8f06d8969.png

结合wc命令(word count)显示行数,单词数(空格分开),文件大小。

f5aa4844d93144fd8161cdbab295dc3d.png

13 压缩解压类

可参考:python_Linux基础_黑马_莵莵的博客-CSDN博客

13.1 gzip

9ac90627019449fdb7e93872a4c4dda2.png

如果没有对多个文件进行打包,压缩多个文件就会产生多个压缩包。

13.2 zip

gzip知识简单的压缩和解压。而Zip可以打包归档解压缩,功能强大,还可以保留源文件

65f1297184714d1393028f46a39812aa.png

13.3 tar(实际中用的最多)

34b9cffb4ec84101a7a7b8aeec73dbb3.png

14.  磁盘管理类

14.1 查看目录占用空间大小

5b37d0d1ef75425e9c015103c8e1b39a.png

ls不会嵌套的统计所有目录下的其他文件大小。du帮助我们有效查看文件目录的磁盘占用情况。

7331aead7b3a4037b085050d73291715.png

执行du -ah后。最后一行  . 就代表了本文件的总共大小为99M。  a96c970969d346789c42292dac25d02c.png

只显示目录下的一级。 

42f9e83f42284a31a3201011f480bff2.png

14.2  查看磁盘与内存使用情况 df/free

449147e28552474a80a29f4dbd41fc7b.png

23ca10580a9e40fd86200f84c3e5a87e.png

dev设备区,第一块硬盘分区给了boot引导分区,文件名是sda1(发现引导分区只需分配300-500M最合适)。第二块硬盘分区给了swap分区。第三块硬盘分区给了根分区,故名sda3。

tmpfs(temporary file)是一种特殊的文件系统类型,它是基于内存的文件系统,它不管是真正的内存还是swap(虚拟内存)分区,它们的文件系统是一致的。shm(share memory),是系统所有进程都能访问到的内存区域,默认大小是系统内存的一半。run是运行时的内存,内存和swap分区与运行时(run)和系统sys相关,所以它们挂载到了run/sys目录。

devtmpfs是Linux内核启动创建的特殊文件系统,创建一个dev目录,用来管理当前所有的设备。

free查看物理内存和虚拟内存。使用情况。

14.3 查看设备挂载情况(list block)

d57a27906cff4827895fc53ab42690d0.png

ce9a2ba28c2c4cb7bae5b25de6e0b3e2.png

mountpoint  挂载点   sr0 是光盘存储设备。

注意如果使用的是其他的硬盘文件名称不一定是sda,除了sda还有hda,vda。硬盘类型有IDE,SATA(容量大,廉价),SCSI(速度快).。

IDE第一块硬盘hda,第二块是hdb。

SATA,SCSI这俩者第一块硬盘是sda,第二块是sdb.。sda后面的数字代表的就是分区信息。

如果是虚拟化的模拟设备的话就是vda.。

查看分区的文件系统-f 选项

55108370744845e6b7f21ebada75976d.png

xfs,ext4.

永久挂载可以用uuid或者硬盘名.。UUID就是系统为一个分区创建的唯一标识符。

14.4  挂载与卸载(mount、umount)

一个设备要想被直接访问必须被挂载到某个指定目录下,没有挂载目录无法直接访问其信息。

731fb0fbf657469dab32a5d46144dec6.png

没有挂载的分区就无法查看,所以先挂载再查看里边的内容。

光盘挂载到mnt目录下。mnt就是mount的缩写。

(1)添加光盘

9a8dd6742cfb46c4b56bd7d702dfc421.png

(2)挂载点设置

 最初插入光盘时Linux系统自动给我们进行了挂载。2376122fb00e4cefb855a841dcd2144e.png

它被挂载到了run目录下。

右键弹出,发现光盘挂载点没有了。

3b80c0c1f0a04886a1e40f9172b801de.png

使用手动挂载光盘 

4403d60390c140209ff1fd72846cf80d.png

bcc4afe22f0b42d196fbd6fcb96b3d9a.png

device设备名就是sr0,或者cdrom。光盘挂载到指定目录/mnt/cdrom。

dbdbf4c082354966b20d20e475dad4d3.png

图形化界面会自动帮光盘挂载到目录。但我们想自己配置,因为之前弹出光盘,所以出现找不到设备的问题。这是需要注销root账户,然后重新设置cd/dvd状态为已连接。在登录root账户即可。

ba7b1f899b1e40eca3aaea671f93ec06.png

卸载后,尽管目录存在,但是里面的光盘内容就没有了。

 62d14eb28c6f4d3a81ffdf636bbc75e2.png

 设置开机自动挂载只需要加入一行内容即可。fstab(file system table)里面保存了所有的设备挂载信息。UID使用设备名也可以。

8a7e87e983d942d6b227e8b8763fc0a9.png

40782866960d462eb1a304ab19621c56.png

后面的俩个0.。第一个0 是dump选项,如果是1自动备份,0表示不自动备份,kdump就是定期进行备份,以防系统出现故障时进行回滚修复。后一个0代表文件系统检查的优先级,fsck(file system check)是 文件系统的检查和修复 ,开机的时候每次都执行此命令,检查时就会根据分区文件系统的优先级进行先后顺序的检查。0表示不检查,1优先级最高,2优先级比1 低。

14.5  磁盘分区

上节学习了如何添加一个光盘以及如何挂载与卸载,那么新添加一块硬盘该如何配置呢?

ae7ed3016cb44860b574bf0afb456f4d.png

c373fd18f07448fe9680eaceaae298c2.png

 添加新硬盘需要重启识别,不像光盘一样可以使用热插拔,reboot重启识别出新硬盘。

输入命令进入配置硬盘模式

cd7eed3ef5654a22af1d735171f37bd0.png

对MBR分区而言只能分4个主分区,现在都是GPT分区了,主分区无限了。

扩展分区序号5-16,最多12个扩展分区。(sdb1,sdb2……sdb16)

划分出一个分区

611768407692482a990f9fb920dc604a.png

虽然划分出了一个分区,但是还没有指定文件格式,系统仍然无法识别这块空间。没有文件系统就没有UUID,也没有相对应的挂载点。 

 a8d7982187bf47c3a8327ca5db502b80.png

指定文件系统并进行格式化操作mkfs(make file system)

f0aa518511a34de9898714b6000191b1.png

-t (type)指定文件类型。  设备名/dev/sdb1 。这样指定文件系统后就有了UUID,但是,还没有进行挂载操作,这也是最后一步操作。 

一般我们添加的新硬盘空间都是分区后挂载到home目录下的不同用户下,这样让不同的用户使用他们自己的硬盘分区,更便于管理。

如下图,将新硬盘挂载到了home目录下的用户文件夹下。这样我们只要在这个用户文件夹下的存储的文件数据都会存放在这块新硬盘中。

ce4027d50c114174bbdf221fdc2edee5.png

如何在挂载期间存储了文件,之后把这块硬盘卸载了,那在这期间存储的文件也会消失,无法访问,那原来的家目录文件夹又重新划归到了sda3这块分区,属于了根树。

15.  进程管理类

15.1  查看进程类

15.1.1  基本语法

执行系统服务的进程叫守护进程(文件名最后有个d)

fc66542e2fd6451394e927b5cdf49e84.png

注意到选项有加-的也有没有的,这是因为加-表示的是Unix风格,不加-表示的是bsd风格。 

不带终端表示后台进程。PS默认只显示当前用户进程。ax搭配将会显示所有的进程。

ps aux | less 

ppid表示父进程ID。pid进程号

15.1.2  进程信息详解

ps aux  信息说明

1ba15c44db394740847f26f6a44c6b93.png

b147bf1505d14889b4374ae0911c9eba.png

 

vsz虚拟内存并不是等待内存空间满了才放入虚拟内存,而是系统根据内存页面置换算法,把不常用的页面放入虚拟内存(磁盘swap分区),而真正一直需要的才放入到真实的物理内存中。

tty(teletypewriter)电子打印机。tty1 桌面环境  其余tty 就是之前使用的大黑屏。pts,每多一个进程就会多一个pts虚拟终端。

<表示当前进程是优先级很高的进程,N表示当前进程是一个优先级比较低的进程。

1号进程是当前系统执行的第一个初始用户进程systemd。早期版本是centos6的init进程。

2号进程也是非常重要的一个进程,他代表了内核线程的调度工作,始终运行在内核空间。许多系统级别的服务都是以系统线程进行运行的,都由2号进程管理 

0号进程是idle进程,属于系统级别的进程,是第一个用户进程systemd的父进程。

用户的系统级别进程发现大部分父进程都是2号进程。用户进程大部分都是1号进程。1,2号进程都由系统0号进程启动。

ps aux

667e16f6d05d4f6290493d1079ca126a.png

ps -ef

9c065c9dc45a43099f1aba5dbc8c8b73.png

 b83fdfdb02a045e69581dbda273d7998.png

15.1.3 查看远程登录进程

16ed1f2d7e214f52919c6f998417f506.png

第一条ssh就是系统ssh守护进程

第二条是我们使用ssh远程登录产生的ssh守护进程的子进程。

第三条使我们在终端输入筛选查询sshd命令是产生的,他的运行终端发现是虚拟窗口pts0,它没有在后台。

8a7aa1a477eb49eea55d0b83f936f58b.png

当普通用户登录系统时生成俩个ssh进程。进行普通执行时用最后一个。当普通用户执行root权限时,就会root用的的进程,即第三个。这样做的好处就是可以实现权限分离。

15.2 进程管理类

15.2.1 终止进程

基本语法

7b164cf16c4a434fa0d2fc56a28145e8.png

c6a5e953927f4c66a57ba284226f9d7e.png

如果kill用户ssh进程,用户退出,如果直接kill了sshd守护进程,相当于把后台服务关闭,其他用户再次使用ssh登录也就无法成功连接。

如果关闭了守护进程,我们只需重新开启服务,这样,所有的用户又可以重新使用ssh登录远程主机了。

b8c6e19e1774428489e78624688f2de0.png

注意下图的父进程与子进程关系

09e39c12b3054ce2b4aee4c1407f2d8b.png

 之前killsshd守护进程时,还在以root用户登录,所以在关闭服务后,root用户的ssh父进程变为1号进程,当再次打开sshd守护进程后,重新以另一个用户登录,发现他的父进程就是sshd守护进程。

9b490fde574e4e74ab94878f35a4c900.png

 3746号进程是什么?

查看3746号发现它是root用户登录后启动的bash进程,这样我们就清楚了进程之间的关系1号进程→sshd守护进程→用户远程登录进程→bash进程。这也就是为什么在bash中敲出来的命令都是以bash进程为父进程延伸出来了子进程。

如果是正在运行的进程简单的kill是不能关闭进程的,需要-9强制关闭选项。kill -l  列出各个数字代表的含义。

如果要kill多个进程,需要查询相关的名称,用killall命令就全部关闭了。

3abb7cc65840408dbf16257063fb54c5.png

注意一旦杀死守护进程,而且当前没有用户登录远程主机,这个时候只能通过物理机重新启动sshd服务,只有重新启动后,所有用户才能远程登录到这台主机。

15.2.2  查看进程树

pstree命令查看进程树 

02daa7ac54fb4fd381d9dba5e26af38d.png

查看ssh信息(第一个是systemd)pstree | less

3b6b9044d8844095a8584b4c1c1adbe2.png

pstree -u | less

83056dd25e704f7585910db1326da1b2.png

上图中是以root用户登录的,某些进程是系统用户启动,所以会加()进行说明。例如colord用户。如果系统用户创建的进程的子进程又变成其他用户时,也要用()予以标识。

15.2.3 实时监控进程

cdd602dd72b14ef48fa71b04eb5f1198.png

 监测信息说明

daa25b58c1684fff8581a65a0304fa64.png

up距离系统开机运行了多长时间。在物理机上登录的桌面环境下的也属于一个用户。load average 平均负载(过去1分钟,5分钟,15分钟)三个指标小于0.7都是正常的,如果大于1表示超负荷了。CPU信息,us表示用户进程占用(不包括改变程序的优先级进程),sy是系统内核进程,ni是nice友善的,进程友善,优先级低,进程友善程序低,优先级越高。id(idle空闲进程),wa(wait)等待I/O进程。hi硬件中断进程,si软件中断进程。st(stolen)被偷掉的进程,本机还能在开一个虚拟机,被虚拟化设备占用的时间占比。

PR任务调度的优先级priority。NI用户指定的友善级。VIRT虚拟内存占用大小virtual memory size。RES实际物理内存占用大小

SHR共享内存占用大小shared memory size。S表示进程状态status。command表示生成当前进程的命令。

shift+m改变为以内存占用排序。最占用内存的就是图形化界面gnome。 shift+p按照CPU排序。shift+n,按排序号,由大到小

1134a1f12ea3429f936110f93e3a26c2.png

top -i  只要刷新时段内用过CPU的进程,都会显示,但这些进程可能在刷新时点又睡了。也就是说这个选项,不一定只显示r状态的进程,s状态也会显示。

进入top命令后,按下小写的u,会提示输入哪个要查看的用户,空格表示还显示当前所有的用户。

2a5f8372120e4c4a987aed5515e19a66.png

执行top时 按小写k 可执行终止进程操作

55909cc61734401ab42fb6b0a3f2dfe7.png

发现还会让我们输入一个信号,这个信号就是之前kill -l看到的所有的数值。9代表强制关闭运行的进程。

15.2.4  网络状态与端口监控

netstat命令

d26d18c9d8e54bee877083c97871adfd.png

套接字本质就是个数字,这个数字标识两台主机两个进程之间的连接,向套接字文件中写数据就相当于给对端主机发送数据,从套接字文件中读取就相当于从对端主机接收主机 。ip地址+进程端口号 = 套接字(socket)。socket 是一个接口 为了让应用层使用传输层的服务。sockect 是应用层和传输层之间的层间接口。

监听就是说它的状态处于listening。-n选项就是不用主机名,全部显示成对应的ip。

netstat -anp显示信息介绍

edb3467ba9784916a3c4f35cb160297f.png

tcp6表示ipv6方面。recv-q表示连接到socket的用户程序还没有拷贝的字节数,就是已经接受到了但是还没有拷贝出来的字节数量。send-q表示已经发出去了但是远程主机还没有确认收到的字节数量。意思就是接受队列和发送队列 。0.0.0.0表示本地的所有地址。

bfd2385f81a14386923fa4c29745660c.png

从物理机2个用户远程连接到服务器的信息。因为xshell在物理机,所以显示的远程主机ip为端口号比较大的这俩个 。而固定端口号22的俩个ip才是服务器的ip。

16. crontab 系统定时任务

crond是一个服务,首先应该确认一下服务状态

499d18f9a72641a182f61abb722c6ed4.png

-e  选项的设置 

 fba73fbc7e1e40128f3eb51f6787f76f.png

执行的任务就是在命令行中的命令。* 的顺序是按照使用频率的多少进行合理安排的。

具体的用法说明

c1decca1e23b442c9563d9bb20ee87ce.png

n最小就是一分钟 

具体案例

d51573d42df74098980c85fe98f9233e.png

案例:每隔60秒往/root/hello文件中写入一句hello world。

crontab -e

74b59c4a6a9c49719a89149a5da23eb4.png

53772a59cd0846439b44ca31e0a7c307.png

e8c6a4791d46412b89168831f2c21ac5.png

tail -f 实时监视文件

 

三、扩展篇

17  软件包管理

17.1  rpm

1. rpm简介

Ubuntu使用的apt-get

红帽系列使用rpm。

d1ace0fa668f4d3fb2acf82f333326a4.png

64位是x86_64。

2.  rpm查询命令(rpm -qa)

q查询   a所有 

9719ff4b505945ea973e4ff629ee4dc5.png

147330326e6b467ca6588a7d20f18aef.png

-i 表示information的意思 

3. rpm卸载

096b21f61ecd4435b964f3bbcbcdad7e.png

 -e  eraser清除

4.  rpm 安装命令  (多看帮助文档)

f7c7361ebef843f7a6b0818cf6a0b68a.png

 注意:安装不同于卸载,安装必须使用包全名,卸载只需要软件名即可。

包全名在我们挂载的光盘上有,输入lsblk查看光盘挂载目录

b9b2da1540b24724a410fa7934b8e5c0.png

a3128b44b08249f5bc22fbb298f19e09.png

发现sr0即是光盘ISO镜像。 

2cfec0fe928845afab1eaaf087f776a4.png

发现ISO镜像光盘包含许多以  .rpm 为拓展名的软件包。从这里就可以找到我们所需要的包全名。 

17.2  YUM 

1. 为什么要使用yum呢? 

rpm包管理缺点:1. 首先必须下载rpm软件包。 2. 还必须安装输入包全名。3. 不能解除依赖关系,如果安装的包有依赖另一个包,则rpm会安装失败,还需要先安装这个被依赖的包,结果被依赖的包又依赖一个包,所以很麻烦。

那么YUM就提供了一个“一键下载”的功能。

34c2bfc8975448a5bf48065235d94529.png

yum下载原理图

94ca57def4be498aa78c7674a27e8bf8.png

2.  YUM的常用命令 

93e0b6d1159c4b87949beea049c37e4f.png

d60d082be21842b2a661ca1c2d408fe9.png

案例:

c0e7c1c03a704eb09d4bfd6987aab23d.png  f482d882b28243a08fa64850b543472b.png

 

最后rpm查询验证是否有包。

03d176c7262f4d8e9fab5d5f8db67b9d.png

@号表示自己已安装的版本 

 3. 修改网络YUM源提高下载速度

wget可以从指定网址下载文件

337f332f9b7d45518a9fb87aa42a18c3.png

494eecff35324776937bdefad261709e.png

查询YUM源文件 , 第一张图是官方默认,第二张是阿里云

46434357330b4af8a99bf933ac7ad076.png 598c57dc74354dde8c656ac52d76f683.png

 YUM会自动从官方镜像更新为距离自己最近的YUM源,所以不用配置也是完全可以的 。

18.  克隆虚拟机

VMware 复制虚拟机、克隆虚拟机_虚拟机克隆_蚩尤后裔的博客-CSDN博客

如果克隆出来的虚拟机和母机ip一样,需修改为不同的

a857606892e1476d841711d22cb47b7e.png

主机名如果与母机一样,则使用命令修改为不同的主机名

d7d43cc242ac43238ed56ca21c73519d.png

上图的命令直接修改了主机名。

虚拟机可以迁移到其他电脑,只要将虚拟机对应的文件全部拷贝下来,直接在另一个主机用VMware打开虚拟机即可。

xshell登录时主机项如果没有配置hosts文件,就填服务器ip地址。

19. shell编程

19.1 shell概述

shell是一个翻译官,负责解释。把外部应用程序的命令解释成内核可以执行的指令

除了一行行的指令解释执行,还可以编写成一个文件执行一整块命令,这样的可执行文件就叫做脚本。

027df4a16d6f49b18105f3219d641119.png

36c962119b5348638ebe170c15630295.png

 dash(Debian系)。bash(红帽)【大部分Linux发行版本都默认】。最初的shell脚本来源于Unix的shell-- Bourne,他可以进行灵活的shell编程,但是用户的交互能力差,进而发展为bash 。 

19.2 shell脚本入门

脚本的文件后缀默认都是  .sh 。当然脚本也并非必须的带文件后缀,只要是个可执行文件即可。

44f638856e874ee0922513e60cb4028b.png

791f1666e4904613ab1df68be55684be.png

在实际中我们常常用第二种方法,即直接敲出脚本就能执行 (常用相对路径方法),不再依赖于bash 脚本。这个脚本本身就像一个命令一样直接执行。

b423111808c6484496dffe8bcaeee5ee.png

7bb7d75fde9b48aebc5b20cf82786704.png

第一种方法执行不需要赋予文件x权限,那是因为bash调用,bash本身就是一个进程,所以相当于bash进程直接执行调用,脚本被当做bash的参数进行传入的; 第二种需要赋予x权限是因为 要在当前的bash环境中进行执行,需要赋予执行权限才可以正常启动。

第三种执行方法

27502701ded04fd69b57399d75a1446c.png

5de04ebd028b4660ab97f435115c3ab1.png

source和 . 与之前俩种方法执行有所区别。前俩种方法执行脚本会在当前的shell环境下开启一个子shell进程执行脚本,相当于在shell中嵌套一个shell;而source和 . 是直接在当前的shell环境中进行脚本执行。source执行还能起到一个实时更改配置文件的行为。这也是为什么Java配置环境变量,需要source一次。

3b3ffe3d3b4142a4853bd8d981e21b6f.png

d34e355cdc644ec5b063883a151d4a3a.png

7917325b9a5646e3962e40debb4aa781.png

子shell  ,敲入bash即可创建一个shell进程

5a62b5fceff14d63bb3482567b2dfc2f.png

68c8f7c66aa84a2eb66b756904266ca3.png

此时由于在子shell中,所以exit退出也不会直接退出shell终端,而是退出了子shell。

19.3 shell-变量

1. 系统预定义变量

 9d4bb914610e44abb5ad1e36b3a91e5f.png

子shell与父shell之间的环境区别 。这就是上一节中shell执行hello.sh未找到命令的原因。

比如父shell定义了全局变量,子shell进行了变量修改,返回父shell仍然不变。

这就涉及到了变量的知识,这节主学变量。

系统变量

403a2772882c42d2bad03b33d389973c.png

变量就是内存中的一块数据。用变量存储我们当前shell会话 和工作环境相关的一些信息,所以这就是环境变量名字的由来。

shell环境变量的分类:系统变量,用户自定义变量。;或者分为全局变量,局部变量。

查看当前所有的系统创建的全局环境变量,不包括用户变量,env命令。

972e17cead064814921ff15a1f8f7cf7.png

注意有的命令不加$。

全局变量在子shell也是可以输出的。局部变量只能在当前shell中执行。 

35a812abb1944c7e963e46e3875067b0.png

2. 用户自定义变量

6fe9eca7983848ee9201bdbbb4d1ed15.png

b8ed058296864cdf9aade5cc4598449b.png

9bf94a6d66684c6faaba56cb1e04e43a.png

发现子shell并没有之前创建的var变量。 

将var变量变为全局变量 export 

b67ef8119c98438592e0907c3985442b.png

在shell中修改全局后只会影响子shell和他自己 ,对于他的父shell没办法影响。

用户自定义的变量是一个局部变量,除非指定为静态。 

3. 全局变量_只读变量_撤销变量

变量的默认类型全按照字符串进行,没有办法进行数值计算。

a=2
echo $a  返回2

a=1+5
echo $a  返回1+5

eca2e7379b6f4eeb844292f683bb7bdb.png

进行数值运算需要特定的语法格式

定义只读变量   readonly(只读)

a4d27aac200c4d07bf88b3d41e483909.png

撤销变量  unset(卸载)unset a 卸载变量a

只读变量(常量)不能卸载,变量才可unset。

4. 特殊变量

如何让脚本可以像系统命令ls那样直接敲出运行。就需要配置环境变量

echo $PATH   可以把脚本直接放入path所包含的路径下。但是本身存在的path下的路径都是与系统命令相关的。显然把我们自定义的脚本放入其中不合适。

57fe109037754a949081c48ee6ca2d36.png

可以把自己脚本目录添加在path变量下,使用:分隔。

(1)$n

a7d326ea3f6546d9a840e011ce234351.png

双引号会被解释器以为$n是一个变量,但此时变量未定义,会显示为空。单引号会把括起来的内容直接输出 ,不会对变量进行解释。

bashname获取一个文件本身的名称。

(2)$#

3208808ae8a94c4288493409e6ae139b.png

在文件中写入测试$# 

 614d9cb9f94c45eb99149b294bba2a37.png

c64397b47780420b98d5b9c713eb3bf2.png

(3)$*与$@俩者类似又有些许不同

fe23e4c5e2f148419d3c7fff4ecc7e43.png

759aa2e498944ad4a986e96f66ccb7c4.png

$@可以被作为可迭代对象。总之就是一个字符串,一个数组。

(4)$?

527c27b0ed74482c9846780eaf727ba1.png

echo $?   返回0表示上一次脚本被成功执行了

525a6509d4544f828328032f3f9e4d9c.png

19.4  运算符

95e60ca7a2e349d883944948b5538952.png

1 + 4 相当于作为expr的三个参数传进去了(+左右有空格) 。*有特殊含义,需要转义。

上图中的加减运算显得有点麻烦,所以Linux就针对shell运算出现一种更简洁的运算方法。

80191f520f5e4d17a04a658792c60028.png

a=$[6+8]
echo $a   a为14

a=$(expr 5 \* 2)
echo $a   a为10

a2576fc92e4649709ff72e9a933a7ebc.png

案例脚本实现

acb478fbad2b4d7a909742852cc92c7c.png

49825e6c92454509adcc4c45d53e0fcd.png

19.5 条件判断

656fa7503eef404094de499210bf3d43.png

shell将表达式是否正确执行作为返回值,正确执行返回0,错误执行返回1.。所以这里0代表着真,1代表了假。

6925ed3f58a94dc69cab9e417f0c450a.png

 test比较麻烦,简洁的是直接用【】。

b78693ff8ff24dadbb94ee746bf33086.png

 表达式做比较时也要空开,否则shell将其解释成一个式子。

85556222ddbe464999fb7ee48525e7ed.png

b36f320fac104da69db0d9d767e958f4.png

f5b9d5d690684e3592ef648ca6ce3f79.png

fc4a6665e1474699a75dce828d02ca5f.png

a8957e311dd9415a948169b9d1dded90.png

多条件实现了类似于Java中的三元运算符操作。

19.6 流程控制(重点)

19.6.1 if单分支

2794cfa474374cd79288e96a1a90be66.png

729237a60ddb4984a8641bc63b56350a.png

vim写一个脚本,并且赋予x执行权限。 

734fb0c024294066a26476c43a8bf42b.png

如果表达式直接 $1 = ayguigu ,会执行不成功,会解释为空,所以为了不解释为空,进行字符串处理,还要俩边都加上x(不带字符串的),保证左右一致。

91d4a14c3ba74d299d3f6b8aa876f86d.png

执行结果如上。 

if后边表达式的写法优化,将多个条件表达式放入一个中括号里。需要-a选项,(and的意思)

86b0f885391f4b1f93ac8ea96e8ec042.png

19.6.2 if多分支

语法:

60e9b6fed508416b90b1803aad5e6d16.png

 vim编写脚本

 5111b9b491944aabad11976edc3ac25b.png

 4583c2ad5c5742a1bb2f04bb063c0a93.png

3e1f91ce9e7f42e98fc93ab51f524c96.png

19.6.3  case多分支

如果说if多分支是二叉树,那么case语句更像一个多叉树。

e9a184f01745434f9e5c33d2e6877a73.png

esac是case的反写。

vim编辑脚本

bf4322f309724761af41e08eb65d77a2.png

227a8b8afff84c82a6d6a0ca18787745.png

19.6.4  for循环

语法1:

6f2bb3869d764cac86618f0939370c87.png

案例:1-100累加

11ace7d300754051bba170190a0964e4.png

这里(())是可以替换为[  ] 。Linuxshell的+不能直接进行加法,+不加括号会被当成字符串加起来,所以还需要$【】括起来。

vim编写一个脚本

44322ab3238245c694176b100c1804da.png

根据自己传过去的$1变量值进行计算累加和。

注意:<,>号这些符号不能用来进行直接使用,上一节说比较大于小于关系时用 -lt,-gt。这里能用大于小于号是因为在双括号里,可以支持一些数学运算。

在运算符章节语法中说到(())等价于【】,这里面的是可以直接使用一些数学表达式的。

5357c77d238043ee84f69c780164c8a5.png

所以for循环语法可以直接使用小于大于号了。

语法2(常用):

ce1c416a53fa4f0cb178a3102ea245cf.png

in 后面相当于一个序列遍历,{ }是Linux的一个内部符号,所以不能随便使用{},它具有特殊含义。{1..100}表示从1到100.。 

588b746ffaa6445eb9ce4e4cdfb4cd83.png

for循环区分比较$*和$@的区别

vim编辑脚本

1.  $@   $*都没有加“双引号”

a570bb0924cc426daddeafe009fff876.png

284b3c75fe034a3aaa107b3d2b429874.png

2. 当$@  $*都加上双引号时

df14ff6a898248f89dcf1df569a57939.png

5d0765f37bb540cc9d3c9319b5380605.png

“$*”代表了一个元素,将其作为一个整体进行了输出;而$@代表了遍历,总共有5个元素。

只是为了打印出来这里用的是 $* 所以用单引号,如果是双引号的话 $* 会被当做命令执行了。双引号如果在特定符号前面加上转义字符\那么也可以只单纯的表示这个符号。

19.6.5 while循环

7f3b1dc53550460bac94d57d89ab9504.png

e2bff77fd0b14f63a03157f9827d182d.png

le是小于等于的意思。因为Linuxshell没有a++,这样的语法,所以要变成a=a+1,又因为a+1是一个加法运算,必须加上$[],因为需要引用变量所以还需要$变量。

中括号与里面的判断式之间需要空格,这是中括号语法格式要求的。中括号与外面的赋值表达式之间不可以空格,可能是因为linux会误认为是一种命令。

由于shell的设计初衷并不是高效写代码,它负责与底层操作系统打交道,所以命令编程显得过于繁琐。所以有一个更简单的命令可以让shell编程也像其他编程语言一样进行输入。

这就是let命令

5c7b6887dd3a4e04875973dd8ed62c2d.png

如上图加入let ,后面的命令就可以像其他语言的语法一样进行了,但是注意,仍然是不能有空格,以防shell误解释。

现在大部分的shell还都是老式的语法,所以还有必要掌握之前的语法才行。

19.7 读取控制台输入

73186cb90e4e4c38a959e2f4230b3c04.png

19.8 函数

19.8.1 系统函数

函数可以基本理解为一个脚本,实现某种功能的代码集合。系统函数就是系统提供我们的功能需要。函数可以说是一个轻量级的脚本。

a98a7e95f5a549ab86249b0707c321a4.png

583fcde388a5415c871523fe9b43d4e9.png

 

PS:shell有内置命令,还有外部命令,放在user/bin目录下,通常,称这些复杂的外部命令也叫工具。

89cf1d71c3274cf2b436c89256713e2b.png

 

9ab2da3058d24d86847cd469ef518907.png

date系统函数传入一个实参时间戳,得到返回结果,加$调用。最后字符串拼接赋值给filename。

1d89513087dc4bf6bedd718b6401ec79.png

之前返回$0脚本名称时,会把路径都显示,现在借助basename可以直接输出文件名,它起到了一个字符串剪切的功能。

对之前的脚本完善就变成了下图

4ba967e96f864ccab2737902563747c5.png

系统函数调用就是$(系统命令),这也叫命令替换,它的本质都是一个意思。

0a429845fe044609b909f3063989b9c4.png

 这个脚本完善了打印绝对路径的功能

7dca3e800b9849d1adf19c6b42b9f409.png

19.8.2 自定义函数

7371d14e1fb6445a84760df3a82d1f0a.png

 a72a06c12ef84acdb9dc49504e11a397.png

04732dccb8d04cfca9794f0abc220dfc.png

这里我们直接在函数内进行了echo输出。

有没有$?就可以捕获到函数的结果呢,实现获得函数返回值后可以利用返回值进一步计算。如果是上图输入$?会显示为0。

22313bf9352d4dbb887c7b35fd9130ab.png

5d16945175804266aedf371f06ec5fda.png

19.9 综合应用案例,归档文件

 47cd14a88ec94e1fa37a10b0fffad6cc.png

脚本实现

11d41f920d8d4187aa65783a0e76f415.png

8bacc26bf5394290b1b3e490fb50bad7.png

9c77f5fb448b4a9f9518b3a075d6ebac.png

将文件归档设置为定时任务

c5da0a349149447b874f32e6eaf60a23.png

1446fcee46e94018afb4c9945ec4c700.png 分时日月周

在每天的2点执行归档脚本,需要归档的目录为/root/scripts。

PS:archive归档

这里的-d作用是判断文件是否存在并且是一个目录

${var},即是加一个大括号来限定变量名称的范围

最后就实现了重要数据的定时归档。

19.10 正则表达式(入门)pattern

19.10.1 简单用法

db45cb83e1da4391b8e76c7ddfe03539.png

定义匹配模式规则 ,就是正则表达式。

09fc73747ffe419b98527eba3d946857.png

特殊字符还可以进行模糊匹配

0390168d238a42f1b1644679677cfde5.png

5ee0a32319014abd93c4c4e3c54133c2.png

614ba4f19d7140ec925a5113bc861bd3.png

^$它会匹配为所有的空行。

98b4c92eeac74f4c88dc20779c9728e0.png

b252be1ac04c4d26871e4c3c50b4ba5c.png

434f39fc49334673bd9aff6fa924d1eb.png

PS: .*表示匹配任意字符的任意多次,也就是可以匹配任意多个不知道的字符。*在正则中并不是表示任意一个字符,它必须与前面的字符相搭配才有效果。

19.10.2 扩展用法

2af887a218af4fee87de28210ca589c8.png

5356761658ea426f976e29ebb274597c.png

fd9ea13ad6324aa59087f8408fee290b.png

PS:除了使用反斜杠,还得使用单引号引起来才行。

为什么要转义呢?因为使用过程中我们有匹配特殊字符的需求。

21c04ac0ce434e3fa747357ed0f0b254.png

案例:精确匹配手机号 

PS:为什么不能【1-9】*,不是说匹配任意长度的数字字符串吗?

因为手机号必须十一位。

792c2a01967541ff85e284b4fafc5051.png

 

19.11 文本处理工具

19.11.1 cut

698c0196c1eb4b9d88578941fae46fa6.png

66089c0a6bef4846abf72ffde774a093.png

0950a73c20594bcf971883b3b6383031.png

也可以指定多列

9199a2f02688441fb3dcbc4b1eb6b6da.png

2bf34ec7b7ea49df82c9c92459695fc8.png

ebf2e17835a64b1eb91ab1e3e40366f1.png

 

19.11.2 awk

(1)基本功能

52531ae8ba144991a1181c5ea6d825ef.png

PS:awk工具的三位创始人名字! 目前最为强大的文本分析工具。awk和gawk是同一个软件。gawk是GNU协议的实现

单引号里面是正则加操作。{}相当于一个代码块。

dc9a67033e0e488cad5a1479796236fb.png

案例操作

ae2f13d4cf6847ceac2bbe55fc41ab50.png

a1217d719b824a0182ddd26bc31d0981.png

8b42af09f1074f3cbef9a1f4c6dca0c8.png 37c775121f0240a1a918817356d53151.png

(2)扩展功能

9ae31f5845c7459699dace901e021071.png

案例实现

83eb1d5a41dc4b3a8b62860fb520e10b.png

虽然上诉方法可以实现最终结果,但假如需求发生变化,变成加2加3,就需要修改代码,显然还不够最优。基本思想是让变量成为用户输入的值,直接传进去实现变量的替换。

f7b57f33195b4dd0856f59592cda339c.png

 

内置变量案例

b57779cf971d4c1f8c31943060989c72.png

3f5c99c767a5413599935c628ea3a196.png4fc863e8973d4a8aa5271356e503e36c.png 

6935c02ccb3d4cb680be6d1499779378.png

虽然grep也能输出行号,但是还顺便输出了一个:。不够彻底,因此awk可以实现只输出行号。

d6344373c3384ddf93043c87817476a0.png

awk还有一个好处就是默认以空格分隔,并且前面所有的空格都可忽略不计,所以直接$2找到第二列。

19.12 综合应用案例_发送消息

2531bdccb90e4892b46052189c6b0292.png

案例需求如上:

8eea2c08309748608e40d55074341419.png

b63014bb73ed482d8ea4468522d8864b.png

PS:who查看所有的在线用户。mesg查看自己是否打开消息功能。who -T查看所有用户是否打开消息功能。write指定用户名,和用户控制台。Ctrl+C中断。EOF表示文件结束。

如何用一个脚本实现输入变量用户名,直接发消息就可以了。

脚本实现:

44d67db62d6f42c19cfa0673eeb67c63.png

$1是第一个参数,对应用户名。$2是第二个参数,表示消息。

$*:将所有参数当做一个整体输出 $@:将所有参数当做个体输出

d3041cd160674f01ab959bf43625b385.png

b630e21eb1ba4a86a887edc44d4727ef.png

332d51bdef06463db8f7cc158a91ef8d.png

发现成功发送了消息,并且接受用户成功接受到了消息。

20 Linux入门正式完结

注重实践,勤奋好学!

 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值