Linux

1.环境准备

准备:虚拟机:VWVARE

linux:centos7发行版

管理员用户:root | 普通用户:xiaoyunfei 密码:xyf12345xyf

将IP设置为动态ip(系统获取到192.168.125.129)【会变,在虚拟机中用ip addr命令获取当前ip。】

额外工具:

1.putty远程管理

2.WinSCP实现便捷的windows与linux文件传输

2.Linux重要目录作用(规范)

linux - 图1
/usr ——— 包括与系统用户直接有关的文件和目录。  
   /usr/X11R6 存放X-Windows的目录;
   /usr/games 存放着XteamLinux自带的小游戏;
   /usr/bin 用户和管理员的标准命令;
   /usr/sbin      存放root超级用户使用的管理程序;
   /usr/doc      Linux技术文档;
   /usr/include    来存放Linux下开发和编译应用程序所需要的头文件,for c 或者c++;
   /usr/lib      应用程序和程序包的连接库;
  /usr/local     系统管理员安装的应用程序目录;
  /usr/man      帮助文档所在的目录;
  /usr/src      Linux开放的源代码;
   /usr/share   用于存放一些共享的数据,比如音乐文件或者图标等等
/var   ——— 用于存放很多不断变化的文件,例如日志文件等。包含了日志文件、计划性任务和邮件等内容。      
    /var/cache 应用程序缓存目录;
    /var/crash 系统错误信息;
    /var/games 游戏数据;
    /var/log 日志文件;
    /var/mail 电子邮件;
    /var/tmp 临时文件目录;

3.Linux常用命令

3.1文件处理命令

3.1.1命令格式与目录命令ls

命令格式:

命令【-选项】【参数】(如:ls -ls /etc)

注意:
  1. 个别命令不遵循此格式
  2. 当有多个选项时可以写在一起

3.1.2目录查看命令——ls

  • 原意:list
  • 权限:所有用户
  • 命令所在路径:/bin/ls
  • 功能:显示目录文件
  • 语法:ls 【-ald】【文件或目录】

选项:

  • -a 显示所有文件,包括隐藏文件(all)

其中前面带’.’的是隐藏文件。(如.update)

  • -l 详细信息显示(long)
  • 第一部分:d rwx r-x r-x(包含四个内容)
  1. 文件类型【-二进制文件,d目录,l软链接】
  2. 所有者(u)的权限【r读,w写,w执行】
  3. 所属组(g)的权限
  4. 其他人(o)的权限
  • 第二部分:(有争议)访问次数

  • 第三部分:所有者(即现在该文件的”主人”),是可以变换的

  • 第四部分:所属组(该文件所属的组别)

  • 第五部分:文件大小(单位是byte),当然这样的显示不方便,我们可以使用 ls -lh [目录|文件]

(h可以理解为human—>以人类的方式显示)

  • 第六部分:该文件最后一次被修改的时间
  • 第七部分:文件名

补充(关于所有者,所属组与其他人)

给一个文件区分所有者、所属组和其他人,就是为了分配权限方便。就像我买了一台电脑,那我当然是这台电脑的所有者,可以把我的朋友加入一个用户组,其他不认识的路人当然就是其他人了。分配完了用户身份,就可以分配权限了,所有者当然对这台电脑拥有所有的权限,而位于所属组中的这些学生可以借用我的电脑,而其他人则完全不能碰我的电脑。

  • -d 查看目录属性(一般与-l一起使用,只查看目录的详细信息)

3.1.3目录处理命令

1.目录处理命令[mkdir]

命令所在路径:/bin/mkdir

权限:所有用户

语法:mkdir (-p) [目录名]

-p 递归创建

(直接使用mkdir [目录名]只能创建一级,如mkdir /tmp/my/info必须保证tmp/my是存在的才可以,

而mkdir -p /tmp/my/info/details即便my不存在也可以按照指定的目录结构创建出来。)

2.目录切换命令[cd]

原意:change directory

路径:shell内置命令

权限:所有用户

语法:cd [目录]

  • cd /tmp/my/info 切换到指定目录

  • cd .. 回到上一级目录

3.文件处理命令[pwd]

原意:print working directory

路径:/bin/pwd

权限:所有用户

语法:pwd

4.(不常用)空目录删除命令[rmdir]{注意:是删除空目录}

原意:remove empty directory

路径:/bin/rmdir

权限:所有用户

语法:redir [目录名]

5.文件或目录复制命令[cp]

原意:copy

路径:/bin/cp

权限:所有用户

语法:cp -rp [原文件或目录] [目标目录]

  1. -r 复制目录,-p保留文件属性

6.文件剪切,改名命令[mv]

原意:move

路径:/bin/mv

权限:所有用户

语法:mv [原文件或目录] [目标目录]

mv(做剪切)与cp(做复制)的区别:

  1. mv会把原来路径的文件或目录删掉,cp只是复制
  2. mv在剪切目录时不用加-r,cp需要

相同点:

  • 都可以在输入命令时改名【 mv可以通过 mv [当前路径+文件名] [当前路径+新的名字实现改名] 】

7删除文件命令[rm]

原意:remove

目录:/bin/re

权限:所有用户

语法:rm -rf [目录或文件]

  1. -r 删除目录
  2. -f强制执行

3.1.4文件处理命令

1.创建文件命令[touch]

1.指定绝对路径创建

2.也可以在当前目录下直接创建

3.同时创建多个文件

2.小文件查看命令[cat]

语法 cat (-n) [文件名]

  1. -n 显示行号

注意:cat只适合浏览小的文件(相关命令:tac即cat反过来,作用就是将文件倒过来逐行显示。)

3.大文件查看命令[more]

语法:more [文件名]

  • (空格)或f : 翻页
  • (Enter) : 换行
  • q或Q : 退出

4.more进阶版[less]

语法 less[文件名]

  • (空格)或f : 向下翻页
  • (Enter或”向下”键) : 向下换行
  • q或Q : 退出
  • b : 向上翻页
  • (“向上”键) : 向上换行
  • (“/“+要搜索的内容) :在文件中检索【注意要用大键盘的”/“】
  • n : 在检索模式下向下翻页

5.参看文件前几行[head]

语法:head -n [行数] [文件名]

如果不写(即head [文件名]),行数默认为10

6.查看文件后几行

语法(与head相同) :tail -n [行数] [文件名]

3.1.5链接命令

1链接命令[ln]
  • 原意 :link

  • 语法:ln -s [原文件] [目标文件]
    -s 创建软链接
    ln -s /etc/services /tmp/my/info/services.soft(生成软链接)
    ln /etc/services /tmp/my/info/services.hard(生成硬连接)

    软链接实际上就是windows下的快捷方式,且软链接文件多所有用户是全权限开放(比较不代表代表对原文件的操作)


读取到的信息是相同的


而硬链接实际上就是 : cp -p + 同步更新

注意:1.硬链接需要一定的权限

  1. 2.软链接删除不影响原文件,而硬链接如果删除会把原文件也删除。

总结:对目录的操作:增mkdir,删rm(-r),进入cd,赋值cp(-r),查看ls

  1. 对文件的操作:增touch,删rm,查看cat,more,less,head,复制cp

补充:关于rwx的说明

关于目录的rwx

代表字符 含义 相关可执行指令
r 可以列出目录中的内容(读权限) ls
w 可以在目录中创建,删除文件(写权限) touch,rm,rmdir,mkdir
x 可以进入目录(执行权限) cd

关于文件的rwx

代表字符 含义 相关可执行指令
r 可以读取文件中的内容(读权限) cat,more,less,head,tail
w 可以修改文件内容(写权限) vi,vim
x 可以执行文件(执行权限) script,command

3.2权限管理命令

3.2.1权限管理命令[chmod]

  • 原意:change the permissions of a file
  • 权限:所有用户
  • 作用:修改用户对目录或文件的操作权限

语法1【直接的权限表示】:chmod [{ugoa}{+-=}{rwx}] [文件或目录]

例子:chomd a=rw- /tmp/my/info/PermissionTest

  1. chmod o-wx /tmp/my/info/PermissionTest
  • ugoa:u表示所有者,g表示所属组,o表示其他人,a表示所有人
  • +=-:+表示添加权限,-表示删除权限,=表示直接赋予权限(覆盖原权限)
  • rwx:r表示读操作,w表示写操作,x表示执行操作。

语法2【数字权限表示】: chmod [mode = 321] [文件或目录]

