Linux笔记

一、Linux系统的组成

1.内核

​ 内核是操作系统的核心,具有很多最基本的功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。

​ Linux内核的主要模块分为存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信、系统的初始化和系统调用等几个部分,

2.Shell

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

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

​ 另外,Shell编 程语言具有普通编程语言的很多特点,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

3.文件系统

​ 文件系统是文件存放在磁盘等存储设备上的组织方法。Linux系统能支持多种目前流行的文件系统,如xfs、ext4、ext3、ext2、msdos、vfat 和iso9660等。

4.应用程序

​ 标准的Linux系统都有一套称为应用程序的程序集,它包括文本编辑器、编程语言、X Window、办公软件、影音软件、Internet工具和数据库等。

二、安装Linux系统

1.准备安装Linux系统

2.安装Linux系统

硬盘分区规划(1)

(1)最简单的分区规划

  • swap分区:即交换分区,实现虚拟内存,建议大小是物理内存的1~2倍;
  • /boot分区:用来存放与Linux系统启动有关的程序,比如引导装载程序等,最少200MB;
  • /分区:建议大小至少在10GB以上。

硬盘分区规划(2)

(2)合理的分区规划

  • swap分区:实现虚拟内存,建议大小是物理内存的1~2倍;
  • /boot分区:建议大小最少为200MB:
  • /usr分区:用来存放Linux系统中的应用程序,其相关数据较多,建议大小最少为8GB;
  • /var分区:用来存放Linux系统中经常变化的数据以及日志文件,建议大小最少为1GB;
  • /分区:Linux 系统的根目录,所有的目录都挂在这个目录下面,建议大小最少为1GB;
  • /home分区:存放普通用户的数据,是普通用户的宿主目录,建议大小为剩下的空间。

交换分区

  • 直接从物理内存读写数据要比从硬盘读写数据快的多,而物理内存是有限的,这样就使用到了虚拟内存。虚拟内存是为了满足物理内存的不足而提出的一.种策略,它是利用磁盘空间虚拟出的一-块逻辑内存,用作虚拟内存的磁盘空间被称为交换分区(swap分区)。
  • 内核会将暂时不用的内存块信息写到交换分区,这样-来,物理内存得到了释放,这块内存就可以用于其它用途,当需要用到原始的内容时,这些信息会被重新从交换分区读入物理内存。
  • Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

分区命名方案

  • Linux系统使用字母和数字的组合来指代硬盘分区,使用一种更加灵活的分区命名方案,该命名方案是基于文件的,文件名的格式为/dev/xxyN(比如/dev/sda1分区)。
    • /dev:这是Linux系统中所有设备文件所在的目录名。因为分区位于硬盘上,而硬盘是设备,所以这些文件代表了在/dev_上所有可能的分区;
    • XX:分区名的前两个字母表示分区所在设备的类型,通常是hd(IDE硬盘)或sd(SCSI硬盘)。
    • y: 这个字母表示分区所在的设备。例如,/dev/hda(第1个IDE硬盘)或/dev/sdb(第2个SCSI硬盘);
    • N:最后的数字N代表分区。前4个分区(主分区或扩展分区)用数字1~4表示,逻辑驱动器从5开始。例如,
      /dev/hda3是第1个IDE硬盘上的第3个主分区或扩展分区;
      /dev/sdb6是第2个SCSI硬盘上的第2个逻辑驱动器。

3.注销、关闭和重启Linux系统

4.FirewallD防火墙

三、字符界面操作基础

1.字符界面简介

进入Linux字符界面方式

  • 要进入Linux系统的字符界面可以通过字符界面、图形界面下的终端以及虚拟控制台等多种方式进入。

1、Linux字符界面

  • 安装Linux系统之后,系统启动默认进入的是图形化界面,可以通过使用以下命令修改为进入字符界面,所做改变在系统重新引导之后即可生效。
    [root@rhel ~]#systemctl get-default

    graphical.target
    //查看计算机系统启动后要进入的默认目标,graphical.target表示图形化界面
    [root@rhel ~]#systemctl set-default multi-user.target
    //将multi-user.target目标设置为启动计算机系统后要进入的默认目标,multi-user.target表示字符界面

2、字符界面登录提示

  • Linux系统用户登录分两步:第一步输入用户的用户名,系统根据该用户名识别用户;第二步输入用户的口令。当用户正确地输入用户名和口令后,就能合法地进入系统,这时就可以对系统进行各种操作了,注意:
    超级用户root登录后提示符是”#”,而其他用户登录后提示符是”$”

3、图形界面下的终端

4、虚拟控制台

  • Linux系统可以同时接受多个用户同时登录,还允许用户进行多次登录,这是因为Linux系统提供了虚拟控制台的访问方式。
  • 在字符界面下,虚拟控制台的选择可以通过按下[Alt]键和一个功能键来实现,通常使用F1~F6键。比如用户登录后,按下[Alt+F2]键,用户可以看到“login:”提示符,说明用户进入了第二个虚拟控制台。然后只需按[Alt+F1]组合键,就可以回到第-一个虚拟控制台。
  • 如果用户在图形界面下,那么可以使用[Ctrl+ Alt+F2]~[Ctrl+ Alt+F6]组合键切换字符虚拟控制台,使用[Ctrl+Alt+F1]可以切换到图形界面。

5、关闭和重启Linux系统

  • 在Linux系统中常用的关闭/重启系统的命令有shutdown、halt、reboot,每个命令的内部_工作过程是不同的。
    • shutdown命令
      shutdown命令可以安全地关闭或重启Linux系统。
      命令语法:
      shutdown[选项][时间][警告信息]
      [例3.1]立即关闭计算机系统。
      [root@rhel ~]#shutdown -h now
      [例3.2]定时45分钟 后关闭计算机系统。
      [root@rhel ~]#shutdown -h +45
      [例3.3]立即重新启动计算机系统,并发出警告信息
      [root@rhel ~]#shutdown -r now "system will be reboot now."
      [例3.4]定时在1 点38分重新启动计算机系统
      [root@rhel ~]#shutdown -r 01:38
    • halt命 令
      使用halt命令就是调用“shutdown-h”命令执行关机任务。
      命令语法:halt[选项]
      [例3.5]使用halt命 令关闭系统。
      [root@rhel ~]# halt
    • reboot命令
      reboot命令的工作过程与halt相似,不过reboot是引发计算机重启,而halt是引发计算机关闭。它的选项与halt相似。
      [例3.6]使用reboot命 令重启计算机系统。
      [root@rhel ~]# reboot

6、目标

  • 在RHEL7之前的版本,使用运行级别代表特定的操作模式。运行级别被定义为七个级别,用数字0到6表示,每个运行级别可以启动特定的一些服务。RHEL 7使用目标(target)替换运行级别。目标使用目标单元文件描述,目标单位文件扩展名是.target,目标单元文件的唯一目标,是将其他systemd单元文件通过一连串的依赖关系组织在一起。比如graphical.target单元,用于启动一个图形会话,systemd会启动像GNOME显示管理(gdm.service)、帐号服务(axxounts-daemon)这样的服务,并且会激活multi-user.target单元。相似的multi-user.target单元,会启动必不可少的NetworkManager service、dbus service服务,并激活basic.target单 元。
  • 每一个目标都有名字和独特的功能,并且能够同时启用多个。一些目标继承其他目标的服务,并启动新服务。
    systemd提供了一些模仿SystemVinit启动级别的目标,仍可以使用旧的telinit启动级别命令切换。
  • 预定义目标和运行级别对应关系
运行级别 目标 目标的链接文件 功能
0 poweroff.target runlevel0.target 关闭系统
1 rescue.target runlevel1.target 进入救援模式
2 multi-user.target runlevel2.target 进入非图形界面的多用户方式
3 multi-user.target runlevel3.target 进入非图形界面的多用户方式
4 multi-user.target runlevel4.target 进入非图形界面的多用户方式
5 graphical.target runlevel5.target 进入图形界面的多用户方式
6 reboot.target runlevel6.target 重启系统

2.在Linux系统下获取帮助

  • 使用man手册页

    • 一般情况下,Linux系统中所有的资源都会随操作系统一起发行,包括内核源代码。而在线手册是操作系统所有资源的一本很好的使用手册。有不懂的命令时可以用man查看这个命令,写程序时有不会用的函数可以用man查看这个函数,有不懂的文件时也可以用man查看文件。
    • 一般情况下man手册页的资源主要位于/usr/share/man目录下。
  • man手册内/可以用于查询

  • man命令

    man命令格式化并显示在线的手册页。通常使用者只要在命令man后,输入想要获取的命令的名称,man就会列出一份完整的说明,其内容包括命令语法、各选项的意义以及相关命令等。
    命令语法:man[选项][名称]

  • man手册页类型

类型 描述
1 用户命令
2 系统调用
3 C语言函数库
4 设备和特殊文件
5 文件格式和约定
6 游戏程序
7 杂记
8 系统管理工具
9 Linux内核API(内核调用)
  • 使用—help选项获取帮助

    使用—help选项可以显示命令的使用方法以及命令选项的含义。只要在所需要显示的命令后面输入“—help”选项,然后就可以看到所查命令的帮助内容了。
    命令语法:
    [命令]—help.
    [例3.9]查看mkdir命令的帮助信息。
    [root@rhel ~]# mkdir --help

3.Shell基础

  • Shell简介

    • 在AT&T工作的Dennis Ritchie 和Ken Thompson两人在设计Unix操作系统的时候,想要为用户创建一种与Unix系统交流的方法。那时的操作系统带有命令解释器。命令解释器接受用户的命令,然后解释它们,因而计算机可以使用这些命令。
    • Ritchie和Thompson想要提供比当时的命令解释器具备更优异功能的工具。这导致了Bourne Shell(通称为sh)的开发,由S.R.Bourne创建。自从Bourne Shell出现以后,其它类型Shell也被一一开发,比如C Shell(csh)和Korn Shell(ksh)。
    • Shell接收用户命令,然后调用相应的应用程序,同时它还是一种程序设计语言,是系统管理维护时的重要工具。作为命令语言,它交互式的解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令。作为程序设计语言,它可以定义各种变量和参数,并提供了许多在高级语言中才具有的控制结构(循环和分支)。
    • Shell命令重新初始化用户的登录会话。当给出该命令时,就会重新设置进程的控制终端的端口特征,并取消对端口的所有访问。然后Shell命令为用户把进程凭证和环境重新设置为缺省值,并执行用户的初始程序。根据调用进程的登录用户标识建立所有的凭证和环境。
    • 目前流行的Shell有sh、csh、ksh、tcsh 和bash等。大部分Linux系统的默认Shell类型为bash。
  • bash简介

    • bash(Bourne Again Shell)最早是在1987年由布莱恩.福克斯开发的一个为GNU计划编写的Unix Shell。bash目前是大多数Linux系统默认的Shell,它还能运行于大多数Unix风格的操作系统上。
    • bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经过修改就可以在bash中执行,只有那些引用了Bourne特殊变量或使用了Bourne内置命令的脚本才需要修改。bash的命令语法很多来自ksh和csh,比如命令行编辑、命令历史、目录栈、$RANDOM变量、$PPID变量以及POSIX命令置换语法。
  • bash命令
    • Linux系统的标准提示符包括了用户登录名、登录的主机名、当前所在的工作目录路径和提示符号。
      以普通用户zhangsan登录名为rhel的主机,他的工作目录是/home/zhangsan,如下所示。
      [zhangsan@rhel ~]$
      以root用户登录系统的提示符如下所示。
      [root@rhel ~]#
  • Shell命令一般格 式
    • 要运行命令的话,只需要在提示符后敲进命令,然后再按“回车”键。
      命令语法:
      [Shell命令][选项][参数]
    • 所有选项在该命令的man手册页中都有详细的介绍,而参数则由用户提供。选项决定命令如何工作,而参数则用于确定命令作用的目标。
    • 选项有短命令行选项和长命令选项两种。
  • Linux系统命令分类
    • bash内置的命令
      如果是bash内置的命令,则由bash负责回应。
    • 应用程序
      如果是应用程序,那么Shell会找出该应用程序,然后将控制权交给内核,由内核执行该应用程序,执行完之后,再将控制权交回给Shell。