例子:chmod 777 /tmp/my/info/PermissionTest

  1. chmod 754 /tmp/my/info/PermissionTest
  • 数字权限实际上就是把rwx转化为数字表示:
  • r->4(2^2)
  • w->2(2^1)
  • x->1(2^0)
  • 接着就是求和,比如rwx就是(4+2+1=7),那要赋予权限为rwxrwxrwx就是777,rwxr-xr—就是754

补充:-R 实现递归修改权限

例子:chmod 777 /tmp/my/info 只会修改info这个目录的权限,但是info的子文件或子目录权限不会改变

  1. chmod -R 777 /tmp/my/info确可以实现将指定目录与其子文件或子目录的权限全部修改为rwxrwxrwx

3.2.2其他权限管理命令

1.所有者转移指令[chown]
  • 原意:change file ownership
  • 权限:root][即便是普通用户创建的文件该用户也不能转移权限]
  • 语法1:chown [用户] [文件或目录] (实现转移指定文件或目录的权限)
  • 语法2:chown [新用户] [原用户] (实现原用户所有权限的转移时)

2.所属组转移指令[chgrp]
  • 原意:change file group ownership
  • 权限:root
  • 语法:chgrp [用户组] [文件或目录]

3.用户默认权限[umask]
  • 原意:user mask
  • 语法:umask (-S)

umask -S返回的是该用户创建目录时,该目录的权限,上面的即是rwxrwxr-x

那如果创建的是文件呢?

显然,文件的权限是rw-rw-r—,相对目录,创建的文件全部失去了x权限,

这是默认设置的(给目录x权限是因为有r权限【ls读取权限】 的目录没有x权限【cd进入权限】显然不和常理,但文件的x权限【执行权限】理应受到限制,否则随便就创建可执行的文件显然十分危险)。

umask返回的是数字化反权限表示

第一个0暂不说明【后面学习】

002实际上就是数字权限取反的结果[这也是为什么叫mask->面具],777与002按位异或(就是777-002)得到775,对应权限即是rwxrwxr-x

3.3文件搜索命令

3.2.1文件搜索指令[find]

  • 权限:root
  • 语法:find [搜索范围] [匹配条件s]

1.按文件名查询[-name]

find /etc -name init:查询/etc下(及其子目录下)所有名字是init的文件

find /etc -name init : 模糊查询【类似于mysql的模糊查询】,匹配任意数量的字符,但是不同于mysql中_表示单个字符,linux中用?表示单个字符。

find /etc -iname init??? : -iname表示不区分大小写查询

-name,-iname[忽略大小写],* 模糊查询匹配任意数量字符,?模糊查询匹配单个字符。

2.按文件大小查询[-size]

find /etc -size +204800[在/etc目录下查找文件大小大于204800字节的文件]

+n大于,-n小于,=n等于

3.按文件所有者或所属组查询[-user | -group]

find /etc -user xiaoyunfei【查找/etc下面及其子目录下面所有所有者为xiaoyunfei的文件】

find /etc -group root【查找/etc下面及其子目录下面所有所属组为root的文件】

4.按时间查询[-amin/-cmin/-mmin]

find /etc -cmin -5 【查询/etc目录及其子目录下5分钟内被修改过文件属性的文件】

  • -amin 访问时间access
  • -cmin 文件属性change[ls -l可以看到的文件的权限等属性]
  • -mmin 文件内容modify[文件的具体内容]

5.多条件查询[-a/-o]

find /etc -size +163840 -a -size -204800【在/etc下查询大于80MB,小于100MB的文件】

  • -a 两个条件同时成立【与】
  • -o 两个条件至少有一个成立【或】

6.按文件类型查询[-type]

-type {f|d|l}

  • f:文件
  • d:目录
  • l:软链接文件

如 find /etc -name init?? -a -size +163840 -a -type f

在/etc下查询名字是initxx,且大于80MB的文件(不包含目录与软链接)

7.查询结果附带操作[-exec/-ok]

语法:find [查询范围] [匹配条件] -exec/-ok [指令] {} ;

注意,后面的{} ;是固定句式【{}表示查询的结果,\表示转义,;表示结束】

例:find /etc -name init -a -type f -exec ls -l {} ;【含义:找到/etc下面所有名字为init的文件后显示他们的具体属性】

3.2.2其他常用命令

1文件内检索关键字[grep]

语法:grep -iv [指定字符串] [文件名]

  • -i : 不区分大小写
  • -v : 排除指定字符串【反向检索】

例 :grep mysql /root/install.log

3.4帮助命令

1.非shell指令帮助命令[man]

  • 原意:manual
  • 语法:man [命令或配置文件]

例:

  1. man ls [查看ls命令的帮助信息]
  2. man service [查看service文件的帮助信息](注意:不要指定文件绝对路径,只要文件名。)
  • 类似于less的功能,man之后进入文件可以用/[关键字] 检索,也可以用n翻到下一页。

注意:当查询的配置文件与命令重名时(man 命令后面的配置文件是直接写文件名),那系统优先查找命令的信息。

如 passwd

显然,passwd既是命令也是配置文件

这是直接man passwd的结果(显然是命令)

2.man命令的简化[whatis | apropos]
  • whatis : 只查询这个命令的描述信息
  • apropos:只查询配置文件的描述信息

3.指定命令帮助[—help]

语法:[命令] —help

作用:查询指定命令的一些重要信息

2.shell内置命令帮助[help]

语法:help [命令]

如cd,umask等都是shell内置命令,这些命令用man无法查询出来,要用help。

3.5用户管理命令

存放非管理员用户相关信息的文件目录:/home

1.用户添加命令[useradd]
  • 权限:root
  • 语法:useradd 用户名

2.用户密码修改命令[passwd]
  • 语法:

    • root专有语法:passwd [用户名]
    • 普通用户语法:passwd(也就是说root可以修改所有人的密码,而普通用户只能修改自己的密码)

      注意:

  1. 新用户创建后,必须要root赋予他密码后才可以登录。
  2. root修改时,若密码较弱,系统会提醒一次,但再输一次可以强制修改,但普通用户不能修改成较弱的密码。

3.当前登录用户查询[who]
  • 语法:who
  • 权限:所有用户

相关信息:

  • 登录用户名
  • 登录终端:
  • tty :本地终端
  • pts :远程登录
  • 登陆时间
  • 登录主机IP地址(没写就是本机)

3.6压缩解压命令

1.压缩文件命令[gzip]
  • 原意:GUN zip
  • 权限:所有用户
  • 语法:gzip [文件]
  • 压缩后文件格式:.gz

2.解压命令[gunzip]

注意:1gzip只能压缩文件。2.压缩不保留原文件

3.目录打包压缩命令[tar]
  • 权限:所有用户
  • 语法:tar [选项-zcvf] [压缩后文件名] [目录]

    • -c:打包
    • -v(可以理解为verbose:冗长的):显示详细信息
    • -f:指定文件名
    • -z:打包同时压缩
  • 压缩后文件格式:.tar.gz

注意:

  1. 选项的顺序只能是-zcvf(邓然可以写不全)
  2. tar压缩是保留原文件的
  3. 压缩时不是从当前目录开始压缩的,而是直接压缩指定的目录。【比如指定/tmp/xiao/info,那压缩后的文件最高及目录就是/tmp,而不是info,若想从info开始就要cd进入info的上一级目录xiao再指定tar -zcvf info】,如下:

4解压命令[tar]

只是选项改变

tar:[-zxvf]

  • -x:解包
  • -v:显示信息信息
  • -f:指定压缩文件
  • -z:解压缩
  • -C:指定解压目标位置(写在解压文件后面)

注意:

  1. 解包后默认生成在当前目录
  2. 解包后保留原文件
  3. 目录名默认为解包后里面最高一级目录名【这也是为什么上面压缩文件是如果是tar -zcvf /tmp/xiao/info,那解压后就会在当前目录生成tmp目录】

5.压缩命令[zip]
  • 权限:所有用户
  • 语法:zip 选项[-r] [压缩后文件名] [文件或目录]

    • -r:压缩目录
  • 压缩后格式 : .zip

6.解压命令[unzip]
  • 权限 所有用户
  • 语法:unzip [压缩文件]

7.压缩命令[bzip2]
  • 权限:所有用户
  • 语法:bzip2 选项[-k] [文件]

    • -k:产生压缩文件后保留原文件
  • 压缩后格式:.bz2

8.解压命令[bunzip2]
  • 权限:所有用户
  • 语法:bunzip2 选项[-k] [压缩文件]

    • -k:解压文件后保留原文件
  • 压缩后格式:.bz2

3.7网络命令

1.给用户发消息[write]

  • 权限:所有用户
  • 语法:write <用户名>
  • 功能:给用户发消息,以Ctrl+D保存结束

一个用户发消息:

另一个用户同步接收消息(中文貌似不会编码)

注意:接收消息的用户一定要是登录状态才可以

2.消息广播[wall]

  • 原意:write all
  • 权限:所有用户
  • 语法:wall [消息]

3.测试连接[ping]

  • 权限:所有用户

  • 语法:ping [选项] IP地址

    • -c 指定发送次数

4.登录状态查询1[last]

  • 权限:所有用户
  • 语法:last
  • 功能:列出目前与过去登入系统的用户信息

5.登录状态查询1[lastlog]

  • 权限:所有用户
  • 语法:lastlog [选项]

    • -u [用户名] 查询指定用户最后一次登录的时间
  • 功能:列出所有用户最后一次登录的时间

6.centos7可视化主机配置[nmtui]

  • 语法:nmtui

linux - 图2

7.挂载命令[mount]

Linux系统将所有的硬件设备都当做文件来处理,当使用光驱等硬件设备时,就必须将其挂载到系统中,只有这样Linux才能识别 。

为什么要挂载呢?/dev/目录下的被称为设备文件,对用户而言,它的确代表硬件设备本身,但是它仅仅是linux识别硬件设备后给他起了一个名字放在了/dev目录下,只是一个设备代称,我们只能查看它的很少的信息,它不是文件系统中的内容,而挂载就是为设备建立了一个软链接,一个‘’接口’‘,我们通过访问这个链接来操作硬件。

  • 权限:所有用户
  • 语法:mount [设备文件名] [挂载点]

注意:设备文件名是系统分配好写在/dev目录下的,而挂载点是我们创建的文件,而且挂载擦啊哦做会把原目录里面的数据隐藏,所以选择创建空目录挂载。

/dev/sr0是之前下载好的CD软盘的设备文件名,这个操作实现将这个CD挂载到/mnt/cdrom这个目录下面

显而易见,挂载后就可以在挂载点访问到对应设备的数据,而一旦解挂,就不能了。

8.解挂命令[umount]

  • 语法:umount [设备名]

注意:解挂时不能再挂载点解挂

9.查看端口情况[nmap]

nmap不是自带的,需要安装 yum -y install nmap

  • 语法:nmap -sT IP【查看指定IP当前端口开放情况】

3.8防火墙命令

  • firewall-cmd —state #查看防火墙
  • systemctl status firewalld #查看防火墙
  • systemctl stop firewalld #临时关闭防火墙
  • systemctl start firewalld #临时打开防火墙
  • systemctl disable firewalld #开机禁止启动防火墙
  • systemctl enable firewalld #开机启动防火墙
  • firewall-cmd —query-port=80/tcp 查询端口号80 是否开启
  • firewall-cmd —zone=public —add-port=80/tcp —permanent 开启80端口
  • firewall-cmd —reload 重启防火墙
  • firewall-cmd —list-port 查询有哪些端口是开启的

3.9关机重启命令

1.关机命令[systemctl halt]

  • 语法:systemctl halt[选项] 时间

    • -c:取消前一个关机命令
    • -h:关机
    • -r:重启
  • 权限:root

2.重启命令[systemctl reboot]

  • 权限:root

系统运行级别:(在centos中以target方式显示)

  • 0 系统停机模式,系统默认运行级别不能设置为0,否则不能正常启动,机器关的
  • 1 单用户模式,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录
  • 2 多用户模式,没有NFS和网络支持
  • 3 完整的多用户文本模式,有NFS和网络,登陆后进入控制台命令行模式
  • 4 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置
  • 5 图形化模式,登陆后进入图形GUI模式,X Window系统
  • 6 重启模式,默认运行级别不能设为6,否则不能正常启动。运行init 6机器就会重启

3.用户退出登录[exit | logout]

  • 语法:

    • root:exit
    • 普通用户:logout

4.当前系统运行级别查看与设置

centos7不再使用/etc/inittab文件进行默认的启动级别配置,而使用比sysvinit的运行级更为自由的target替代。第3运行级用multi-user.target替代,第5运行级用graphical.target替代。

  1. #设置默认第三启动级别
  2. [xiaoyunfei@localhost /]$ systemctl set-default multi-user.target
  3. #设置默认第五启动级别
  4. [xiaoyunfei@localhost /]$ systemctl set-default graphical.target
  5. #查看当前默认的启动级别
  6. [xiaoyunfei@localhost /]$ systemctl get-default
  7. graphical.target
  8. [xiaoyunfei@localhost /]$ systemctl get-default
  9. multi-user.target

4.Vim

1.vi常用命令

linux - 图3

linux - 图4

linux - 图5

2.vim下载

root用户下:yum -y install vim

一般情况下,可以认为vim是vi的高级版,一些常用的操作与vi是相同的

5.软件包管理

5.1相关介绍

5.1.1软件包

  • 源码包【源代码】
  • 二进制包(RPM包,系统默认包)【编译后的代码】

5.2.RPM包管理-rpm命令管理

5.2.1RPM包命名规则

httpd-2.2.15-15.el6.centos.i686.rpm

  • httpd:软件包名
  • 2.2.15:软件版本
  • 15:软件发布次数
  • el6,centos:适合的Linux平台
  • i686:适合的硬件平台
  • rpm:rpm包扩展名

这是我的在D盘的cdrom的packages下面的一些rpm包:

5.2.2.RPM包依赖性

有时安装一个rpm包会提示需要另一个包的依赖(类似于java的包依赖),而提示信息又不是全包名,难以查询,就可以在上面的网站搜索,可能能找到。

5.2.3安装升级与卸载[被下面的yum取代]

1.包全名与包名
  • 包全名:操作的包是没有安装的软件包时,使用包全名,而且要注意路径。
  • 包名:操作已经安装的软件包,使用包名,是搜索/var/lib/rpm/中的数据库。

2.RPM安装[rpm]
  • 语法:rpm -ivh 包全名

    • -i:安装
    • -v:显示详细信息
    • -h:显示进度

rpm安装会遇到很麻烦的依赖问题。yum就比较好的解决了这个问题。

3.RPM包升级[rpm]
  • 语法:rpm -Uvh 包全名

    • -U:升级

4.RPM包卸载[rpm]
  • 语法:rpm -e 包名

    • -e:卸载

5.2.4.查询[相对有用]

1.查询是否安装
  • 语法:rpm -q 包名

    • -q:查询
    • -a:所有【rpm -qa 】

2.查询软件包详细信息
  • 语法:rpm -qi 包名

    • -i:查询软件信息
    • -p:查询未安装包信息【此时包名就要是包全名 -> rpm -qip {全包名}】

3.查询包中文件安装位置

绝大多数包在发行时一般都会制定道中所有的软件应该安装的位置,执行安装命令后会自动放到对应位置上。

  • 语法:rpm -ql 包名

    • -l:列表
    • -p:查询未安装的包依赖

4.查询系统文件属于哪个包
  • 语法:rpm -qf 文件名

    • -f:文件

注意:这个文件原本就是某个包里面的才可能查出来。

5.查询软件包的依赖性
  • 语法:rpm -qR 包名

    • -R:依赖性(requires)
    • -p:未安装包信息

5.3RPM包管理-yum在线管理

5.3.1.网络yum源

5.3.2.yum命令

1.常用yum命令
  • yum list ->查询所有可用软件包列表【由于源在国外,一定是可以联网才行】
  • yum search 关键字 -> 查询yum源所有和关键字相关的包
  • yum -y install 包名 -> 安装

    • install:安装
    • -y:自动回答yes
  • yum -y update 包名 -> 升级

    • update:升级

    • -y:自动回答yes

    • 特别注意:yum -y install 轻易不要用,它会升级包括linux内核在内的所有软件,既有可能再也无法连接。

  • yum -y remove -> 卸载

    • remove:卸载

    • -y:自动回答yes

    • 同样注意:yum -y remove轻易不要用

  • yum grouplist -> 列出所有可能的软件组名

5.4源码包管理

5.4.1.RPM包与源码包的安装位置

  • RPM包默认安装位置【绝大多数的位置(不是全部)】
  • 源码包位置

源码包的安装位置是人为指定的,一般是

/uer/local/软件名/