4.使用bash

1、常用控制组合键

控制组合键 功能
Ctrl+l 清屏
Ctrl+o 执行当前命令,并选择上一条命令
Ctrl+s 阻止屏幕输出
Ctrl+q 允许屏幕输出
Ctrl+c 终止命令
Ctrl+z 挂起命令
Ctrl+m 回车
Ctrl+d 输入结束,即EOF的意思,或者注销Linux系统

2、光标操作

组合键 功能
Ctrl+a 移动光标到命令行首
Ctrl+e 移动光标到命令行尾
Ctrl+f 按字符前移(向右)
Ctrl+b 按字符后移(向左)
Ctrl+xx 在命令行首和光标之间移动
Ctrl+u 删除从光标到命令行首的部分
Ctrl+k 删除从光标到命令行尾的部分
Ctrl+w 删除从光标到当前单词开头的部分
Ctrl+d 删除光标处的字符
Ctrl+h 删除光标前的一个字符
Ctrl+y 插入最近删除的单词
Ctrl+t 交换光标处字符和光标前面的字符
Alt+f 按单词前移(向右)
Alt+b 按单词后移(向左)
Alt+d 从光标处删除至单词尾
Alt+c 从光标处更改单词为首字母大写
Alt+u 从光标处更改单词为全部大写
Alt+l 从光标处更改单词为全部小写
Alt+t 交换光标处单词和光标前面的单词
Alt+Backspace 与Ctrl+w功能类似,分隔符有些差别

3、特殊字符

符号 功能
~ 用户主目录
` 反引号,用来命令替代
# 注释
$ 变量取值
& 后台进程工作
( 子Shell开始
) 子Shell结束
\ 使命令持续到下一行
\ 管道
< 输入重定向
> 输出重定向
>> 追加重定向
单引号
双引号
/ 路径分割符
; 命令分隔符

4、通配符

符号 功能
代表任何单一字符
* 代表任何字符
[字符组合] 在中括号中的字符都符合,比如[a~z]代表所有的小写字母
[!字符组合] 不在中括号中的字符都符合,比如[!0-9]代表非数字的都符合

5.Shell实用功能

1、命令行自动补全

  • 在Linux系统中,有太多的命令和文件名称需要记忆,使用命令行补全功能可以快速的写出文件名和命令名。
    如果需要快速地从当前所在的目录跳转到
    /usr/src/kernels/目录,可以执行以下操作。
    [root@rhel ~]# cd /u<Tab>/sr<Tab>/k<Tab>

    是按”Tab”键的意思,使用”Tab”键也称为命令行自动补全,这在平常应用中是不可缺少的

2、命令历史记录

  • 在操作Linux系统的时候,每一个操作的命令都会记录到命令历史中,在以后可以通过命令历史查看和使用以前操作的命令。
  • bash启动的时候会读取~/.bash_history文件,并将其载入到内存中,$HISTFILE变量就用于设置~/.bash__history文件,bash退出时也会把内存中的历史记录回写到~/.bash_history文 件中。
  • 使用history命令可以查看命令历史记录,每一条命令前面都会有一个序列号标示。
    命令语法:history[选项]
  • Ctrl+R 使用历史记录中的命令

3、使用命令历史

举例 描述
!! 运行上一个命令
!6 运行第6个命合
!8/test 运行第8个命令并在命令后面加上/test
!?CF? 运行上一个包含CF字符串的命令
!ls 运行上一个Is命令(或以ls开头的历史命令)
!ls:s/CF/G 运行上一个Is命令,其中把CF替换成G
fc 编辑并运行上一个历史命令
fc 6 编辑并运行第6条历史命令
\^boot\^root\^ 快速替换。将最后一个命合中的boot替换为root后运行
!-5 运行倒数第5个命令
!$ 运行前一个命令最后的参数

[例3.11]使用命令历史记录功能键。
[root@rhel ~]# mkdir/root/aaa
//创建目录/root/aaa
[root@rhel ~]# cd !$
cd/root/aaa
//!$是指重复前一个命令最后的参数,参数是/root/aaa
[root@rhel aaa]# pwd
/root/aaa
//显示用户当前目录是/root/aaa

4、搜索历史命令

快捷键 描述
查看上一个命令
查看下一个命令
Ctrl+p 查看历史列表中的上一个命令
Ctrl+n 查看历史列表中的下一个命令
Ctrl+r 向上搜索历史列表
Alt+p 向上搜索历史列表
Alt+> 移动到历史列表末尾

5、命令排列

  • 如果希望一次执行多个命令,Shell允许在不同的命令之间,放上特殊的排列字符。

    • 1.使用”;”
      使用”;”命令时先执行命令1,不管命令1是否出错,接下来就执行命2。
      命令语法:命令1;命令2

    • 2.使用”&&”
      使用”&&”命令时只有当命令1正确运行完毕后,才能执行命令2。
      命令语法:命令1&&命令2

6、命令替换

  • 在Linux系统中,Shell命 令的参数可以由另外一个命令的结果来替代,这种称之为命令替换。
    1.使用”$()”
    命令语法:命令1 $(命令2)
    2.使用”`“
    命令语法:命令1`命令2`

7、命令别名

  • 在需要执行某-一个非常长的命令时,所有的命令以及命令的选项、参数都要一一输入,很枯燥也容易出现错误。可以为常用命令定义快捷方式,这些快捷方式可以用比较简单的命令别名来定义。
    • 1.创建别名.
      使用alias命令可以为命令定义别名。如果命令中有空格的话,就需要使用双引号(比如在命令与选项之间就有空格)
      命令语法:alias[别名]=[需要定义别名的命令]
    • 2.取消别名
      当用户需要取消别名的定义时,可以使用unalias命令。
      命令语法:unalias[别名]

8、管道

  • Linux系统的理念是汇集许多小程序,每个程序都有特殊的专长。复杂的任务不是由大型软件完成,而是运用Shell的机制,组合许多小程序共同完成。管道就在其中发挥着重要的作用,它可以将某个命令的输出信息当作某个命令的输入,由管道符号“|”来标识。
    命令语法:
    [命令1]|[命令2]|[命令3]
    • [例3.22]
      使用简单的管道。
      [root@rhel ~]#Is/etc|more
      abr
      tacpi
      adjtime
      akonadi
      —More—
      //命令|s/etc显示/etc目录的内容,命令more是分页显示内容
    • [例3.23]
      使用复杂的管道。
      [root@PC-LINUX ~]#rpm -qa|grep a|more
      //命令rpm-qa显示已经安装在系统上的RPM包,命令grepa是过滤软件包,命令more是分页显示这些信息

6.重定向

  • 希望将命令的输出结果保存到文件中,或者以文件内容作为命令的参数,这时就需要用到重定向。重定向不使用系统的标准输入端口、标准输出端口或是标准错误端口,而是进行重新的指定。
  • 重定向有四种方式:输出重定向、输入重定向、错误重定向以及同时实现输出和错误的重定向。

输出重定向

  • 输出重定向,即将某一命令执行的输出保存到文件中,如果已经存在相同的文件,那么覆盖源文件中的内容。命令语法:
    [命令]>[文件]
    • [例3.24]使用输出重定向将/boot目录的内容保存到/root/abc文件中。
      [root@rhel ~]#ls/boot >/root/abc
      [例3.25]使用echo命令和输出重定向创建/root/mm文件,文件内容是hello。
      [root@rhel ~]#echo Hello >/root/mm
      [root@rhel ~]#cat/root/mm
      Hello
      //显示文件/root/mm,可以看到文件的内容是Hello
  • 另外一种特殊的输出重定向是输出追加重定向,即将某一命令执行的输出添加到已经存在的文件中。
    命令语法:
    [命令]>>[文件]
    • [例3.26]使用输出追加重定向将数据写入文件/root/ao。
      [root@rhel ~]#echo Hello >/root/ao
      //先创建文件/root/ao,文件内容是Hello
      [root@rhel ~]#echo Linux >>/root/ao
      //向文件/root/ao中追加数据Linux
      [root@rhel ~]#cat/root/ao
      Hello
      Linux

输入重定向

  • 输入重定向,即将某一文件的内容作为命令的输入。
    命令语法:
    [命令]<[文件]

    • [例3.27]使用输入重定向将文件/root/mm的内容作为输入让cat命令执行。
      [root@rhel ~]#cat </root/mm
      Hello
      //可以看到文件/root/mm的内容是Hello
  • 另外一种特殊的输入重定向是输入追加重定向,这种输入重定向告诉Shell,当前标准输入来自命令行的一对分隔符之间的内容。
    命令语法:
    [命令]<<[分隔符]
    >[文本内容]
    >[分隔符]

    • [例3.28]使用输入追加重定向创建/root/bc文件。
      [root@rhel ~]#cat >/root/bc <<EOF
      \>Hello Linux
      \>EOF
      //一般使用EOF作为分隔符

错误重定向

  • 错误重定向,即将某一命令执行的出错信息输出到指定文件中。
    命令语法:
    [命令]2>[文件]
    • [例3.29]查看 根本不存在的/root/kk文件,出现报错信息,将其保存到文件/root/b中。
      [root@rhel ~]#cat/root/kk 2> /root/b
      [root@rhel ~]#cat/root/b
      cat:lrootlkk:没有那个文件或目录
      //使用cat命令查看/root/b文件,可以看到其内容就是执行命令cat/root/kk的报错信息
  • 另外一种特殊的错误重定向是错误追加重定向,即将某一命令执行的出错信息添加到已经存在的文件中
    命令语法:
    [命令]2>>[文件]
    • [例3.30]使用错误追加重定向,将执行命令的多次出错信息保存到文件/root/b中。
      [root@rhel ~]#cat/root/kk 2> /root/b
      [root@rhel ~]#cat/root/kk 2>> /root/b
      [root@rhel ~]#cat/root/b
      cat:/root/kk:没有那个文件或目录cat:/root/kk:没有那个文件或目录

同时实现输出和错误重定向

  • 同时实现输出和错误的重定向,即可以同时实现输出重定向和错误重定向的功能。
    命令语法:
    [命令]&>[文件]
    [例3.31]同时使用输出和错误重定向。
    [root@rhel ~]#ls/boot &> /root/kk
    [root@rhel ~]#cat/root/kk
    config-3.3.4-5.fc17.i686.PAE
    grub
    grub2
    initramfs-3.3.4-5.fc17.i686.PAE.img
    lost+found
    System.map-3.3.4-5.fc17.i686.PAE
    tboot.gz
    tboot-syms
    vmlinuz-3.3.4-5.fc17.i686.PAE
    //因为/boot目录下有文件,所以最终使用了输出重定向

7.vi编辑器

  • 文本编辑器有很多,图形模式下有gedit,kwrite等编辑器,文本模式下的编辑器有vi,vim (vi的增强版本)和nano。
  • vi和vim是Linux系统中最常用的编辑器,本节主要讲述vi编辑器的使用。

vi编辑器简介

  • vi编辑器是Linux系统字符界面下最常使用的文本编辑器,用于编辑任何ASCII文本,对于编辑源程序尤其有用。vi编辑器功能非常强大,通过使用vi编辑器,可以对文本进行创建、查找、替换、删除、复制和粘贴等操作。
  • 在Linux系统Shell提示符下输入vi和文件名称后,就进入vi编辑界面。如果系统内还不存在该文件,就意味着创建文件,如果系统内存在该文件,就意味着编辑该文件。
  • vi编辑器有3种基本工作模式,分别是命令模式、插入模式和末行模式。

1、命令模式

  • 进入vi编辑器之后,系统默认处于命令模 式。命令模式控制屏幕光标的移动,字符、 字或行的删除,某区域的移动、复制等。 在命令模式下,按冒号键“:”可以进入末 行模式,按字母键“a”就可以进入插入模式。

2、插入模式

  • 只有在插入模式下,才可以进行文本编辑。在插入模式下按“Esc”键可回到命令模式。

3、末行模式

  • 将文件保存或退出vi编辑器,也可以设置 编辑环境、替换字符或删除字符。
  • 在末行模式下按“Esc”键可以回到命令模式。

进入插入模式

命令 功能
i 从光标当前所在位置之前开始插入
a 从光标当前所在位置之后开始插入
I 在光标所在行的行首插入
A 在光标所在行的行末尾插入
o 在光标所在的行的下面新开一行插入
O 在光标所在的行的上面新开一行插入
s 在光标所在的行的上面新开一行插入
S 删除光标所在的行,然后进入插入模式

光标移动

命令 功能
使光标向上移动一行
使光标向下移动一行
使光标向左移动一行
使光标向右移动一行
k 使光标向上移动一行
j 使光标向下移动一行
h 使光标向左移动一行
l 使光标向右移动一行
nk 使光标向上移动n行,n代表数字
nj 使光标向下移动n行,n代表数字
nh 使光标向左移动n个字符,n代表数字
nl 使光标向右移动n个字符,n代表数字
H 使光标移动到屏幕的顶部
M 使光标移动到屏幕的中间
L 使光标移动到屏幕的底部
Ctrl+b 使光标往上移动一页屏幕
Ctrl+f 使光标往下移动一页屏幕
Ctrl+u 使光标往上移动半页屏幕
Ctrl+d 使光标往下移动半页屏幕
数字0 使光标移到所在行的行首
$ 使光标移动到光标所在行的行尾
^ 使光标移动到光标所在行的行首
w 使光标跳到下一个字的开头
W 使光标跳到下一个字的开头,但会忽略一些标点符号
e 使光标跳到下一个字的字尾
E 使光标跳到下一个字的字尾,但会忽略一些标点符号
b 使光标回到上一个字的开头
B 使光标回到上一个字的开头,但会忽略一些标点符号
( 使光标移动到上一个句首
) 使光标移动到下一个句首
{ 使光标移动到上一个段落首
} 使光标移动到下一个段落首
G 使光标移动到文件尾(最后一行的第一个非空白字符处)
gg 使光标移动到文件首(第一行第一个非空白字符处)
Ctrl+p 使光标向上移动一行
Ctrl+n 使光标向下移动一行
n\ 使光标移动到第n个字符处,n代表数字
nG 使光标移动到第n行首,n代表数字
n+ 使光标向下移动n行,n代表数字
n- 使光标向上移动n行,n代表数字
n$ 使光标移动到以当前行算起的第n行尾,n代表数

命令模式命令

类型 命令 功能
删除 x 删除光标所在位置的字符
删除 X 删除光标所在位置的前面一个字符
删除 nx 删除光标所在位置开始的n个字符,n代表数字
删除 nX 删除光标所在位置前面n个字符,n代表数字
删除 dd 删除光标所在行
删除 ndd 从光标所在行开始删除n行,n代表数字
删除 db 删除光标所在位置的前面一个单词
删除 ndb 删除光标所在位置的前面n个单词,n代表数字
删除 dw 从光标所在位置开始删除一个单词
删除 ndw 从光标所在位置开始删除几个单词,n代表数字
删除 d$ 删除光标到行尾的内容(含光标所在处字符)
删除 D 删除光标到行尾的内容(含光标所在处字符)
删除 dG 从光标位置所在行一直删除到文件尾
复制和粘贴 yw 复制光标所在位置到单词尾的字符
复制和粘贴 nyw 复制光标所在位置开始的n个单词,n代表数字
复制和粘贴 yy 复制光标所在行
复制和粘贴 nyy 复制从光标所在行开始的n行,n代表数字
复制和粘贴 y$ 将缓冲区内的内容写到光标所在的位置
复制和粘贴 y^ 复制光标前面所在位置到行首内容到缓存区
复制和粘贴 YY 将当前行复制到缓冲区
复制和粘贴 nYY 将当前开始的n行复制到缓冲区,n代表数字
复制和粘贴 p 将缓冲区内的内容写到光标所在的位置
替换 r 替换光标所在处的字符,按[r]键之后输入要替换的字符
替换 R 替换光标所到之处的字符,直到按下[ESC]键为止,按[R]键之后输入要替换的字符
撤销和重复 u 撤销上一个操作。按多次u可以执行多次撤销
撤销和重复 U 取消所有操作
撤销和重复 . 再执行一次前面刚完成的操作
列出行号 Ctrl+g 列出光标所在行的行号
保存退出 ZZ 保存退出
保存退出 ZQ 不保存退出
查找 / 先按[/]键,再输入想查找的字符,如果第一次查找的关键字不是想要的,可以一直按[n]键会往后查找下一个关键字,而按[N]键会往相反的方向查找
查找 ? 先按[?]键,再输入想查找的字符,如果第一.次查找的关键字不是想要的,可以一直按[n]键会往前查找下一个关键字,而按[N]键会往相反的方向查找

update: 2020-7-20 20:49:22

四、目录和文件管理

Linux系统与Windows系统有很大的不同, 它以目录的形式挂载文件系统,其目录结 构是一个分层的树形结构。链接是一种在 共享文件和访问它的用户的若干目录项之 间建立联系的方法,Linux系统中包括硬链接和软链接两种方式。

1.Linux文件类型

  • 在Linux系统中除了一般文件之外,所有的目录和设备(如光驱、硬盘等)都是以文 件的形式存在的。 Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。
  • 通过一般应用程序创建的文件,比如file.txt、file.tar.gz,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多称之为普通文件。
  • Linux文件类型常见的有:普通文件、目录文件、设备文件(字符设备文件和块设备文件)、管道文件和符号链接文件等。

1.普通文件

  • 用“ls -lh”命令查看某个文件的属性, 可以看到有类似“-rw———-”的属性符 号,其属性第一个符号是“-”,这样的文 件在Linux系统中就是普通文件。这些文件 一般是用一些相关的应用程序创建,比如
    图像工具、文档工具或归档工具等。

2.目录文件

  • 当在某个目录下执行“ls -lh”命令,看 到有类似“drwxr-xr-x”的属性符号,其 属性第一个符号是“d”,这样的文件在Linux系统中就是目录文件。

3.设备文件

  • Linux系统中的/dev目录中有大量的设备文 件,主要是块设备文件和字符设备文件。
    • (1)块设备文件 块设备的主要特点是可以随机读写,而最 常见的块设备就是磁盘,如/dev/hda1、 /dev/sda1等。用“ls -l”命令查看某个文件的属性,可以看到有类似“brw-rw—-”的属性符号,其属性第一个符号是 “b”,这样的文件在Linux系统中就是块设备文件。
    • (2)字符设备文件 最常见的字符设备文件是打印机和终端, 可以接收字符流。/dev/null是一个非常有 用的字符设备文件,送入这个设备的所有 内容都被忽略。用“ls -l”命令查看某个文件的属性,可以看到有类似“crw—w—-”的属性符号,其属性第一个符号是 “c”,这样的文件在Linux系统中就是字符设备文件。

4.管道文件

  • 管道文件有时候也被叫做FIFO文件(FIFO 是先进先出的意思),管道文件就是从一 头流入,从另一头流出。用“ls -l”命令查看某个文件的属性,可以看到有类似 “prw———-”的属性符号,其属性第一 个符号是“p”,这样的文件在Linux系统中就是管道文件。

5.链接文件

  • 链接文件有两种类型:软链接文件和硬链接文件。
    • (1)软链接文件
      • 软链接文件又叫符号链接文件,这个文件包含了另一个文 件的路径名。其可以是任意文件或目录,可以链接不同文 件系统的文件。在对软链接文件进行读写的时候,系统会 自动地把该操作转换为对源文件的操作,但删除软链接文 件时,系统仅仅删除软链接文件,而不删除源文件本身。
      • 用“ls -l”命令查看某个文件的属性,可以看到有类似“lrwxrwxrwx”的属性符号,其属性第一个符号是“l”,这样的文件在Linux系统中就是软链接文件。
    • (2)硬链接文件
      • 硬链接是已存在文件的另一个文件,对硬链接文件进行读写和删除操作时,结果和软链接相同。但如果删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了原有的 内容。这时,系统就“记”了它曾经是硬链接文件,而把它当成一个普通文件。
      • 用“ls -l”命令查看某个文件的属性,可以看到第二列 的文件硬链接数大于1 ,这样的文件在Linux系统中就是硬链接文件。

2.Linux目录结构

  • Linux系统都有根文件系统,它包含系统引 导和使其它文件系统得以挂载所必要的文 件,根文件系统需要有单用户状态所必须 的足够的内容,还应该包括修复损坏系统、 恢复备份等工具。
  • Linux系统的目录结构是分层的树形结构,
    都是挂载在根文件系统“/”下。

Linux目录结构

目录 描述
/home 包含Linux系统上各用户的主目录,子目录名称默认以该用户 名命名
/root 是root用户的主目录
/bin 包含常用的命令文件,不能包含子目录
/sbin 包含系统管理员和root用户所使用的命令文件
/dev 包含大部分的设备文件,比如磁盘、光驱等
/lib 包含Linux系统的共享文件和内核模块文件 /lib/modules目录存放核心可加载模块
/lib64 包含64位版本Linux系统的共享文件和内核模块文件
/tmp 包含一些临时文件
/mnt 手动为某些设备(比如硬盘)挂载提供挂载目录
/boot 包含Linux系统的内核文件和引导装载程序(如GRUB)文件
/opt 包含某些第三方应用程序的安装文件
/media 由系统自动为某些设备(一般为光盘、U盘等设备)挂载提供挂载目录
/var 该目录存放不经常变化的数据,如系统日志、打印队列、DNS数据库文件等
/etc 包含Linux系统上大部分的配置文件,建议修改配置文件之前先备份
/usr 包含可以供所有用户使用的程序和数据
/srv 存储一些服务启动之后所需要取用的资料目录
/run 一个临时文件系统,一些程序或服务启动以后,会将他们的PID放置在该目录中
/sys 在Linux系统提供热插拔能力的同时,该目录包含所检测到的硬件设置,它们被 转换成/dev目录中的设备文件
/proc 是一个虚拟的文件系统,它不存在磁盘上,而是由内核在内存中产生, 用于提供系统的相关信息。 下面说明在/proc目录下的一些最重要的文件。
/proc/cpuinfo:该文件保存计算机CPU信息。
/proc/filesystems:该文件保存Linux文件系统信息。
/proc/ioports:该文件保存计算机I/O端口号信息。
/proc/version:该文件保存Linux系统版本信息。
/proc/meminfo:该文件保存计算机内存信息。