5.4.2.RPM包与源码包的启动

  • 相同方法:[要启动的软件的绝对路径]/包名 start
  • RPM包的特殊方法:由于RPM包的安装路径是确定的,所以会有一些特殊的命令来启动,如service network start【network是管理网络的系统包】

5.4.3源码包安装

  1. 安装C语言编译器【yum -y install gcc】
  1. 2.下载源码包
  • 源代码推荐保存位置【是系统默给的】:/usr/local/src
  • 软件推荐安装位置【系统默认给的】:/usr/local/

    3.使用WinSCP将压缩包传到/usr/local/src下面

    4.进入/usr/local/src后解压【tar -zxvf 压缩文件名】

(现在已经解压好了,du命令是查看文件大小的)

  1. 5.进入解压后的目录

源码包目录里面一般都会有一个叫INSTALL的文件,里面是该软件安装的步骤。还有一个叫README的文件,里面是软件相关的信息。

这就是阿帕奇这个源码包的安装步骤【写在INSTALL里面】

一般步骤:

  1. ./configure —prefix=/usr/local/名字
  2. make
  3. make install

5.4.5.apache服务器的配置[源码包安装实践]

这个apache2安装过程我遇到的问题:

  • 需要apr的依赖【我已下载后放在G:/linux-learn/源码包里面】,同样需要上面三步。
  • 需要apr-util的依赖【我已下载后放在G:/linux-learn/源码包里面】,同样需要上面三步。
  • 需要pcre(注意不是pcre2)的依赖【我已下载后放在G:/linux-learn/源码包里面】,同样需要上面三步。
  • pcre需要c的编译器【yum -y install gcc gcc-c命令安装】(pcre2好像不用)

之后的配置:

  • 进入/usr/local/apache2/目录

  • 首先配置服务器的IP与端口:

    • vim /usr/local/apache2/conf/httpd.conf(修改Listen与ServerName的内容)

      • 第一种:配置IP为192.168.125.128(创建网络连接时获取的虚拟机IP)端口为80(默认),linux防火墙会放行,不用修改防火墙配置。

      • 第二种:配置为不是80的端口(IP还是192.168.125.128),此时linux防火墙会拦截,可以配置防火墙添加可访问端口(当然,由于是测试,甚至可以直接systemctl stop firewalld展示关掉防火墙)

  • 用浏览器访问192.168.125.128:端口号【注意,如皋采用的是80端口(http协议默认端口),可以不加端口号,即192.168.125.128】

6.用户和用户组管理

6.1用户配置文件

6.1.1 用户信息文件/etc/passwd

共七个字段(用 :分割)

  1. 第一字段:用户名
  2. 第二字段:表示是否有密码->x表示有
  3. 第三字段:UID
  4. 0:超级用户root
  5. 1-499:系统用户(伪用户)【不能登录的】
  6. 500-65535:普通用户
  7. 第四字段:GID(用户初始组id)
  • 初始组:用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个的用户名相同的组名作为初始组。
  • 附加组:一个用户可以加入多个组(其他用户的组),并拥有这些组的权限。
  1. 第五字段:用户说明
  2. 第六字段:家目录
  3. 超级用户root:/root/
  4. 普通用户:/home/用户名
  5. 第七字段:登陆之后的Shell
  • Shell就是Linux的命令解释器
  • 在/etc/passwd下,除了标准Shell是/bin/bash外,还有/sbin/nologin

6.1.2 影子文件/etc/shadow

shadow的权限是000,只有root可以修改

共九个字段(用 :分割)

  1. 第一字段:用户名
  2. 第二字段:加密密码
  • 加密算法使用SHA512散列加密算法
  • 如果密码是“!!”或”*”说明没有密码,不能登录
  1. 第三字段:密码最后一次修改日期
  • 使用1970年1月1日为标准时间,每过一天时间戳加1.
  1. 第四字段:两次密码修改间隔时间(和第三字段相比)
  2. 第五字段:密码有效期(和第三字段相比)
  3. 第六字段:密码修改到期前的警告天数(和第五字段相比)
  4. 第七字段:密码过期后的宽限天数
  5. 第八字段:账号失效时间
  6. 第九字段:保留

6.1.3 组信息文件/etc/group与组密码文件/etc/gshadow

1.组信息文件/etc/group

共四个字段(用 :分割)

  1. 第一字段:组名
  2. 第二字段:组的密码标识【组的密码一般用的比较少】
  3. 第三字段:GID
  4. 第四字段:组中附加用户

2.组密码文件/etc/gshadow[不常见]

共四个字段(用 :分割)

  1. 第一字段:组名
  2. 第二字段:组密码
  3. 第三字段:组管理员用户名
  4. 第四字段:组中附加用户

6.2用户管理相关文件

6.2.1.用户的家目录

  • 普通用户:/home/用户名/,所有者和所属组都是此用户,权限是700
  • 超级用户:/root/,所有者和所属组都是root,权限是550.

注意:如果想把普通用户改为超级用户(和root同级),可以在/etc/passwd里面把用户的UID改为0,此时用该用户登录就是超级用户的权限,但此用户的家目录不变。

此外,在/etc/passwd里面把用户的GID改为0(root的组)不能实现将该用户变为超级用户。

6.2.2.用户的邮箱

/var/spool/mail/用户名/

6.3用户管理命令

6.3.1用户添加命令[useradd]

  • 语法:useradd [选项] 用户名

    • -u UID:手工指定用户的UID
    • -d 家目录:手工指定用户的家目录
    • -c 用户说明:手工指定用户的说明
    • -g 组名:手工指定用户的初始组
    • -G 组名:指定用户的附加组
    • -s Shell:手工指定用户登录的shell,默认是/bin/bash

可以发现,除了密码不能直接指定外,其余的选项恰好与/etc/passwd文件里面的内容一一对应。

一般情况下,要创建用户时直接useradd 用户名就好

6.3.2修改用户密码[passwd]

  • 语法:passwd [选项] 用户名

    • -S:查询用户密码的状态。仅Root可用
    • -l:暂时锁定用户,仅Root可用
    • -u:解锁用户,仅Root可用

补充:锁定用户的原理是在/etc/shadow里面对应用户的密码前加上!!,效果是于这个用户无法登陆。

6.3.3修改用户信息[usermod]

  • 语法:useradd [选项] 用户名

    • -u UID:修改指定用户的UID
    • -c 用户说明:修改指定用户的说明
    • -G 组名:修改指定用户的附加组
    • -L:临时锁定用户(Lock)
    • -U:解锁用户(Unlock)

6.3.4 修改用户密码状态[change]

  • 语法:chage [选项] 用户名

    如:(查询用户详细密码状态 :chage -l 用户名)

6.3.5删除用户[userdel]

  • 语法:userdel [-r] 用户名

    • -r:删除用户的同时把该用户的家目录删除

6.3.6用户切换[su]

  • 语法:su [选项] 用户名

    • -:选项只使用“-”表示切换用户是连带用户的环境变量一起切换【这个一定要有,否则用户的切换是不完整的。】
    • -c:仅执行一次命令,而不切换用户身份

6.4用户组管理命令

6.4.1.添加用户组[groupadd]

  • 语法:groupadd [选项] 组名

    • -g GID :指定组ID

6.4.2.修改组信息[groupmod]

  • 语法:groupmod [选项] 组名

    • -g GID:修改组ID
    • -n 新组名:修改组名

6.4.3删除用户组[groupdel]
  • 语法:groupdel 组名

7.权限管理

7.1.ACL权限

7.1.1.ACL权限简介

  • 概念:
  • ACL是Access Control List(访问控制列表)的缩写,用于linux复杂的用户权限控制当中。
  • Cent7系统之前,只有系统安装时创建的文件系统支持ACL,后来创建的文件系统则不支持。
  • Cent7系统后,不管文件系统是否在安装系统时被建立,都支持ACL。

为什么需要ACL权限?ACL权限是针对特定文件而言的,以之前的知识,权限的划分分为了所有人,所属组,其他人,也就是说用户对一个文件的权限只有三种情况,取决于用户的身份。但很多情况下,不同的用户对一个文件的权限可能出现大与三种权限,我们不能频繁的针对当前用户改权限,于是ACL权限从文件本身的权限(而非用户的权限)入手,将会对这个文件有操作(rwx)的用户的权限单独排成一个列表,这样就可以实现多个用户拥有很多种权限了。

7.1.2.查看ACL权限[getfacl]

  • 原意:get file ACL(access control list)
  • 语法:getfacl [选项] [文件名|列表名]

文件类型

目录类型