3.文件和目录操作

  • 本节主要讲述在Linux系统下如何使用命令 对文件和目录进行操作,涉及的命令有pwd、cd、ls、touch、mkdir、rmdir、cp、mv、rm、wc等。

pwd:显示工作目录路径

  • 显示当前用户所处的工作目录的绝对路径。
  • 命令语法: pwd [选项]
    【例4.1】 显示用户当前工作目录路径。
    [root@rhel sysconfig]# pwd
    /etc/sysconfig
    //用户当前工作目录路径是/etc/sysconfig

cd:更改工作目录路径

  • 更改用户的工作目录路径。工作目录路径 可以使用绝对路径名或相对路径名,绝对 路径从/(根)开始,然后循序到所需的目录下,相对路径从当前目录开始。
  • 命令语法: cd [选项] [目录]
    【例4.2】 更改用户工作目录路径为/etc。
    [root@rhel sysconfig]# cd /etc
    [root@rhel etc]# pwd
    /etc
    //查看当前目录,已经更改为/etc了
    【例4.3】 更改目录位置至当前目录的父目录。
    [root@rhel etc]# pwd
    /etc
    [root@rhel etc]# cd ..
    [root@rhel /]# pwd
    /
    //可以看到目录已经更改为当前目录的父级目录“/”了
    【例4.4】 更改目录位置为用户主目录。
    [root@rhel /]# pwd
    /
    [root@rhel /]# cd ~
    [root@rhel ~]# pwd
    /root
    //可以看到目录已经更改为当前用户的主目录
    【例4.5】 更改目录位置至用户zhangsan的主目录。
    [root@rhel ~]# cd ~zhangsan
    [root@rhel zhangsan]# pwd
    /home/zhangsan
    //可以看到目录已经更改为用户zhangsan的主目录/home/zhangsan

ls:列出目录和文件信息

  • 对于目录而言将列出其中的所有子目录与 文件信息;对于文件而言将输出其文件名 以及所要求的其它信息。
  • 命令语法:ls [选项] [目录|文件]

ls命令显示的详细信息

列数 描述
1 第1个字符表示文件的类型
第2~4个字符表示文件的用户所有者对此文件的访问权限
第5~7个字符表示文件的组群所有者对此文件的访问权限
第8~10个字符表示其他用户对此文件的访问权限
2 文件的链接数
3 文件的用户所有者
4 文件的组群所有者
5 文件长度(也就是文件大小,不是文件的磁盘占用量)
6~8 文件的更改时间(mtime), 或者是文件的最后访问时间(atime)
9 文件名称

touch:创建空文件、更改文件时间

  • 创建空文件以及更改文件的时间(atime和 mtime)。
  • 命令语法:touch [选项] [文件]
  • 【例4.9】 创建空文件file,file1和file2。
    [root@rhel ~]# touch file1
    [root@rhel ~]# touch file2 file3
    [root@rhel ~]# ls -l file1 file2 file3
    -rw-r--r--. 1 root root 0 6月 3 05:45 file1
    -rw-r--r--. 1 root root 0 6月 3 05:45 file2
    -rw-r--r--. 1 root root 0 6月 3 05:45 file3
    //file1,file2,file3这3个都是空文件,文件内没有任何数据
  • 【例4.10】将文件file1的时间记录改为6月7日19点 30分,时间格式为MMDDHHmm。
    [root@rhel ~]# ls -l file1
    -rw-r--r--. 1 root root 0 6月 3 05:45 file1
    //空文件file1其创建日期为6月3日5:45
    [root@rhel ~]# touch -c -t 06071930 file1
    [root@rhel ~]# ls -l file1 -rw-r--r--. 1 root root 0 6月 7 19:30 file1
    //可以看到文件file1现在的时间已经改为6月7日19点30分

mkdir:创建目录

  • 在Linux系统中创建目录。
  • 命令语法:mkdir [选项] [目录]
  • 【例4.11】 创建目录newdir1,其默认权限为755。
    [root@rhel ~]# mkdir newdir1
    [root@rhel ~]# ls -ld
    drwxr-xr-x. 2 root root 4096 6月 3 05:46 newdir1
    //目录newdir1的权限为rwxr-xr-x(755)

rmdir:删除空目录

  • 在Linux系统中删除空目录。
  • 命令语法: rmdir [选项] [目录]
  • 【例4.13】 删除空目录newdir1。
    [root@rhel ~]# rmdir newdir1

cp:复制文件和目录

  • 复制文件和目录到其它目录中。如果同时 指定两个以上的文件或目录,且最后的目 的地是一个已经存在的目录,则它会把前 面指定的所有文件或目录复制到该目录中。 若同时指定多个文件或目录,而最后的目 的地并非是一个已存在的目录,则会出现 错误信息。
  • 命令语法:cp [选项] [源文件|目录] [目标文件|目录]
  • 【例4.15】 将/etc/grub2.cfg文件复制到/root目 录下,并改名为grub。
    [root@rhel ~]# cp /etc/grub2.cfg /root/grub
    【例4.16】 将文件/etc/grub2.cfg复制到/root目 录下。
    [root@rhel ~]# cp /etc/grub2.cfg /root
    【例4.17】 将/boot目录中的所有文件及其子目录 复制到目录/root中。
    [root@rhel ~]# cp -r /boot /root

mv:文件和目录改名、移动文件和目录路径

  • 对文件和目录更改名称以及移动文件和目 录的路径。
  • 命令语法:mv [选项] [源文件|目录] [目标文件|目录]
  • 【例4.18】 将/root/picture目录下所有的后缀名为“.png” 的文件移到/usr/local/share/picture目录下。
    [root@rhel ~]# mv -f /root/picture/*.png /usr/local/share/picture
    【例4.19】 把/root/picture目录下的文件kdepic.png改名 为life.png。
    [root@rhel ~]# mv /root/picture/kdepic.png /root/picture/life.png
    【例4.20】 把目录/root/pitcure名称更改为 /root/mypicture。
    [root@rhel ~]# mv /root/picture /root/mypicture

rm:删除文件或目录

  • 删除系统中的文件或目录。
  • 命令语法:rm [选项] [文件|目录]
  • 【例4.21】 删除当前目录下的file4文件。
    [root@rhel ~]#rm file4 rm:是否删除普通文件“file4”? y
    //输入y确认删除该文件
    【例4.22】 连同文件/root/ab/a和目录/root/ab一起删除。
    [root@rhel ~]# mkdir /root/ab
    [root@rhel ~]# touch /root/ab/a
    //创建目录/root/ab和文件/root/ab/a
    [root@rhel ~]# rm -rf /root/ab
    //连同文件/root/ab/a和目录/root/ab一起删除

wc:统计文件行数、单词数和字节数和字符数

  • 统计指定文件的行数、单词数、字节数和 字符数,并将统计结果显示输出到屏幕。 如果没有给出文件名,则从标准输入读取。 wc同时也给出所有指定文件的总统计数。 单词是由空格字符区分开的最大字符串。 输出列的顺序和数目不受选项的顺序和数目的影响。总是按行数、单词数、字节数、 文件的顺序显示每项信息。
  • 命令语法:wc [选项] [文件]
  • 【例4.23】 统计/root/aa文件的行数、单词数和 字符数。
    [root@rhel ~]#cat /root/aa
    a b
    c de f
    中国 g h
    //查看/root/aa文件内容
    [root@rhel ~]#wc /root/aa
    3 8 22 /root/aa

4.链接文件

  • 在Linux系统中,内核为每一个新创建的文 件分配一个inode(索引节点)号,文件属 性保存在索引节点里,在访问文件时,索 引节点被复制到内存里,从而实现文件的快速访问。

链接文件简介

  • 链接是一种在共享文件和访问它的用户的 若干目录项之间建立联系的方法。Linux系 统中包括硬链接和软链接(也被称为符号链接)两种。

    • 硬链接

      硬链接是一个指针,指向文件inode,系统 并不为它重新分配inode,两文件具有相同的inode。硬链接节省空间,也是Linux系统整合文件系统的传统方式。
      硬链接文件有两个限制:
      (1)不允许给目录创建硬链接;
      (2)只有在同一文件系统中的文件之间才能创建链接。

    • 软链接

      软链接也叫符号链接,这个文件包含了另 一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件,和 Windows下的快捷方式相似。链接文件甚 至可以链接不存在的文件,这就产生一般 称之为“断链”的问题,链接文件甚至可以循环链接自己。

  • 硬链接和软链接的区别

    硬链接记录的是目标的inode,软链接记录 的是目标的路径。软链接就像是快捷方式, 而硬链接就像是备份。软链接可以做跨分 区的链接,而硬链接由于inode的缘故,只 能在本分区中做链接。所以软链接的使用频率要高得多。

创建和使用链接文件

  • 使用ln命令可以创建链接文件(包括软链 接文件和硬链接文件)。
  • 命令语法:ln [选项] [源文件名] [链接文件名]
  • 【例4.25】 硬链接文件的使用。
    [root@rhel ~]#echo hello > a [root@rhel ~]#ln a b
    【例4.26】 软链接文件的使用。
    [root@rhel ~]#echo hello > a
    [root@rhel ~]#ln –s a b

五、Linux常用命令

1.文本内容显示

  • 本节主要讲述Linux系统中文本内容显示的相关命令,这些命令有cat,more,less,head,tail,(tail -f)

cat:显示文本文件

  • 显示文本文件的内容,也可以把几个文件内容附加到另一个文件中。如果没有指定 文件,或者文件为“-”,那么就从标准输入读取。
  • 命令语法:cat [选项] [文件]
  • 【例5.1】 显示/etc/inittab文件的内容。 [root@rhel ~]# cat /etc/inittab
    【例5.2】 把textfile1文件的内容加上行号后输 入到textfile2文件中。
    [root@rhel ~]# cat -n textfile1 > textfile2
    【例5.3】 使用cat命令创建mm.txt。
    [root@rhel ~]#cat >mm.txt<<EOF
    \>Hello
    \>Linux
    \>EOF //在此输入字符EOF,会自动回到shell提示符界面

more:分页显示文本文件

  • 分页显示文本文件的内容。类似于cat命令, 不过是以分页方式显示文件内容,方便使 用者逐页阅读,其最基本的按键就是按空 格键就显示下一页内容,按[b]键返回显示 上一页内容。
  • 命令语法:more [选项] [文件名]
  • 【例5.4】 分页显示/etc/services文件的内容。
    [root@rhel ~]# more /etc/services
    【例5.5】 逐页显示testfile文件内容,如有连续两行以上 空白行则以一行空白行显示。
    [root@rhel ~]# more -s testfile
    【例5.6】 从第20行开始显示testfile文件的内容。
    [root@rhel ~]# more +20 testfile
    【例5.7】 一次两行显示/etc/passwd文件内容。
    [root@rhel ~]# more -2 /etc/passwd

less:回卷显示文本文件

  • 回卷显示文本文件的内容。less命令的作 用与more十分相似,都可以用来浏览文本 文件的内容,不同的是less命令允许使用 者往回卷动。
  • 命令语法:less [选项] [文件名]
  • 【例5.8】 回卷显示/etc/services文件的内容。
    [root@rhel ~]# less /etc/services

head:显示指定文件前若干行

  • 显示指定文件的前若干行文件内容。如果没有给出具体行数值,默认缺省设置为10 行。如果没有指定文件,head就从标准输入读取。
  • 命令语法:head[选项][文件]
  • 【例5.9】 查看/etc/passwd文件的前100个字节数据内容。
    [root@rhel ~]# head –c 100 /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:\x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nol
    【例5.10】 查看/etc/passwd文件的前3行数据内容。
    [root@rhel ~]# head -3 /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

tail:查看文件末尾数据

  • 查看文件的末尾数据,默认显示指定文件的 最后10 行到标准输出。如果指定了多个文 件,tail会在每段输出的开始添加相应文件 名作为头。如果不指定文件或文件为“-”, 则从标准输入读取数据。
  • 命令语法:tail [选项] [文件名]
  • 【例5.11】查看/etc/passwd文件末尾3行数据内容。
    [root@rhel ~]# tail -3 /etc/passwd
    news:x:9:13:News server user:/etc/news:/bin/bash
    distcache:x:94:94:Distcache:/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    【例5.12】 查看文件/etc/passwd末尾100字节的数据内容。
    [root@rhel ~]# tail -c 100 /etc/passwd
    er:/etc/news:/bin/bash
    distcache:x:94:94:Distcache:/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
  • tail -f 可以实时刷新末尾数据

2.文本内容处理

  • 本节主要讲述Linux系统中文本内容处理的相关命令,这些命令有sort,uniq,cut,comm,diff(diff3)。

sort:对文件中的数据进行排序

  • 对文件中的数据进行排序,并将结果显示 在标准输出上。
  • 命令语法:sort [选项] [文件]
  • 【例5.13】 将文件textfile1数据排序,并显示在屏幕上。
    [root@rhel ~]# sort textfile1
    a
    b
    c
    【例5.14】读取textfile1文件内容,以倒序排序该文件并显 示在屏幕上。
    [root@rhel ~]# sort -r textfile1
    c
    b
    a

uniq:将重复行从输出文件中删除

  • 将文件内的重复行数据从输出文件中删除, 只留下每条记录的惟一样本。
  • 命令语法:uniq [选项] [文件]
  • 【例5.15】查看文件file3中重复的数据内容。
    [root@rhel ~]# cat file3 aaa aaa bbb
    [root@rhel ~]# uniq -d file3 aaa
    //file3文件中重复行数据的内容为aaa
    【例5.16】查看文件file3中不重复的数据内容。
    [root@rhel ~]# uniq -u file3
    bbb //file3文件中不重复行数据的内容为bbb

cut:从文件每行中显示出选定的字节、字符或字段

  • 从文件的每行中输出选定的字节、字符或字段(域)。只能使用-b、-c或-f选项中的 一个。每一个列表都是专门为一个类别作 出的,或者可以用逗号隔开要同时显示的 不同类别。输入顺序将作为读取顺序,每 个仅能输入一次。
  • 命令语法:cut [选项] [ 文件 ]
  • 【例5.17】显示文件/etc/passwd中的用户登录名和用户名全 称字段,这是第1个和第5个字段,由冒号隔开。
    [root@rhel ~]# cut -f 1,5 -d: /etc/passwd
    root:root
    bin:bin
    daemon:daemon
    adm:adm
    lp:lp
    ……

comm:逐行比较两个已排过序的文件

  • 比较两个已排过序的文件,并将其结果显 示出来。

  • 命令语法:
    comm [选项] [文件1] [文件2]

    | 选项 | 选项含义 |
    | —— | ——————————— |
    | -1 | 不输出文件1特有的行 |
    | -2 | 不输出文件2特有的行 |
    | -3 | 不输出两个文件共有的行 |

    如果没有指定任何参数,comm命令读取这两个文件,然后输出三列:第 1列输出file1中特有的行;第2列输出file2中特有的行;第3列输出两个文件中共有的行。

  • 【例5.18】 比较文件file1和file2文件内容。
    [root@rhel ~]# cat file1
    a
    aa
    [root@rhel ~]# cat file2
    a
    bb
    //查看文件file1和file2的文件内容
    [root@rhel ~]# comm file1 file2

                                 a
    

    aa

                 bb
    

    【例5.19】 比较文件file1和file2,只显示文件file1和file2中相同行的数据内容。 [root@rhel ~]# comm -12 file1 file2
    a
    //file1和file2文件中相同行的数据内容是a

diff:逐行比较两个文本文件,列出其不同之处

  • 逐行比较两个文本文件,列出其不同之处。 它比comm命令能完成更复杂的检查,它对 给出的文件进行系统的检查,并显示出两 个文件中所有不同的行,不要求事先对文 件进行排序。
  • 命令语法:diff [选项] [文件1] [文件2]
  • 【例5.20】 比较file1和file2文件,列出其不同之处。
    [root@rhel ~]# cat file1
    a
    aa
    [root@rhel ~]# cat file2
    a
    bb
    //查看文件file1和file2的文件内容
    [root@rhel ~]# diff file1 file2
    2c2
    \< aa
    -—
    > bb
    //可以看到file1和file2文件的不同处是第二行的aa和bb

update: 2020-7-21

3.文件和命令查找

  • 本节主要讲述Linux系统中文件和命令查找 的相关命令,这些命令有grep、find,locate。

grep:查找文件中符合条件的字符串

  • 查找文件内符合条件的字符串。
  • 命令语法:grep [选项] [查找模式] [文件名]
  • 【例5.21】在文件kkk中搜索匹配字符“test file”。
    [root@rhel ~]# grep 'test file' kkk
    【例5.22】显示所有以d开头的文件中包含“test”的行数据内容。
    [root@rhel ~]# grep 'test' d*
    【例5.23】在/root/aa文件中找出以b开头的行内容。
    [root@rhel ~]#grep ^b /root/aa
    【例5.24】在/root/aa文件中找出不是以b开头的行内容。
    [root@rhel ~]# grep -v ^b /root/aa
    【例5.25】在/root/kkk文件中找出以le结尾的行内容。
    [root@rhel ~]# grep le$ /root/kkk
    【例5.26】查找sshd进程信息。
    [root@rhel ~]# ps –ef|grep sshd

find:列出文件系统内符合条件的文件

  • 将文件系统内符合条件的文件列出来,可以指定文件的名称、类别、时间、大小以 及权限等不同信息的组合,只有完全相符 的文件才会被列出来。
  • 命令语法:find [路径] [选项]
  • 【例5.27】查找/boot目录下的启动菜单配置文件grub.cfg。
    [root@rhel ~]# find /boot -name grub.cfg
    【例5.28】查找/目录下所有以“.conf”为扩展名的文件。
    [root@rhel ~]# find / -name '*.conf'
    【例5.29】列出当前目录及其子目录下所有最近20天内更改 过的文件。
    [root@rhel ~]# find . -ctime -20

locate:在数据库中查找文件

  • 使用locate命令可以通过数据库 (/var/lib/mlocate/mlocate.db文件)来查找文件,这个数据库每天由cron程序来建立。当创建好这个数据库后,就可以方便地搜寻所需文件了,它比find命令的搜索速度还要快。
  • 命令语法:locate [选项][范本样式]
  • 【例5.34】查找httpd.conf文件。
    [root@rhel ~]# locate httpd.conf
    【例5.35】显示找到几个httpd.conf文件。
    [root@rhel ~]# locate -c httpd.conf

4.系统信息显示

  • 本节主要讲述Linux系统中信息显示的相关 命令,这些命令有uname、hostname、free、du。

uname:显示计算机及操作系统相关信息

  • 显示计算机以及操作系统的相关信息,比 如计算机硬件架构、内核发行号、操作系 统名称、计算机主机名等。
  • 命令语法:uname [选项]
  • 【例5.36】显示操作系统的内核发行号。
    [root@rhel ~]# uname -r
    3.10.0-327.el7.x86_64
    【例5.37】显示计算机硬件架构名称。
    [root@rhel ~]# uname -m
    X86_64
    【例5.38】显示操作系统的全部信息。
    [root@rhel ~]# uname -a
    Linux rhel 3.10.0-327.el7.x86_64

    1 SMP Thu Oct 29 17:29:29 EDT 2015 x86_64 x86_64

    x86_64 GNU/Linux

hostname:显示或修改计算机主机名

  • 显示或修改计算机的主机名。

  • 命令语法: hostname [选项] [主机名|-F <文件>] 设置主机名
    hostname [选项] 显示格式化主机名

  • 【例5.39】显示当前计算机主机名。
    [root@rhel ~]# hostname rhel //当前计算机主机名为rhel
    【例5.40】修改计算机主机名为LINUX。
    [root@rhel ~]# hostname LINUX
    [root@rhel ~]# hostname
    LINUX
    //当前计算机主机名已经更改为LINUX了

  • hostnamectl set-hostname [主机名] 永久修改

free:查看内存信息

  • 显示系统的物理内存和swap的使用情况。
  • 命令语法:free [选项]
  • 【例5.41】查看系统的物理内存和交换分区使用情况。
    [root@rhel ~]# free
    【例5.42】以MB为单位查看系统的物理内存和交换分区使 用情况。
    [root@rhel ~]# free -m
    【例5.43】显示系统的物理内存加上交换分区总的容量。
    [root@rhel ~]# free -t

du:显示目录或文件的磁盘占用量

  • 显示目录或文件的磁盘占用量。逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块的情况。如果没有给出 文件或目录名称,那么就对当前目录进行 统计。
  • 命令语法:du [选项] [文件|目录]
  • 【例5.44】显示文件/etc/inittab的磁盘占用量。
    [root@rhel ~]# du /etc/inittab
    【例5.45】显示/root目录磁盘占用量。
    [root@rhel ~]# du –s /root
    【例5.46】以MB为单位显示/root目录磁盘占用量。
    [root@rhel ~]# du –sh /root

  • df -sh(显示分区信息)

5.日期和时间

  • 本节主要讲述Linux系统中查看日期和时间 的相关命令,这些命令有cal、date、hwclock。

cal:显示日历信息

  • 显示计算机系统的日历。
  • 命令语法:cal [选项] [[[日] 月] 年]
  • 【例5.47】 显示本月的月历。
    [root@rhel ~]# cal
    【例5.48】 显示公元2001年年历。
    [root@rhel ~]# cal 2001
    【例5.49】 显示公元2007年9月的月历。
    [root@rhel ~]# cal 9 2007
    【例5.50】 以星期一为每周的第一天的方式显示本月的日历。 [root@rhel ~]# cal -m
    【例5.46】 以1月1日起的天数显示今年的年历。
    [root@rhel ~]# cal -jy

date:显示和设置系统日期和时间

  • 显示和设置计算机系统的日期和时间。只有超级用户才有权限使用date命令设置日期和时间,而一般用户只能使用date命令显示日期和时间。
  • 命令语法: date [选项] [显示时间格式](以+开头,后面接格式)
  • 【例5.52】 显示当前计算机上的日期和时间。
    [root@rhel ~]# date
    【例5.53】 设置计算机日期和时间为2028年2月2日19点14分。
    [root@rhel ~]# date 0202191428
    【例5.54】 按照指定的格式显示计算机日期和时间。
    [root@rhel ~]# date +'%r%a%d%h%y'
    【例5.55】 设置计算机时间为上午9点16分。
    [root@rhel ~]# date -s 09:16:00
    【例5.56】 设置计算机时间为2024年4月14日。
    [root@rhel ~]# date -s 240414

hwclock:查看和设置硬件时钟

  • 查看和设置硬件时钟(RTC),可以显示现在时钟,调整硬件时钟,将系统时间设 置成与硬件时钟一致,或是把系统时间回 存到硬件时钟。
  • 命令语法:hwclock [选项]
  • 【例5.57】 查看硬件时间。
    [root@rhel ~]# hwclock
    【例5.51】 以系统时间更新硬件时间。
    [root@rhel ~]# hwclock -w
    【例5.52】以硬件时间更新系统时间。
    [root@rhel ~]# hwclock -s