7.1.3.添加ACL权限[setfacl -m]

  • 语法:setfacl -m [文件名|列表名]
  1. setfacl -m user:xiao:rwx a.txt // 使用户lee对文件a.txt的权限为rwx
  2. setfacl -m group:xiao:rwx a.txt // 使组对文件a.txt的权限为rwx

7.1.4.修改ACL权限[setfacl -m]

和添加的语法一致(实际上就是在添加时如果已存在就覆盖)。

7.1.5.删除ACL权限[setfacl -x]

7.2.文件特殊权限

首先考虑之前的一个操作,那就是普通用户使用passwd命令修改自己的密码,用户密码相关的内容全部在/etc/shadow里面,但是这个文件的权限是————-,

也就是说只有root可以操作,但是为什么可以使用passwd命令修改密码呢?我们看一下passwd这个命令的权限【注意是命令/usr/bin/passwd】:

我们发现他的权限是rwsr-xr-x,但是我们之前不是说权限分为r(读)w(写)x(执行)吗?这里为什么会有一个s呢?这就是SetUID

8.2.1.SetUID

1.介绍
  • 只有可执行的二进制程序可以设定SUID权限
  • 命令执行者要对该程序有X(执行)权限
  • 命令执行者在执行该程序时获得该程序所有者的身份(如执行者在执行这个命令时以文件所有者的身份出现)、
  • SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效,执行完后用户不变。

解释为什么普通用户可以执行修改/etc/shadow里面的内容:

  1. 首先passwd命令的执行原理就是对passwd文件里面的内容的修改,且只有root有操作权限,
  2. 我们用xiao这个用户执行passwd这个命令时由于passwd这个命令有SUID权限,一经执行,xiao这个用户就变成了root(/usr/bin/passwd这个可执行文件的所有者),便拥有了操作/etc/passwd这个文件的权限,执行完后回到自己的身份。

2.添加SUID

4代表SUID

  • chmod 4755 文件名
  • chmod u+s 文件名

3.删除SUID

4代表SUID

  • chmod 755 文件名
  • chmod u-s 文件名

8.2.2.SetGID

1.介绍

SGID权限实际上和SUID权限是否类似,只是SGID是让执行用户在执行时暂时进入了该文件所属组里面。

权限里面所属组权限为—s或-ws等【出现了s】。说明就有SGID权限。

2.添加SGID

2代表SGID

  • chmod 2755 文件名
  • chmod g+s 文件名

3.删除SGID

2代表SGID

  • chmod 755 文件名
  • chmod g-s 文件名

8.2.3.Sticky BIT

1.介绍
  • 粘着位目前只对目录有效
  • 普通用户对该目录拥有w和x权限,即普通用户可以在此目录中新建,删除任意文件或目录。
  • 如果没有粘着位,因为普通用户拥有w权限,所以可以删除任意文件,一旦赋予了粘着位 ,除了root不受影响外,普通用户即使有w权限也只能删除自己创建的文件(即所有者为自己的文件),而不能删除其他用户的文件。

在其他人权限的x权限处是t的文件就有SBIT权限。

2.添加SBIT

1代表SBIT

  • chmod 1755 文件名
  • chmod o+t 文件名

3.删除SBIT

2代表SBIT

  • chmod 755 文件名
  • chmod o-t 文件名

7.3.文件系统属性chattr权限

1.属性查询[lsattr]

lsattr是查看指定文件或目录的隐藏属性的命令,用法与ls类似.

2.属性修改[chattr]

chattr的作用实际上是对文件权限的进一步约束。且对包括root在内的所有用户生效。

  • 语法:chattr [+-=] [选项] [文件名|目录]

    • i:如果对文件添加了i属性,就不允许对文件进行删除,改名,也不能添加或修改数据。如果对目录添加了i权限,那么只能修改目录下文件的数据,而不能新建或删除文件。
    • a:如果对文件添加了a属性,就不允许对文件数据进行修改和删除,但可以添加数据。如果对目录添加了i权限,那么只能新建文件或修改目录下文件的数据,而不能删除文件。【a —add】

      chattr +i [文件名]:给文件添加i权限【几乎相当于锁定文件文件】。

8.Shell

8.1概念

Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。

不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

现在的Linux主要使用Bash作为用户的基本Shell。

  • Linux中支持的Shell【在/etc/shells这个文件里面】

8.2.Shell脚本的执行方式

8.2.1echo命令

  • 语法:echo [选项] [输出内容]

    • -e:支持反斜线控制的字符转换

linux - 图6

8.3.Helllo World

8.3.1.编写程序

注意:

  • 在Shell里面#表示注释
  • 每一个Shell文件尽可能加上.sh的后缀
  • Shell文件的第一行一定要是==#!/bin/bash==

8.3.2.运行程序

新建的文件一般都是没有执行权限的(这个在之前文件创建的时候学过),所以要手动赋予权限(一般是755权限)。

执行方式1【常用】
  1. chmod 755 文件名 ->赋予执行权限

  2. 使用相对路径或绝对路径直接执行

执行方式2
  1. 或者在文件所在目录下使用bash 文件名执行【注意要在文件所在路径下】。

8.3.3.dos2unix

这是一个将windows下写的(当然是按照shell语法写的)文件改写为linux下的可执行Shell的命令

需要这个命令的原因是包括换行符在内的一些特殊字符在windows和linux里面是不一样的,比如在linux里面的换行符是用$表示的,而windows里面不是,所以有时需要这个命令辅助转换

8.4.Shell基本功能

8.4.1历史命令和补全

  • history [选项] [历史命令保存文件]

    • -c:清空历史命令
    • -w:把缓存中的历史命令写入历史命令保存文件

默认会保存1000条,超出的会覆盖

历史命令的调用

  • 使用 !n 重复执行第n条历史命令
  • 使用 !! 执行上一条命令
  • 使用 !字符串 重复执行左后一条以该字符串开头的命令。
  • 在Bash中,只要在输入命令时按”Tab”键自动补全命令,在输入文件时,会在当前目录中搜索自动补全。

补充:如果按一次Tab没有补全,就按两次会输出所有的预选命令或文件,如果还没有说明就没有这个命令或文件。

8.4.2.别名与快捷键

1.别名[alias]
  • 语法1:alias 别名=‘原命令’ -> 起别名
  • 语法2:alias -> 查询命令别名

比如:alias vi=’vim’后使用vi命令效果就是vim

注意:调用别名转义实际上是优先级的问题

  • 命令执行时顺序:
  1. 第一顺位:用绝对路径或相对路径执行的命令
  2. 第二顺位:别名
  3. 第三顺位:执行Shell的内部命令(如cd pwd等)
  4. 第四顺位:按照linux - 图7PATH环境变量的具体内容)

这就可以解释为什么别名会优先原命令生效了,因为优先级高呗。【别名在第二顺位,而原命令如cd之类的在第三顺位,如ls,vim之类的在第四顺位。】

2.删除别名[unalias]
  • 语法:unalias 别名

3.常用快捷键

8.4.3.输入输出重定向

1.标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出

2.输出重定向【重要】

之前的很多命令都会在显示器上输出内容,ls,cat,more,less,echo等等。

这是由于标准输出是显示器,所以输出位置是屏幕(包括正确输出如ls的结果,以及错误输出如命令未找到),

输出重定向的作用就是改变输出位置。如将数据输出到文件中。

linux - 图8

注意:

  1. 是覆盖原内容,>>是追加。
  2. “错误命令 2>> 文件” 中 2与>>之间没有空格。

上面的是基础操作,但是我们通常不能事先确定命令是否能正确执行,此时直接使用重定向会有问题,如下

(使用>>正确输出重定向语法重定向错误输出无效。)

下面的是对正确输出与错误输出的结合使用。

情况 语法
不论错误还是正确都重定向追加输出到一个文件里面。 命令 &>> 文件
不论错误还是正确都重定向追加输出到不同文件里面。 命令 >> 文件1 2>> 文件2

3.输入重定向

上面输出重定向是改变了显示器标准输出,那么输入重定向就应该是改变键盘的标准输入。一般是将文件内容作为输入内容。

符号 说明
command <file 将 file 文件中的内容作为 command 的输入。
command <<END 从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止(分界符可以是任意的字符串,用户自己定义)。
command < file1 > file2 将 file1 作为 command 的输入,并将 command 的处理结果输出到 file2。

4.wc命令
  • 语法:wc [选项] [文件名]

    • -c:统计字节数
    • -w:统计单词数
    • -l:统计行数

8.4.4.多命令执行顺序与管道符