6.信息交流

  • 本节主要讲述Linux系统中信息交流的相关 命令,这些命令有echo、mesg、wall、write。

echo:在显示器上显示文字

  • 在计算机显示器上显示一段文字,一般起到一个 提示的作用。字符串可以加引号,也可以不加引 号。用echo命令输出加引号的字符串时,将字符串按原样输出;用echo命令输出不加引号的字符 串时,将字符串中的各个单词作为字符串输出, 各字符串之间用一个空格分隔。
  • 命令语法:echo [选项] [字符串]
  • 【例5.60】 将一段信息写到标准输出。
    [root@rhel ~]# echo Hello Linux Hello Linux
    【例5.61】 将文本“Hello Linux”添加到新文件notes中。
    [root@rhel ~]# echo Hello Linux > notes
    [root@rhel ~]# cat notes Hello Linux
    //查看文件notes,可以看到文件中的内容为hello Linux
    【例5.62】 显示$HOME变量的值。
    [root@rhel ~]# echo $HOME
    /root

mesg:允许或拒绝写消息

  • 控制系统中的其它用户是否能够用 write 命 令或 talk 命令向您发送消息。不带选项的 情况下,mesg 命令显示当前主机消息许可 设置。
  • 命令语法:mesg [选项]
  • 【例5.63】显示当前的消息许可设置。
    [root@rhel ~]# mesg
    is y
    //允许本地网络上的所有主机发送消息到自己的主机
    【例5.64】只允许root用户发送消息到自己的主机。
    [root@rhel ~]# mesg n
    [root@rhel ~]# mesg
    is n

wall:对全部已登录用户发送信息

  • 对全部已登录的用户发送信息。
  • 命令语法: wall [消息]
  • 【例5.66】 向所有用户发出“下班以后请关闭计算机。” 的信息。
    [root@rhel ~]# wall '下班以后请关闭计算机'
    [root@rhel ~]#
    Broadcast message from root@rhel (pts/1)
    (Sun Jun 3 05:38:14 2012):
    下班以后请关闭计算机

write:向用户发送消息

  • 向用户发送消息。
  • 命令语法:write [用户] [终端名称]
  • 【例5.67】在tty2终端上向tty3终端上的root用户发送信息。
    [root@rhel ~]# write root tty3
    hello
    //在tty2终端上输入要发送的信息,输入完毕,希望退出发送状态时,按组合键[Ctrl+c]即可
    [root@rhel ~]# Message from root@rhel on tty2 at 05:39 ...
    hello
    EOF`
    //在终端tty3上,用户root会接收到以上信息,要结束时,按[Ctrl+c]组合键即可

7.其他命令


update:2020-07-22

六、Shell编程

熟悉Shell程序的创建

  • 作为命令语言互动式地解释和执行用户输入的命令是Shell的功能之一,She11还可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的过程控制结构。使用She11编程类似于使用DOS中的批处理文件,称为Shell脚本,又叫做She11程序或She11命令文件。

语法基本介绍

  • She11程序基本语法较为简单,主要由开头部分、注释部分以及语句执行部分组成。

1.开头

She11程序必须以下面的行开始(必须放在文件的第一行)。

!/bin/bash。

符号“#~”用来告诉系统它后面的参数是用来执行该文件的程序,在这个例子中使用/bin/bash来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。

要使脚本可执行,需赋予该文件可执行的权限,使用如下命令文件才能运行。
chmod u+x[文件名]

2.注释

在进行Shell编程时,以“#”开头的句子 表示注释,直到这一行的结束,建议在程 序中使用注释。如果使用注释,那么即使相当长的时间内没有使用该脚本,也能在很短的时间内明白该脚本的作用及工作原理。

3.执行命令

在She11程序中可以输入多行命令以得到命令的结果信息,这样就提高系统管理的工作效率。

1.创建文件

在/root目录下使用vi编辑器创建文件date,该文件内容如下所示,共有3个命令。

!/bin/bash

filename:date

echo “Mr.$USER,Today is:”
echo `date`
echo Whish you a lucky day!

2.设置执行权限

创建完date文件之后它还不能执行,需要给它设置可执行权限,使用如下命令给文件设置权限。
[root@rhel~]#chmod u+x /root/date
[root@rhel ~]#Is-1/root/date
-rwxr—r—.1 root root 886月305:37/root/date
/可以看到当前date文件具有可执行权限

3.执行Shell程序

输入整个文件的完整路径执行Shell程序,使用如下命令执行。
[root@rhel ~]#/root/date
Mr.root,Today is:
2012年06月03日星期日05:37:34 CST
Whish you a lucky day!
/可以看到Shell程序的输出信息

4.使用bash命令执行程序

在执行Shell程序时需要将date文件设置为可执行权限。如果不设置文件的可执行权限,那么需要使用bash命令告诉系统它是一个可执行的脚本,使用如下命令执行Shell程序。
[root@rhel~]#bash /root/date
Mr.root,Today is:
2012年06月03日星期日05:37:34 CST
Whish you a lucky day!

Shell变量

像高级程序设计语言一样,Shell也提供说明和使用变量的功能。对Shell来讲,所有变量的取值都是一个字符,Shell程序采用“$var”的形式来引用名为var的变量的值。

Shell定义的环境变量

Shell在开始执行时就已经定义了一些与系 统的工作环境有关的变量,用户还可以重新定义这些变量。

常用的Shell环境变量

Shell环境变量 描述
HOME 用于保存用户主目录的完全路径名
PATH 用于保存用冒号分隔的目录路径名,Shell将按PATH变量中给出的顺序 搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行
UID 当前用户的UID,由数字构成
PWD 当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化
PS1 主提示符,在root用户下,默认的主提示符是“#”,在普通用户下,默 认的主提示符是“$”
PS2 在Shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\” 然后按回车键,或者当用户按回车键时Shell判断出用户输入的命令没 有结束时,就显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“>”
TERM 终端的类型

用户定义的变量

  • 用户可以按照下面的语法规则定义自己的变量。 变量名=变量值
  • 在定义变量时,变量名前不应该加符号“$”,在 引用变量的内容时则应在变量名前加符号“$”。
  • 在给变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用 双引号括起来。在编写Shell程序时,为了使变量 名和命令名相区别,建议所有的变量名都用大写
    字母来表示。
  • 【例6.2】用户定义变量的使用。
    [root@rhel ~]# \$AS=120
    bash: =120: 未找到命令…
    //在定义变量名时,变量名前加符号“$”就报错
    [root@rhel ~]# AS=120
    [root@rhel ~]# echo ​\$AS
    120
    //在引用变量名时,在变量名前加 符号“$”
    [root@rhel ~]# AA="hello word"
    //变量值中包含了空格,需将整个字符串用双引号括起来
    [root@rhel ~]# echo $AA
    hello word
  • 有时需要在说明一个变量并对它设置为一 个特定值后就不再改变它的值时,可以用 下面的命令来保证一个变量的只读性。
    readonly 变量名
  • 在任何时候创建的变量都只是当前Shell的局部变量,所以不能被Shell运行的其他命令或Shell 程序所利用,而export命令可以将一个局部变量 提供给Shell命令使用,其格式是: export 变量名
  • 也可以在给变量赋值的同时使用export命令: export 变量名=变量值
  • 使用export说明的变量在Shell以后运行的所有
    命令或程序中都可以访问到。

位置参数

位置参数是一种在调用Shell程序的命令行 中按照各自的位置决定的变量,是在程序 名之后输入的参数。位置参数之间用空格 分隔,Shell取第一个位置参数替换程序文 件中的$1,第二个替换​$2,依次类推。$0 是一个特殊的变量,它的内容是当前这个 Shell程序的文件名,所以$0不是一个位置 参数,在显示当前所有的位置参数时是不包括$0的。

预定义变量

预定义变量和环境变量相类似,也是在 Shell一开始时就定义了的变量。所不同的 是,用户只能根据Shell的定义来使用这些 变量,所有预定义变量都是由符号“$”和另一个符号组成的。

常用的Shell预定义变量

预定义变量 描述
$# 位置参数的数量
$* 所有位置参数的内容
$? 命令执行后返回的状态,0表示没有错误,非0表示有错误
$$ 当前进程的进程号
$! 后台运行的最后一个进程号
$0 当前执行的进程名

参数置换的变量

Shell提供了参数置换功能以便用户可以根 据不同的条件来给变量赋不同的值。参数 置换的变量有四种,这些变量通常与某一 个位置参数相联系,根据指定的位置参数是否已经设置决定变量的取值。

1.变量=${参数-word}
如果设置了参数,则用参数的值置换变量的值,否则用word置换, 即这种变量的值等于某一个参数的值。如果该参数没有设置,则变量就等于word值。
2.变量=${参数=word}
如果设置了参数,则用参数的值置换变量的值,否则把变量设置成 word,然后再用word替换参数的值。位置参数不能用于这种方式, 因为在shell程序中不能为位置参数赋值。
3.变量${参数?word}
如果设置了参数,则用参数的值置换变量的值,否则就显示word并 从shell中退出,如果省略了word,则显示标准信息。这种变量要求 一定等于某一个参数的值。如果该参数没有设置,就显示一个信息, 然后退出,这种方式常用于出错指示。
4.变量=${参数+word}
如果设置了参数,则用word置换变量,否则不进行置换。

变量表达式

Shell条件判断语句

Shell循环控制语句


update:2020-07-22

七、用户和组群账户管理

在Linux系统中,用户账户是登录系统的唯 一凭证,其中root用户是系统的最高管理 者,该用户的UID是0级,与用户和组账户 相关的配置文件有/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow。

用户账户简介

本节主要讲述Linux系统中的用户账户分类 以及与用户账户有关的配置文件/etc/passwd和/etc/shadow。

用户账户分类

用户账户在Linux系统中是分角色的,由于角色不同,每个用户的权限和所能完成的 任务也不同。而在实际的管理中,用户的 角色是通过UID(用户ID号)来标识的,每 个用户的UID都是不同的。
在Linux系统中有三大类用户,分别是root用户、系统用户和普通用户。

1.root用户

在Linux系统中,root用户UID为0。root用 户的权限是最高的,普通用户无法执行的 操作,root用户都能完成,所以也被称之 为超级用户。在系统中的每个文件、目录 和进程都归属于某一个用户,没有用户许 可,其它普通用户无法进行操作的,但对root用户除外。

2.系统用户

系统用户也称为虚拟用户、伪用户或假用 户,这类用户不具有登录Linux系统的能力, 但却是系统运行不可缺少的用户,比如bin、 daemon、adm、ftp、mail等,这类用户都是系统自身拥有的。系统用户的UID为1~999。

3.普通用户

这类用户能登录系统,在Linux系统上进行 普通操作,能操作自己目录的内容,其使 用系统的权限受限,这类用户都是系统管理员创建的。普通用户的UID为1000~60000。

/etc/passwd文件

/etc/passwd文件是系统识别用户的一个重要文件, Linux系统中所有的用户都记录在该文件中。假设 用户以账户zhangsan登录系统时,系统首先会检 查/etc/passwd文件,看是否有zhangsan这个账户, 然后确定用户zhangsan的UID,通过UID来确认用 户的身份,如果存在则读取/etc/shadow文件中所 对应的密码。如果密码核实无误则登录系统,读取用户的配置文件。

任何用户都可以读取/etc/passwd文件内容,在 /etc/passwd文件中,每一行表示的是一个用户账 户的信息,一行有7个段位,每个段位用“:”分隔。
zhangsan:x:1000:1000:张三:/home/zhangsan:/bin/bash

/etc/passwd文件字段含义

字段 字段含义
用户名 也称为登录名,在系统内用户名应该具有惟一性。在本例中, zhangsan就是用户名
密码 存放加密用户的密码,看到的是一个x,其实密码已被映射到 /etc/shadow文件中
用户标识号 (UID) 在系统内用一个整数标识用户ID号,每个用户的UID都是惟一 的,root用户的UID是0,普通用户的UID默认从1000开始,本例中的用户zhangsan的UID是1000
组群标识号 (GID) 在系统内用一个整数标识用户所属的主要组群ID号,每个组群 的GID都是惟一的
用户名全称 用户名描述,可以不设置。在本例中,zhangsan用户的用户名 全称是张三
主目录 用户登录系统后首先进入的目录,zhangsan用户的主目录是 /home/zhangsan
登录Shell 用户使用的Shell类型,Linux系统默认使用的Shell是/bin/bash

用户UID

UID是用户的ID值,在系统中每一位用户的UID值 都是惟一的,更确切地说每一位用户都要对应一 个惟一的UID。Linux系统用户的UID值是一个正整数,初始值从0开始,在Linux系统中默认的最大值是60000。

在Linux系统中,root的UID是0,拥有系统最高 权限。UID的唯一性关系到系统的安全,比如在 /etc/passwd文件中把用户zhangsan的UID改为0 后,zhangsan这个用户会被确认为root用户,当 用这个账户登录到系统后,可以进行所有root用户才能执行的操作。

UID是确认用户权限的标识,用户登录系统所处 的角色是通过UID来实现的,而不是用户名。一 般情况下,Linux的发行版本都会预留一定的UID 给系统虚拟用户使用,比如ftp、nobody、adm、 bin以及shutdown等用户账户。在Linux系统中会 把1~999的UID预留出来给虚拟用户使用,管理员所创建的新用户UID默认是从1000开始的。

/etc/shadow文件

/etc/shadow文件是/etc/passwd的影子文件,这 个文件并不是由/etc/passwd文件产生,这两个文件应该是对应互补的。/etc/shadow文件内容包括用户及被加密的密码以及其它/etc/passwd不能包括的信息,比如用户账户的有效期限等。

/etc/shadow文件只有root用可以读取和操作,文 件的权限不能随便更改为其它用户可读,这样做 是非常危险的。如果发现这个文件的权限变成了 其它组群或用户可读了,要进行检查,以防系统安全问题的发生。

/etc/shadow文件的内容包括9个段位,每个段位 之间用“:”分隔。
zhangsan:$6$E/xvWMmh$rhYLQwwffEqIudVLFzMlvkb0iN4.0Oluk6H.UovEYN0/99dVoHXcaCNGZZkFY1S3QHYgm7e6JPzEew6ybmN4e0:16364:0:99999:7:::

/etc/shadow文件字段含义

字段 字段含义
用户名 这里的用户名和/etc/passwd中的用户名是相同的
加密密码 密码已经加密,如果有些用户在这里显示的是“!!”,则表示这个用户还没有设置密码,不能登录到系统
用户最后一次更改密码的日期 从1970年1月1日算起到最后一次修改密码的时间间隔天数
密码允许更换前的天数 如果设置为0,则禁用此功能。该字段是指用户可以更改密码的天数
密码需要更换的天数 如果设置为0,则禁用此功能。该字段是指用户必须更改密码的天数
密码更换前警告的天数 用户登录系统后,系统登录程序提醒用户密码将要过期
账户被取消激活前的天数 表示用户密码过期多少天后,系统会禁用此用户,也就是说系统会不让此用户登录,也不会提示用户过期,是完全禁用的
用户账户过期日期 指定用户账户禁用的天数(从1970年的1月1日开始到账户被禁用的天数),如果这个字段的值为空,账户永久可用
保留字段 目前为空,以备将来Linux系统发展时使用

/etc/login.defs 产生用户初始配置信息

/etc/skel 新创建用户主目录包含的文件

用户账户设置

在Linux系统字符界面中创建、修改以及删 除用户账户主要使用useradd,usermod和userdel这3个命令。

创建用户账户

创建用户账户就是在系统中创建一个新账 户,为新账户分配用户UID、组群、主目录 和登录Shell等资源,新创建的用户账户默 认是被锁定的,无法使用,需要使用 passwd命令设置密码以后才能使用。创建用户账户就是在/etc/passwd文件中为新用户增加一条记录,同时更新/etc/shadow和/etc/group文件。

使用useradd命令都可以在Linux系统中创 建用户账户。

命令语法:useradd [选项] [用户名]

【例7.1】 创建用户账户zhangsan并设置密码。
[root@rhel ~]# useradd zhangsan
[root@rhel ~]# cat /etc/passwd|grep zhangsan
zhangsan:x:1000:1000::/home/zhangsan:/bin/bash
//查看/etc/passwd文件,显示已经创建了用户zhangsan
[root@rhel ~]# passwd zhangsan
更改用户 zhangsan 的密码。
新的密码://在此设置用户zhangsan的密码
重新输入新的密码: //重复设置用户zhangsan的密码
passwd:所有的身份验证令牌已经成功更新。

【例7.2】 对用户账户设置密码和不设置密码的比较。
[root@rhel ~]# useradd lisi
[root@rhel ~]# useradd wangwu
//创建用户lisi和wangwu
[root@rhel ~]# passwd wangwu
更改用户wangwu 的密码
新的密码://在此设置用户wangwu的密码
重新输入新的密码: //重复设置用户wangwu的密码
[root@rhel ~]# cat /etc/passwd|grep lisi
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@rhel ~]# cat /etc/shadow|grep lisi
lisi:!!:15493:0:99999:7:::
//查看/etc/shadow文件,显示在用户lisi的密码字段上显示的是“!!”,表示该用户还没有设置密码,不能登录到Linux系统上
[root@rhel ~]# cat /etc/passwd|grep wangwu
wangwu:x:1002:1002::/home/wangwu:/bin/bash
[root@rhel ~]# cat /etc/shadow|grep wangwu
wangwu:\$6\$KiAI6cI.$p/kEL0heCQBGdEH6/XoSh30Utke6Tx8IJAtVKiBnM1oDIQlwp.Jci W1limKz1NmVKP7.0BZ9pF1LcfEzxprpk1:15493:0:99999:7:::
//查看/etc/shadow文件,可以看到在用户wangwu的密码字段上显示的是加密的密码,表示该用户已经设置密码,能登录到Linux系统上

【例7.3】 创建用户moon,并设置该用户UID为1510。
[root@rhel ~]# useradd -u 1010 moon
[root@rhel ~]# cat /etc/passwd|grep moon
moon:x:1010:1010::/home/moon:/bin/bash
//查看/etc/passwd文件,可以看到用户moon的UID是1010

修改用户账户

使用usermod命令可以更改用户的Shell类 型、所属的组群、用户密码的有效期,还 能更改用户的登录名。

命令语法:usermod [选项][用户名]

【例7.7】 修改用户zhangsan的主目录为/home/kkk,并手动创建/home/kkk目录。
[root@rhel ~]# usermod -d /home/kkk zhangsan
[root@rhel ~]# cat /etc/passwd|grep zhangsan
zhangsan:x:1000:1000::/home/kkk:/bin/bash
//查看/etc/passwd文件,可以看到用户zhangsan的主目录已经更改为/home/kkk
[root@rhel ~]# mkdir /home/kkk
//必须使用mkdir命令创建/home/kkk目录,这样用户zhangsan才能使用该主目录

【例7.8】 修改用户wangwu的主目录为/home/opop,并自动创建 /home/opop目录。
[root@rhel ~]# ls /home
abc kkk lisi moon pp wangwu www zhangsan
[root@rhel ~]# cat /etc/passwd|grep wangwu
wangwu:x:1002:1002::/home/wangwu:/bin/bash
//查看/home目录和/etc/passwd文件内容,可以看到用户wangwu的当前主目录是/home/wangwu
[root@rhel ~]# usermod -d /home/opop -m wangwu
[root@rhel ~]# ls /home
abc kkk lisi moon opop pp www zhangsan
[root@rhel ~]# cat /etc/passwd|grep wangwu
wangwu:x:1002:1002::/home/opop:/bin/bash
//查看/home目录和/etc/passwd文件内容,可以看到用户wangwu的主目录自动由/home/wangwu改为/home/opop

删除用户账户

使用userdel命令可以在Linux系统中删除用 户账户,甚至连用户的主目录也一起删除。

命令语法:userdel [选项][用户名]

【例7.17】 删除用户lisi。
[root@rhel ~]# userdel lisi
[root@rhel ~]# cat /etc/passwd|grep lisi
//查看/etc/passwd文件,已经查询不到关于用户lisi的数据,说明该账户已 经删除
[root@rhel ~]# ls /home
abc kkk lisi moon opop pp www zhangsan
//使用userdel命令删除用户账户并不会删除该用户主目录
【例7.18】 删除用户moon,并且在删除该用户的同时一起删除主目录。
[root@rhel ~]# ls /home
abc kkk lisi moon opop pp www zhangsan
//用户moon的主目录为/home/moon
[root@rhel ~]# userdel -r moon
[root@rhel ~]# ls /home
abc kkk lisi opop pp www zhangsan
//查看/home目录的内容,可以看到用户moon的主目录随该用户一起删除了

组群账户简介

本节主要讲述Linux系统下的组群账户分类 以及与组群账户有关的配置文件
/etc/group和/etc/gshadow。

组群账户分类

具有某种共同特征的用户集合就是组群。通过组 群可以集中设置访问权限和分配管理任务。
在Linux系统中,有两种组群分类方法。 一种方法将组群分为私有组群和标准组群。

1.私有组群:当创建一个新的用户账户时,如果 没有指定该用户属于哪一个组群,那么Linux就会 创建一个和该用户同名的组群,这个组群就是私有组群,在这个私有组群中只包含这个用户。

2 .标准组群:标准组群也称为普通组群,标准组群可以包含多个用户账户,如果使用标准组群, 那么在创建一个新的用户账户时,应该指定该用户属于哪一个组群。

另外一种方法将组群分为主要组群和次要组群。

1.主要组群:当一个用户账户属于多个组成员时, 登陆后所属的组群便是主要群组,其它组群是次要群组,一个用户账户只能属于一个主要组群。

2.次要组群:次要群组也称附加群组,一个用户账户可以属于多个次要群组。

/etc/group文件

/etc/group文件是组群的配置文件,内容包括用户和组群, 并且能显示出用户是归属哪个组群或哪几个组群。一个用户可以归属一个或多个不同的组群,同一组群的用户之间具有相似的特征。比如把某一用户加入到root组群,那么这个用户就可以浏览root用户主目录的文件,如果root用户把某个文件的读写执行权限开放,root组群的所有用户都可以修改此文件;如果是可执行的文件,root组群的用户也是可以执行的。

组群的特性在系统管理中为系统管理员提供了极大的方便, 但安全性也是值得关注的,如某个用户有对系统管理有最 重要的内容,最好让用户拥有独立的组群,或者把用户的 文件的权限设置为完全私有。

/etc/group文件的内容包括组群名、组群密码、GID及该 组群所包含的用户,每个组群一条记录,一行有4个段位, 每个段位用“:”分隔。
zhangsan:x:1000:

/etc/group文件字段含义

字段 字段含义
组群名 组群名称,如组群名root
组群密码 存放加密的组群密码,看到一个x,密码已被映射 到/etc/gshadow文件中
组群标识号(GID) 在系统内用一个整数标识组群GID,每个组群的 GID都是惟一的,默认普通组群的GID从1000开始,root组群GID是0
组群成员 属于这个组群的成员,如root组群的成员有root用户

组群GID

组群GID和UID类似,是一个从0开始的正整数,GID为0的组群是root组群。Linux系统会预留GID号1~999给系统虚拟组群使用, 创建的新组群GID是从1000开始的,查看系统创建组群默认的GID范围应该查看 /etc/login.defs中的GID_MIN和GID_MAX值,可以使用以下命令查看。

/etc/gshadow文件

/etc/gshadow是/etc/group的加密文件,组群密码就是存放在这个文件中。/etc/gshadow和 /etc/group是互补的两个文件;对于大型服务器,针对很多用户和组群,定制一些关系结构比较复杂的权限模型,设置组群密码是很有必要的。比如不想让一些非组群成员永久拥有组群的权限和特性,可以通过密码验证的方式来让某些用户临时拥有一些组群特性,这时就要用到组群密码。

/etc/gshadow文件中每个组群都有一条记录。一 行有4个段位,每个段位用“:”分隔。
beijing:$6$E/xvWMmh$rhYLQwwffEqIudVLFzMlv1::ou

/etc/gshadow文件字段含义

字段 字段含义
组群名 组群的名称
组群密码 密码已经加密,如果有些组群在这里显示的是 “!”,表示这个组群没有密码。本例中组群shanghai没有密码,组群beijing已设置密码
组群管理者 组群的管理者,有权在该组群中添加、删除用户
组群成员 属于该组群的用户成员列表,如有多个用户用逗 号分隔。本例中beijing组群的成员是ou

组群账户设置

在Linux系统字符界面下创建、修改以及删 除组群账户主要使用groupadd,groupmod和groupdel这3个命令。

创建组群账户

使用groupadd命令可以在Linux系统中创建组群账户。

命令语法:groupadd [选项] [组群名]

【例7.19】 创建名为china的组群。
[root@rhel ~]# groupadd china
[root@rhel ~]# cat /etc/group|grep china
china:x:1006:
//查看文件/etc/group,可以看到已经创建了组群china,组群GID是1006
【例7.20】 创建名为ou的组群,并且设置该组群GID为1800。
[root@rhel ~]# groupadd -g 1800 ou
[root@rhel ~]# cat /etc/group|grep ou
ou:x:1800:
//查看文件/etc/group,可以看到已经创建了组群ou,组群GID是1800
【例7.21】 创建名为chinese的系统组群。
[root@rhel ~]# groupadd -r chinese
[root@rhel ~]# cat /etc/group|grep chinese
chinese:x:982:
//查看/etc/group文件,可以看到系统组群chinese的GID是982,是小于1000的

修改组群账户

使用groupmod命令可以在Linux系统中修 改组群账户,比如组群名称、GID等。 命令语法:
groupmod [选项][组群名]

【例7.22】 将组群ou的GID修改为1900。
[root@rhel ~]# groupmod -g 1900 ou
[root@rhel ~]# cat /etc/group|grep ou
ou:x:1900:
//查看文件/etc/group,可以看到组群ou的GID已经更改为1900
【例7.23】 修改组群ou的新组群名称为shanghai。
[root@rhel ~]# groupmod -n shanghai ou
[root@rhel ~]# cat /etc/group|grep shanghai
shanghai:x:1900:
//查看/etc/group文件,可以通过原来的GID看到组群ou的名称已经更改为shanghai

删除组群账户

使用groupdel命令可以在Linux系统中删除 组群账户。如果该组群中仍旧包括某些用 户,那么必须先删除这些用户后,才能删除组群。

命令语法:groupdel [组群名]

【例7.24】 删除组群shanghai。
[root@rhel ~]# groupdel shanghai
[root@rhel ~]# cat /etc/group|grep shanghai
//查看/etc/group文件,可以看到当前组群shanghai已经不存在

用户和组群账户维护

在日常工作中经常需要对Linux系统用户和组群账户进行维护和管理,主要用到passwd、gpasswd、su、newgrp、groups和id等命令。

passwd命令

设置或修改用户的密码,普通用户和超级权限用户都可以运行passwd,普通用户只能更改自己的用户密码,root用户可以设置或修改任何用户的密码。如果passwd命令后面不接任何选项或用户名,则表示修改当前用户的密码。

命令语法:passwd[选项][用户名]

【例7.25】 设置用户it的密码。
[root@rhel ~]# passwd it
更改用户 it 的密码。
新的密码://在此输入用户it的密码
重新输入新的 密码://在此重复输入用户it的密码
passwd:所有的身份验证令牌已经成功更新。

【例7.26】 锁住用户it的密码。
[root@rhel ~]# passwd -l it
锁定用户 it 的密码。
passwd: 操作成功
//用户it锁住以后不能登录到系统,但是可以用su命令从其他用户切换到用户it
[root@rhel ~]# passwd -S it
it LK 2012-06-02 0 99999 7 -1 (密码已被锁定。)
//查看用户密码状态,可以看到用户it的密码是锁住的
[root@rhel ~]# cat /etc/shadow|grep it
it:!!$6​$/4sUM8yo$pRRuww3238PwFCv2o3T7JWMjAN0FA.zkGzhUBW shHCK0DX2k1udSXa9w8Y.HQ1hjcvG8laKrmFHGjYZfNZmYm1:15493: 0:99999:7:::
//查看/etc/shadow文件,可以看到用户it密码锁住以后在密码字段前有“!!”

【例7.27】 解锁用户it密码。
[root@rhel ~]# passwd -u it
解锁用户 it 的密码。
passwd: 操作成功
//已经成功解锁用户it,重新设置用户密码也可以解锁用户
[root@rhel ~]# passwd -S it
it PS 2012-06-02 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
//查看用户密码状态,可以看到用户it的密码已经解锁
[root@rhel ~]# cat /etc/shadow|grep it
it:$6​$/4sUM8yo$pRRuww3238PwFCv2o3T7JWMjAN0FA.zkGzhUBW shHCK0DX2k1udSXa9w8Y.HQ1hjcvG8laKrmFHGjYZfNZmYm1:15493 :0:99999:7:::
//查看/etc/shadow文件,可以看到用户it密码解锁以后密码字段前的“!!”没有了

【例7.28】 删除用户it的密码。
[root@rhel ~]# cat /etc/shadow|grep it
rtkit:!!:15493:::::: it:$6​$/4sUM8yo$pRRuww3238PwFCv2o3T7JWMjAN0FA.zkGzhUBW shHCK0DX2k1udSXa9w8Y.HQ1hjcvG8laKrmFHGjYZfNZmYm1:15493 :0:99999:7:::
//查看/etc/shadow文件,可以看到用户it设置过密码
[root@rhel ~]# passwd -d it
清除用户的密码 it。
passwd: 操作成功
[root@rhel ~]# cat /etc/shadow|grep it
it::15493:0:99999:7:::
//查看/etc/shadow文件,可以看到用户it的密码已经没有了

gpasswd命令

设置一个组群的组群密码,或者是在组群 中添加、删除用户。

命令语法:gpasswd [选项] [组群名]

【例7.29】 把用户it添加到kk组群中。
[root@rhel ~]# gpasswd -a it kk
Adding user it to group kk
[root@rhel ~]# cat /etc/group|grep kk
kk:x:1002:it
//在/etc/group文件中可以看到kk组群中有用户it
【例7.30】 从kk组群中删除用户it。
[root@rhel ~]# gpasswd -d it kk
Removing user it from group kk
[root@rhel ~]# cat /etc/group|grep kk
kk:x:1002:
//在/etc/group文件中可以看到kk组群中已经没有用户it了

【例7.a】 设置kk组群的密码。
[root@rhel ~]# gpasswd kk
Changing the password for group kk
New Password://在此输入组群kk的密码
Re-enter new password://在此重复输入组群kk的密码
[root@rhel ~]# cat /etc/gshadow|grep kk
kk:$6​$LyMEB/59ARw/CdN$Gw8ln2/Vi3vUhzdCvbNInSioUDNcUOWpDu kbMIeuGq8hjWWnVJWaa6BlFzYa6wdvuBkaVK7Cwkbmq0Vd8./0t1:: //在/etc/gshadow文件中可以看到组群kk已经设置密码
【例7.b】 取消kk组群密码。
[root@rhel ~]# gpasswd -r kk
[root@rhel ~]# cat /etc/gshadow|grep kk
kk:::
//在/etc/gshadow文件中可以看到组群kk已经不存在了

su命令

使用su命令可以切换到其它用户账户进行 登录。如果su命令不加任何选项,默认为 切换到root用户,并且不改变Shell环境。

命令语法:su [选项] [用户]

【例7.31】把用户root切换为用户it进行登录,并且连Shell环境也切换。
[root@rhel ~]# su - it
//从用户root切换到普通用户不需要输入用户it的密码
[it@rhel~] \$pwd
/home/it
//shel环境已经切换,所以当前工作目录路径为/home/it
【例7.32】把用户root切换为用户it进行登录,shell环境不需要切。
[root@rhel~]#su it
[it@rhel root] ​\$ pwd
/root
//shell环境没有切换,所以当前工作目录路径为/root
【例7.33】用户it使用su方式以root用户执行“ls /root”命令。
[it@rhel~]​\$ su - root -c “ls /root”
密码:
//在此输入用户root密码

newgrp命令

让用户账户以另一个组群的身份进行登录。 newgrp命令是以相同的账户名,不同的组群身份登录系统。如果要使用newgrp命令切换组群,用户必须是该组群的用户,否则将无法登录指定的 组群。单一用户如果要同时隶属多个组群,需要利用交替用户的设置。如果不指定组群名称,则 newgrp命令会登录该用户名称的预设组群。

命令语法:newgrp [组群名]

【例7.34】将用户ab以组群ou的身份登录系统。
[ab@rhel root]\$ id
uid=1008(ab) gid=1005(ab) 组=1005(ab),1006(ou)
//当前用户ab分别属于组群ab和ou的成员,是以ab组群的身 份登录系统的
[ab@rhel root]​\$ newgrp ou
[ab@rhel root]​\$ id
uid=1008(ab) gid=1006(ou) 组=1006(ab),1005(ou)
//现在用户ab是以ou组群的身份登录系统

groups 命令

使用groups命令可以显示指定用户账户的 组群成员身份。

命令语法:groups [用户名]

【例7.35】查看用户ab是属于哪些组群的成员。
[root@rhel ~]# groups ab ab : ab ou
//可以看到用户ab是属于ab组群和ou组群的用户

id命令

使用id命令可以显示用户的UID以及该用户 所属组群的GID。

命令语法:id [选项] [用户名]

【例7.36】 查询用户ab的UID、GID 以及归属组群的情况。
[root@rhel ~]# id ab
uid=1008(ab) gid=1005(ab) 组=1005(ab),1006(ou)
//用户ab的UID是1008,默认组群是ab,默认用户组群的GID是1005, 归属于ab和ou组群

【例7.37】 显示用户ab所属主组群的GID。
[root@rhel ~]# id -g ab
1005 //可以看到用户ab所属主组群的GID是1005

【例7.38】 显示用户ab所属组群的GID。
[root@rhel ~]# id -G ab
1005 1006
//可以看到用户ab所属组群的GID是1005和1006

【例7.39】显示用户ab的UID。
[root@rhel ~]# id -u ab
1008
//可以看到用户ab的UID是1008

-------------本文结束感谢您的阅读-------------