1.多命令执行顺序
执行符 格式 作用
;(分号) 命令1 ; 命令2 多个命令顺序执行,命令之间没有逻辑关系
&&(逻辑与) 命令1 && 命令2 当命令1正确执行,命令2才会执行;否则命令2不执行
||(逻辑或) 命令1 || 命令2 当命令1正确执行,命令2不会会执行;否则命令2执行
  • &&实际上就是要不两个都执行,要不都不执行
  • ||实际上就是最多执行一个

2.dd命令
  • 语法:dd if=输入文件 of=输出文件 bs=字节数 count=个数

    • if=输入文件:指定源文件或源设备(相当于输入重定向)
    • of=输出文件:指定目标文件或目标设备(相当于输出重定向)
    • bs=字节数:指定一次输入/输出多少字节(相当于java的io流里面的缓冲区大小),把这些字节看做一个数据块。
    • count=个数:指定输入/输出多少个数据块

实际上就是把输入文件里面的数据复制到输出到输出文件里面。【注意,会覆盖输出文件里面的原数据】。

3.伪三目运算

利用上面的逻辑与(&&)和逻辑或(||)写如下格式:

命令 && echo yes || echo no【作用:如果命令正确执行就输出yes,否则输出no】。

4.管道符
  • 语法:命令1 | 命令2【命令1的正确输出作为命令2的操作对象】

8.4.5.通配符与其他特殊符号

1.通配符
通配符 作用
? 匹配至少一个任意字符
* 匹配0个或任意多个字符,即任何内容
[] 匹配中括号里面的任意一个字符,如[abc]代表匹配a,b,c里面的任意一个。
[-] 匹配中括号里面的任意一个字符,-代表范围,如[1-9]匹配1-9的任意一个字符。
[^] 逻辑非,表示匹配除了中括号里面的字符之外的任意一个字符,如[ ^1-9 ] 表示匹配一个非数字字符。

2.其他特殊符号
符号 作用
‘ ‘(单引号) 在单引号中所有的特殊字符没有特殊含义,是什么就是申明。
“ ”(双引号) 在双引号中的“ $ ”, “ ` “ (漂号), “ \ “有特殊含义,分别是“调用变量的值”,“引用命令”,“转义”。
· ·(漂号) 漂号括起来的内容时系统命令,在Bash中会优先执行,和linux - 图9%E7%9A%84%E4%BD%9C%E7%94%A8%E4%B8%80%E6%A0%B7%EF%BC%8C%E4%B8%8D%E8%BF%87%E4%B8%80%E8%88%AC%E4%BD%BF%E7%94%A8#card=math&code=%28%29%E7%9A%84%E4%BD%9C%E7%94%A8%E4%B8%80%E6%A0%B7%EF%BC%8C%E4%B8%8D%E8%BF%87%E4%B8%80%E8%88%AC%E4%BD%BF%E7%94%A8)(),易读
$() 引用系统命令
# 注释
$ 用来调用变量的值,如需要调用变量name的值,需要$name
\ 转义,跟在\之后的特殊符号失去特殊含义,变为普通字符。

8.4.6.Shell变量

在Shell中可以分为四种变量:本地变量(用户自定义变量),环境变量,位置参数变量,预定义变量。

  • 所有变量的默认值都是字符串类型,如果要进行数值运算,则必须指定变量为数值型。
  • 如果把命令结果作为值赋给变量,需要用漂号或$()包含
  • 环境变量建议大写,便于区分。

1.本地变量

相当于局部变量,是用户自定义的变量。只能在当前的Shell中生效。

  • 变量定义:变量名=值【注意:=两边不能有空格】
  • 变量叠加(在原变量前面或后面拼接内容):

    • 语法1:name=”$aa”456
    • 语法2:name=${aa}789
  • 变量调用:$变量名【如:echo $name】
  • 变量查看:set
  • 变量删除:unset 变量名

2.环境变量

主要保存的是和系统操作环境相关的数据。环境变量会在当前Shell和它的所有子Shell中生效,如果环境变量写入配置文件,就可以在所有Shell中生效。

  • 变量定义:export 变量名=值
  • 变量查询:env
  • 删除变量:unset 变量名

先定义本地变量name,在子Shell中找不到,退出子Shell后将name申明为export环境变量可以在子Shell中找到了。

1.环境变量PATH

PATH:系统查找命令的路径

这实际上就是第四顺位的命令路径,如ls,vim等等这些命令都在这里面,这些目录下的命令(实际上是二进制可执行文件)在执行时不需要绝对或相对路径,直接写名字就可以。

2.环境变量PS1

PS1:定义系统提示符的变量:

3.位置参数变量

主要用于对处理用户向脚本传递的参数(类似于java中main主函数的args[]参数)变量名与其作用是固定的,只能改变其值

位置参数变量 作用
$n n为数字,$0表示命令本身,$1-linux - 图10{15}
$* 这个变量代表命令行中所有的参数,当家双引号时$*把所有的参数看做一个整体
$@ 这个变量代表命令行中所有的参数,与linux - 图11@都把所有的区分对待(可以遍历)
$# 这个变量代表命令行中参数的个数

注意:在centos7中(我当前用的系统)中,如果不加 “ “ (双引号),linux - 图12 作用相同,都是把参数区分对待,要想看为整体,就要用” $ “。

4.预定义变量

在Bash中已经定义好的变量,变量名与其作用是固定的,只能改变其值【实际上,位置参数变量也是预定义变量,只是比较特殊,单独处理】。

预定义变量 作用
$? 最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行,如果不是0(至于是几和命令有关),证明执行不正确。
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

注意:$!的输出恰好与认知相反,0是正确执行,非0是错误执行(比较正确执行只有一种情况,而错误执行无法确定)。

5.接收键盘输入[read]
  • 语法:read [选项] [变量名]

    • -p “提示信息”:在等待输入时输出提示输入
    • -t 秒数:read 命令会一直等待用户的输入,使用此选项可以指定等待时间
    • -n 字符数:read 只会接收直到的字符数(且接收够后立刻执行下一步)。
    • -s:隐藏输入的数据(比如登录是输入密码)

8.4.7.数值运算与运算符

之前讲过,所有类型的变量默认是字符串类型,而我需要数值类型。

1.法1:declare申明变量类型
  • 语法:declare [+/-] [选项] 变量名

    • -:给变量设定类型属性
    • +:取消变量的类型属性
    • -i:将变量申明为整数型(integer)
    • -x:将变量声明为环境变量
    • -p:查看指定变量的类型

2.法2:expr或let数值运算工具
  1. #!/bin/bash
  2. aa=10
  3. bb=20
  4. dd=$(expr $aa + $bb) #注意运算符两边要有空格
  5. echo dd
  6. #结果:30

3.法3:$((运算式)) 或 $[运算式]

4.运算符

8.4.8.环境变量配置文件

1.介绍

Sources命令

如果修改了配置文件,就需要重新登录才可以生效,sources命令就是免去了这个步骤。

  • 语法:sources 配置文件

环境变量配置文件简介

环境变量配置文件主要是对定义在系统中的操作环境神效的系统默认环境变量,比如PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。

环境变量配置文件位置
  • /etc下面的对所有用户生效
  • 代表home目录)

8.5.Shell编程

8.5.1.正则表达式

正则表达式与通配符:

  • 正则表达式是用来在文件中匹配符合条件的字符串,正则是包含匹配。grep,awk,aed等命令支持正则表达式
  • 通配符是用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式,所以只能用Shell自己的通配符来匹配。

基础正则表达式

8.5.2.字符串截取命令

1.cut命令

之前的grep命令是行内查找,而cut是实现按列截取的功能。

  • 语法:cut [选项] 文件名

    • -f 列号:提取第几列
    • -d 分隔符:按照指定分隔符分割列

但是cut的局限性比较大,主要体现在对分隔符的限制上,默认的分隔符是Tab(水平制表符),我们只能按照文件中特有的结构使用cut命令。

  • 创建一个文件cutTest,内容如下(使用Tab分割):

由于cut命令默认的分隔符就是Tab,于是直接获取到了对应内容。

但是知道分隔符为其他符号就不行。

那如果用四个空格来模拟Tab键呢?很遗憾,cut只能接受单个字符。

当然,如果的确是按照固定的自符分割的文件就可以方便使用了。(如/etc/passwd文件就是用”:”分割的)。

2.printf命令
  • 语法:printf ‘输出类型输出格式’ 输出内容
  • 输出类型:

    • %ns:输出字符串,n是数字指代输出几个字符
    • %ni:输出整数,n是数字指代输出几个整数
    • %m.nf:输出浮点数,m和n是数字,指代输出的数字位数与小数位数。【如%8.2f表示共输出8位数,2位是小数,6位是整数】

字符的默认值为空格,数字的默认值为0或0.000000

printf要输出的内容可以是下面的玩法。【只是符合shell语法而已】。

printf命令实际上是为下面的命令做辅助输出用的。

3.awk命令

1.基础用法
  • 语法:awk [选项] ‘条件1 {动作1} 条件2 {动作2} ……’ 文件名
  • 选项

    • -F 字符:指定分割字符
  • 条件:一般使用关系表达式作为条件:

    • 如:x>0:判断x是否大于0
  • 动作:

    • 格式化输出
    • 流程控制语句

awk的执行原理大致是:awk实际上是按行读取,之后按照指定的分隔符【这里默认是”空“,只要没有填充字符,都算空,如 Tab,空格】,将每一行的内容划分为变量,并且用$n【n是数字,$0表示行本身,$5表示第五个量(相当于第五列),这一点类似于位置参数变量】。

2.BEGIN条件

BEGIN是一个条件,在awk命令里面以BEGIN作为判断条件的语句会在其他所有语句之前执行一次。

3.END条件

类似BEGIN是在所有其他语句之前,END是在所有其他语句之后。

4.sed命令

sed命令是一种轻量级的流编辑器,sed主要用来将数据进行选取,替换,删除,新增。

之前我们用vim就可以完成对文件的增删改查,但仅仅是文件内容,而sed的作用是对其他命令输出内容的增删改查。

  • 语法:sed [选项] ‘[动作]’ 文件名
  • 选项:

    • -n:一般sed命令会将所有数据输出到屏幕上,此选项只会把经过sed处理过的行输出到屏幕。
    • -e:允许对输入的数据应用多条sed命令编辑
    • -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。
  • 动作:

    • a\:追加,在当前行后添加一行或多行,添加多行时,处最后一行外,每行末尾都要加\代表未结束。格式: sed ‘na 要追加内容’ 获取输入【n为行号】
    • c\:行替换,用c后面的字符替换原数据,替换多行时,除最后一行外,每行的末尾要加\代表未结束。格式: sed ‘nc 要替换的内容’ 获取输入【n为行号】
    • i\:插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行的末尾要加\代表未结束。
    • d:删除指定行
    • p:打印指定行
    • s:字符替换,用一个字符串替换另一个字符串,格式为:“行范围s/旧字符串/新字符串/g”。

上面的是追加动作的例子,即a\的用法,c\,i\,d,p的用法类似,注意行号要在字母前面。

上面的是字符串替换的语法,注意如果不指定行号【即不在s前写数字】,则代表全局替换。

8.5.3.条件判断

1.重要前提

条件判断实际上就是if,while中用于判断的语句,返回值为0或非0,表示为true或false,在Shell里面条件判断是没有>,<这些运算符的,而是通过test命令完成【或是简化表示[ 判断语句 ]】。

但是我们之前在数值运算中的确讲过有>,等等运算符。没错,在![](https://g.yuque.com/gr/latex?(())%E6%88%96#card=math&code=%28%28%29%29%E6%88%96)[]做数值运算时几乎所有高级语言的运算符都通用,而且在这里做出的判断返回方式也与高级语言一致,即$[10]返回的就是1,为true,但是在Shell条件判断中恰恰相反,[ 1 -gt 0 ] (表示判断1>0)返回的却是0,表示正确执行。

2.语法
  1. test 判断语句
  2. [ 判断语句 ] (注意:判断语句与中括号之间有个空格)

二者是等价的,也可以说,第二种是第一种的特殊写法,在for,if,while,util中一般用第二种。

3.文件/文件夹判断

3.1.根据存在与否判断

蓝色的是常用的。

3.2.根据权限判断

注意:这个判断只要所有者,所属组或其他人有至少一个有指定权限就返回0即真。

4.数值判断

5.字符串判断

6.多重逻辑判断

8.5.4.if语句

if语句有两种写法,一种是用分号,一种是换行(推荐)

  1. if [ command ];then
  2. #符合该条件执行的语句
  3. elif [ command ];then
  4. #符合该条件执行的语句
  5. else
  6. #符合该条件执行的语句
  7. fi
  1. if [ command ]
  2. then
  3. #符合该条件执行的语句
  4. elif [ command ]
  5. then
  6. #符合该条件执行的语句
  7. else
  8. #符合该条件执行的语句
  9. fi

8.4.5.case语句

  1. case $变量名 in
  2. "值1")
  3. #符合该条件执行的语句
  4. ;;
  5. "值2")
  6. #符合该条件执行的语句
  7. ;;
  8. #......
  9. *)
  10. #符合该条件执行的语句
  11. ;;
  12. esac

8.4.6.for语句

for语句有两种模式,一种是for in 模式,一种是for( : : )模式【注意,第二种模式下可以使用>,<等运算符】。

  1. for 变量名 in $变量取值列表
  2. do
  3. #符合该条件执行的语句
  4. done
  1. for ((初始化;判断;执行语句))
  2. do
  3. #符合该条件执行的语句
  4. done

例:

  1. #!/bin/bash
  2. if [ 1 -gt 0 ]
  3. then
  4. echo "1>0"
  5. else
  6. echo "1<=0"
  7. fi
  8. for i in 1 2 3 4
  9. do
  10. echo "Number now : $i"
  11. done
  12. for ((m=0;m<5;m+=1))
  13. do
  14. echo "m: $m"
  15. done

执行结果:

8.4.7.while语句与until语句

  1. while [ 判断语句 ]
  2. do
  3. #符合该条件执行的语句
  4. done

while语句是当判断条件为真时执行。

  1. until [ 判断语句 ]
  2. do
  3. #符合该条件执行的语句
  4. done

until语句是当判断条件为假时执行。

例子:

  1. #!/bin/bash
  2. read -t 30 -p "Input a number : " num
  3. while [ $num -gt 0 ]
  4. do
  5. echo "number now: $num"
  6. ((num--))
  7. done

8.4.8.Shell中各种括号的作用

1.小括号( )
  1. 命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
  2. 命令替换。等同于cmd,shell扫描一遍命令行,发现了linux - 图13%E7%BB%93%E6%9E%84%EF%BC%8C%E4%BE%BF%E5%B0%86#card=math&code=%28cmd%29%E7%BB%93%E6%9E%84%EF%BC%8C%E4%BE%BF%E5%B0%86)(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
  3. 用于初始化数组。如:array=(a b c d)

2.双小括号(( ))
  1. 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
  2. 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
  3. 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6
  4. 常用于算术运算比较,双括号中的变量可以不使用linux - 图14)%2C%20%E5%A6%82%E6%9E%9C%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%8F%8C%E6%8B%AC%E5%8F%B7%2C%20%E5%88%99%E4%B8%BAfor%20i%20in%20%60seq%200%204%60%E6%88%96%E8%80%85for%20i%20in%20%7B0..4%7D%E3%80%82%E5%86%8D%E5%A6%82%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8if%20((#card=math&code=%E7%AC%A6%E5%8F%B7%E5%89%8D%E7%BC%80%E3%80%82%E6%8B%AC%E5%8F%B7%E5%86%85%E6%94%AF%E6%8C%81%E5%A4%9A%E4%B8%AA%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%94%A8%E9%80%97%E5%8F%B7%E5%88%86%E5%BC%80%E3%80%82%20%E5%8F%AA%E8%A6%81%E6%8B%AC%E5%8F%B7%E4%B8%AD%E7%9A%84%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%AC%A6%E5%90%88C%E8%AF%AD%E8%A8%80%E8%BF%90%E7%AE%97%E8%A7%84%E5%88%99%2C%E6%AF%94%E5%A6%82%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8for%28%28i%3D0%3Bi%3C5%3Bi%2B%2B%29%29%2C%20%E5%A6%82%E6%9E%9C%E4%B8%8D%E4%BD%BF%E7%94%A8%E5%8F%8C%E6%8B%AC%E5%8F%B7%2C%20%E5%88%99%E4%B8%BAfor%20i%20in%20%60seq%200%204%60%E6%88%96%E8%80%85for%20i%20in%20%7B0..4%7D%E3%80%82%E5%86%8D%E5%A6%82%E5%8F%AF%E4%BB%A5%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8if%20%28%28)i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ]。

3.中括号[ ]
  1. ①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
  2. Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab < bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
  3. 字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
  4. 在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。 语法:${变量名[索引]}【索引从0开始】

4.双中括号[[ ]]
  1. ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[ 和 ]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
  2. 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
  3. 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不使用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
  4. bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

8.4.9.其余的条件判断方式【更符合逻辑】

双小括号做判断:【对格式要求不高,括号与判断条件之间,运算符与变量之间对空格没有要求,可以使用>,<等运算符】

  1. #!/bin/bash
  2. read -t 30 -p "input a number:" num
  3. if (($num>5))
  4. then
  5. #num=$[num+1]
  6. ((num+=1))
  7. echo "num : $num"
  8. else
  9. read -t 30 -p "input again:" num
  10. echo "num : $num "
  11. fi

双中括号做判断:【对格式要就较高,括号与判断条件之间,运算符与变量之间必须有空格,可以使用>,<等运算符】

  1. #!/bin/bash
  2. read -t 30 -p "input a number:" num
  3. if [[ $num > 5 ]]
  4. then
  5. #num=$[num+1]
  6. ((num+=1))
  7. echo "num : $num"
  8. else
  9. read -t 30 -p "input again:" num
  10. echo "num : $num "
  11. fi

8.4.10.数组的使用

  • 定义:

    • 变量名=(变量1 变量2 ……)【一行定义,注意等号两侧不能有空格】

    • 变量名=(变量1

      1. 变量2


……)【多行定义,注意等号两侧不能有空格】

  • 使用:${变量名[索引]}
  1. #!/bin/bash
  2. names=(xiao yun fei)
  3. for ((i=0;i<3;i++))
  4. do
  5. echo "name: ${names[$i]}"
  6. done

9.服务管理

介绍:服务实际上就是之前用yum或rpm命令安装的二进制包或源码包,比如开启了apache服务器的服务。centos7的服务管理核心是systemctl。

9.1.服务查询

RPM包安装的服务查询:

  • systemctl list-util-files【查询所有RPM包服务,包括开启的与未开启的】。

源码包安装的服务:

  • 一般在/usr/local目录下【这个目录就是系统预定让用户安装源码包服务的】

9.2.centos7系统服务管理

systemd中引入了system units的概念,在units其中封装有关系统服务(service),侦听套接字(socket),以及与init系统启动相关信息.

9.2.1.systemd unit 类型

  1. unit类型 文件后缀名 描述
  2. Service unit | .service | 服务类
  3. Target unit | .target | 一个unit服务组,用于模拟实现运行级别
  4. Automount unit | .automount | 文件系统自动挂载点
  5. Device unit | .device | 内核识别的设备文件
  6. Mount unit | .mount | 文件系统挂载点
  7. Path unit | .path | 文件或目录
  8. Scope unit | .scope | 外部创建的进程
  9. Slice unit | .slice | A group of hierarchically organized units that manage system processes.
  10. Snapshot unit | .snapshot | 系统快照
  11. Socket unit | .socket | 套接字
  12. Swap unit | .swap | 标识swap设备
  13. Timer unit | .timer | systemd的计时器

上述unit说明:
  • service :文件扩展名为.service, 用于定义系统服务
  • target :文件扩展名为.target,用于对 unit 进行逻辑分组,引导其他 unit 的执行。它替代了 SysV 中运行级别的作用,并提供更灵活的基于特定设备事件的启动方式。例如 multi-user.target 相当于过去的运行级别5,而 bluetooth.target 在有蓝牙设备接入时就会被触发
  • device :用于定义内核识别的设备
  • mount:定义文件系统挂载点
  • socket:用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
  • snapshot :管理系统快照
  • swap:用于标识swap设备
  • automount :文件系统的自动挂载点
  • path:用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务

最常用的是 service 和 target。

9.2.2.unit文件保存位置

  1. /usr/lib/systemd/system/ | RPM包安装时分发的unit文件
  2. /run/systemd/system/ | systemd运行时创建的文件
  3. /etc/systemd/system/ | systemctl enable创建的unit文件

9.2.3.Service

1.服务基本命令
  1. systemctl |
  2. systemctl start name.service | 启动服务
  3. systemctl stop name.service | 停止服务
  4. systemctl restart name.service | 重启服务(没启动的服务会启动)
  5. systemctl try-restart name.service | 只重启正在运行的服务
  6. systemctl reload name.service | 重载配置文件
  7. systemctl status name.service | 检查服务状态
  8. systemctl is-active name.service | 检查服务是否启动
  9. systemctl list-units --type service --all | 显示所有的服务状态
  1. systemctl |
  2. systemctl enable name.service | 启用开机自启服务
  3. systemctl disable name.service | 停用自启服务
  4. systemctl status name.service | 检查服务状态
  5. systemctl is-enabled name.service | 查看服务是否自启
  6. systemctl list-unit-files --type service | 查看所有服务
  7. systemctl list-dependencies --after | 列出在指定服务之前启动的服务.(依赖)
  8. systemctl list-dependencies --before | 列出在指定服务之后启动的服务.(被依赖)

2.常用命令

列出所有当前激活服务

  1. systemctl list-units --type service

列出所有服务,不管是否激活(LOAD为notfound应该是还没有安装)

  1. systemctl list-units --type service --all

列出可开机自启的服务

  1. systemctl list-unit-files --type service

注销服务

  1. systemctl mask name.service

取消注销

  1. systemctl unmask name.service

9.2.4.Target

在Centos7之前版本中,拥有0-6编号的一组运行级别代表特定的操作模式.在Centos7中由systemd的target取代,通过一系列依赖关系将其他systemd units组合在一起,来模拟一个运行级别的概念.在运行级别的基础上target有更丰富更灵活的运行模式..

1.状态说明
  1. Runlevel| Target Units |
  2. 0 | runlevel0.target, poweroff.target | 关机
  3. 1 | runlevel1.target, rescue.target | 单用户,救援模式
  4. 2 | runlevel2.target, multi-user.target | 多用户,非完全启动的命令行(比如网络)
  5. 3 | runlevel3.target, multi-user.target | 建立了一个非图形化多用户系统
  6. 4 | runlevel4.target, multi-user.target | 预留,未启用
  7. 5 | runlevel5.target, graphical.target | 图形界面
  8. 6 | runlevel6.target, reboot.target | 重启

2.常用命令

获取默认target

  1. systemctl get-default

查看激活的target

  1. systemctl list-units --type target

查看所有target

  1. systemctl list-units --type target --all

修改默认target

  1. systemctl set-default name.target

切换级别

  1. systemctl isolate graphical.target

10.进程管理

10.1.进程

  1. 在linux系统中,每一段执行的程序都称为一个进程,被分配一个进程编号(pid)。
  2. 每个进程都对应一个父进程,一个父进程可以复制多个子进程。
  3. 一个进程可能以两种方式存在:前台和后台。前台是指用户在屏幕上可以进行操作的,后台是指屏幕上看不到的实际操作。
  4. 一般系统的服务都是以后台进程的方式存在,并且常驻系统中,直到关机才结束。

10.2.进程操作命令

10.2.1.查看进程状态

下面的是常用命令

  • 命令1:ps aux 【注意:没有”-“】

    • a:显示当前所有进程
    • u:以用户格式显示进程
    • x:显示进程运行的参数

其中:COMMAND比较重要

  • 命令2:ps -ef

    该命令会以全格式显示当前所有进程,比上面的命令一多一项PPID,即父进程的PID

  • 命令3:pstree [-pu]

    • -p:显示进程编号
    • -u:显示进程所属的用户

10.2.2.实时监控[top]

  • 语法:top [-i] [-d n] [-p pid]

    • -i:只显示正在运行的进程
    • -d 秒数:指定top命令每隔几秒更新,默认3秒
    • -p PID:指定要检查的PID

top支持交互操作,即在显示之后可以通过按键交互:

交互操作:P(按占用cpu比例排序)、M(按占用内存排序)、N(按进程编号排序)、u(只监控某个用户)、k(结束进程)、q(退出)。【注意由于是大写,所以要shift+按键】

10.2.3.进程终止

  • 语法1(终止单个进程):kill [-信号值] pid

    • -信号值:是数字,表示以哪种方式kill

      常用信号值:

  • 1:让进程立即关闭,然后重新读取配置文件后重启
  • 9:强制终止,本信号不能被阻塞或忽略
  • 15:kill的默认信号值,正常终止,但是如果进程发生了问题,便无法正常终止。
  • 语法2(批量终止):killall pname

    pname是进程名称,支持通配符