0%

Linux基础知识

一. 目录树结构(directory tree)

Linux 世界里,一切皆文件。

所谓的目录树架构(directory tree)就是以根目录为主,然后向下呈现分支状的目录结构的一种档案架构。

  1. Linux 的目录中有且只有一个根目录。

  2. Linux 的各个目录存放的内容是规划好,不用乱放文件。

  3. Linux 是以文件的形式管理我们的设备,因此 linux 系统,一切皆为文件。

  • /bin: 是 Binary 的缩写,这个目录存放着最经常使用的命令
  • /sbin:s 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序。
  • /home:存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
  • /root:该目录为系统管理员,也称作超级权限者的用户主目录。
  • /lib:系统开机所需要最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
  • /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
  • /etc:所有的系统管理所需要的配置文件
  • /usr/local:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似与 windows 下的 program files 目录。(usr是Unix System Resource/Unix Software Resource的缩写)
  • /boot:存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
  • /proc:这个目录是一个虚拟的目录,它是系统内存的映射,访问这个目录来获取系统信息。
  • /srv:service 的缩写,该目录存放一些服务启动之后需要提供的数据。
  • /sys:这是 linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs。
  • /tmp:这个目录是用来存放一些临时文件的。
  • /dev:类似 windows 的设备管理器,把所有的硬件用文件的形式存储。
  • /media:linux 系统会自动识别一些设备,例如 U 盘光驱等等,当识别后,linux 会把识别的设备挂载到这个目录下(系统默认挂载目录)。
  • /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂载在 /mnt/ 上,然后进入该目录就可以查看里面的内容了(手动挂载目录)。
  • /opt:这是给主机额外安装软件所摆放的目录,如安装 ORACLE 数据库就可放到该目录下。默认为空。
  • /usr/local:这是另一个给主机额外安装软件所安装的目录,一般是通过编译源码的方式安装的程序。
  • /var:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件。
  • /selinux:SELinux 是一种安全子系统,它能控制程序只能访问特定文件。

二. 常用操作

常见执行 Linux 命令的格式为:命令名称 [命令参数] [命令对象]

可以把多个命令放在同一行上,命令之间用 “;” 分开。

linux严格区分大小写。

1. 快捷键

  • TAB键可以用于命令补全和文件补全

  • Ctrl + c 可以中断当前程序

  • Ctrl + d 退出 shell,logout

  • Ctrl + l 清除屏幕内容,效果等同于 clear

  • Ctrl + Backspace(退格键)可以清除有时候由于使用退格键,屏幕出现^H的情况

  • Ctrl + a 光标移到最前面

  • Ctrl + e 光标移到最后面

2. 关机重启

(1)关机&重启命令

  • shutdown -h now:表示立即关机

  • shutdown -h 1:表示1分钟后关机(如果直接输入 shutdown,默认就是执行这条指令)

  • shutdown -r now:立即重启

  • halt:直接使用,关机

  • reboot 重启系统

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

当我们关机或者重启时,都应该先执行一下 sync,防止数据丢失。

(2)用户登录注销

  • 登录时少用 root 账号登录,以避免操作失误的损失

  • 平时可登录普通账户,再用“su - 用户名”切换成管理员登录

  • logout:注销用户

在图形运行级别无效,在运行级别3有效。

3. 帮助指令

(1)man 指令(man 是 manual 手册的缩写)

man [命令或配置文件]

举例:man ls

(2)help 指令

[命令或配置文件] –help

举例:ls –help

三. vi 和 vim 编辑器

1. 基本介绍

  • 所有 Linux 系统都会内置 vi 文本编辑器
  • vim 是 vi 的升级版,可以主动以字体颜色分辨语法的正确性,代码补完和编译,错误跳转等功能。
  • 使用命令 vim [file1 file2 file3 …] 即可打开单个或多个文件

2. 三种模式

(1)一般/正常模式

  • 在正常模式下,我们可以使用快捷键对文本进行复制、粘贴、删除和查找等工作。

  • 用 vim 打开一个文件就直接进入一般模式

  • 常见指令

    指令 说明
    yy 拷贝当前行
    5yy 拷贝当前5行
    dd 删除当前行
    5dd 删除当前行向下的5行
    u 撤销上一步的操作(Undo)
    Ctrl+r 重做(Redo),即撤销的撤销。
    p 将之前删除(dd)或复制(yy)过的数据粘贴到光标下一行
    gg 移动到文件头。 = [[
    G(shift + g) 移动到文件尾。 = ]]
    行号 + G 移动到第 n 行
    0 移动到本行第一个字符上

(2)插入/编辑模式

  • 在编辑模式下,可以编辑文件内容。
  • 在一般模式下,按下 i,I,o,O,a,A,r,R 等字母就可进入编辑模式(i 在当前位置前插入,a 在当前位置后插入,o 在当前行之后插入一行)

(3)命令行模式

  • 在这个模式中,可以利用指令完成读取,存盘,替换,离开,显示行号的等动作。

  • 在一般模式下,按下:或者/可以进入命令模式

  • 常见命令:

    指令 说明
    :w 保存
    :q 退出
    :q! 强制退出(不保存)
    :wq 写入磁盘后离开
    :wq! 强制保存退出(等价于在一般模式下输入ZZ)
    :set nu 显示行号
    :set nonu 不显示行号
    :数字 跳转到该行,比如跳到 240 行就是 :240 回车
    / 字符串 在文本中从上至下搜索该字符串(按n查找下一个,N查找上一个)
    ?字符串 在文本中从下至上搜索该字符串(按n查找下一个,N查找上一个)
    :noh 取消文字高亮
    :%s/one/two/g 将全文中的所有 one 替换成 two(:%s/原文本/替换文本/g),最后的g是“全局”的意思,意味着对文本行中所有匹配的字符串,执行查找和替换操作。如果省略 g,则只替换每个文本行中第一个匹配的字符串。。

(4)三种模式转换示意图

四. 账号管理

1. 用户管理

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

  • 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。

  • 每个用户账号都拥有一个唯一的用户名和各自的口令。

  • 要完成的工作主要有如下几个方面:

    • 用户账号的添加、删除与修改。
    • 用户口令的管理。
    • 用户组的管理。
  • 当提示符的最后一个字符是“#”,则说明是root用户,如果是“$”,则说明是普通用户

    [root@localhost ~]# root用户

    [zhang@localhost root]$ 其他用户

(1)添加用户(useradd)

添加用户:useradd 【选项】 用户名。

  • 选项:

    • -d 指定用户的家目录(如果不指定,家目录默认为/home/用户名)
    • -g 指定一个初始的用户基本组(必须已存在)
    • -G 指定一个或多个扩展用户组。
    • -s 指定该用户的默认 Shell 解释器。
    • -u 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
    • -e 指定帐号的有效期限;
    • -M:不要自动建立用户的登入目录;
  • 用户名:指定新账号的登录名。

  • 举例:useradd –d /home/sam -m sam

    此命令创建了一个用户 sam,其中-d 和-m 选项用来为登录名 sam 产生一个主目录 /home/sam。

(2)用户口令的管理(passwd)

指定和修改用户口令: passwd 【选项】 【用户名】

  • 选项:

    • -l 锁定口令,即禁用账号。
    • -u 口令解锁。
    • -d 使账号无口令。
    • -f 强迫用户下次登录时修改口令。
  • 注意:

    • 普通用户只能使用 passwd 命令修改自身的系统密码。且会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则修改成功;
    • root 管理员有权限修改其他所有人的密码。且不需要验证旧密码。
  • 举例:passwd -l sam(用 -l 选项锁定 sam 用户,使其不能登录)

(3)删除帐号(userdel)

删除帐号: userdel 【选项】 用户名

默认只会删除 /etc/passwd 文件中的用户信息,而不会删除系统中属于该账户的任何文件。

  • 选项

    • -f 强制删除用户
    • -r 同时删除用户及用户家目录
  • 举例:userdel -r sam

(4)修改帐号(usermod)

修改已有用户的信息: usermod 【选项】 用户名

  • 常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与 useradd 命令中的选项一样,可以为用户指定新的资源值。

(5)查询用户信息(id)

  • 查询用户信息: id 用户名

    • 用户不存在是返回“无此用户”
    1
    2
    3
    4
    ➜  ~ hostname   
    VM-0-13-centos
    ➜ ~ id
    uid=1000(zhang) gid=1000(zhang) groups=1000(zhang)
  • 查看当前用户/登录用户:who am i(一般用于shell脚本,用于获取当前操作的用户名方便记录日志。

(6)切换用户(su)

  • 切换用户:su - 切换用户名
    • 从权限高切换到权限低的用户不需要输密码。
    • 返回切换前的用户:exit

(7)使用 root 权限(sudo)

有一些文件的操作只有 root 用户才有权限,如果想要普通用户也能够执行这些文件,就需要对/etc/sudoers进行设置。

  • 切换 root 用户

  • 编辑 /etc/sudoers 文件,并添加下面一行指令

    1
    2
    # 用户名 允许使用的主机=(以谁的身份)    可以执行的命令列表
    zhang ALL=(ALL) ALL # 表明用户zhang可以拥有所有文件的权限
  • 使用 sudo+指令 的方式执行某些命令。

(8)查询用户命令(who)

  • w:可显示开机多久,当前登录的所有用户,平均负载

  • who:显示当前登录的所有用户

  • last:显示每个用户最后的登录时间

  • lastlog:显示每个用户最后的登录时间)

2. 用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。组权限允许多个用户对系统中的对象共享一组共用的权限。不同 Linux 系统对用户组的规定有所不同,如 Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。 用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对 /etc/group 文件的更新。

(1)添加组(groupadd )

增加一个新的用户组: groupadd 【选项】 用户组

  • 选项:
    • -g GID 指定新用户组的组标识号(GID),如果不使用此选项,默认是在组号自增1。
    • -o 一般与-g选项同时使用,表示新用户组的 GID 可以与系统已有用户组的 GID 相同。
  • 举例:groupadd -g 101 group1(向系统中增加了一个新组 group1,同时指定新组的组标识号是 101)。

(2)删除组(groupdel)

删除用户组: groupdel 用户组

  • 举例:groupdel group1(将group1这个组删除)

(3)修改组(groupmod)

修改用户组: groupmod 【选项】 用户组

  • 选项:
    • -g GID 为用户组指定新的组标识号。
    • -o 与-g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同。
    • -n 新用户组 将用户组的名字改为新名字
  • 举例:groupmod –g 10000 -n group2 group1(将组group1的标识号改为10000,组名修改为group2)

3. 与用户账号有关的系统文件

(1)/etc/passwd 文件

用户(user)的配置文件,记录用户的各种信息。可以将用户登录名匹配到对应的 UID 值,UID,即 User ID,每个用户有着唯一的 UID。

image-20210727202800745
  • 每行的含义:
    1. “用户名”是代表用户账号的字符串。

      • 通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。
      • 为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。
    2. “口令”一些系统中,存放着加密后的用户口令字。

      • 虽然这个字段存放的只是用户口令的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户口令字存放到 /etc/shadow 文件中,而在 /etc/passwd 文件的口令字段中只存放一个特殊的字符,例如“x”或者“*”。
    3. “用户标识号”是一个整数,系统内部用它来标识用户。

      • 一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录 Shell 等。
      • 通常用户标识号的取值范围是 0~65535。0 是超级用户 root 的标识号,1~99 由系统保留,作为管理账号,普通用户的标识号从 100 开始。在 Linux 系统中,这个界限是 500。
    4. “组标识号”字段记录的是用户所属的用户组。

      • 它对应着/etc/group文件中的一条记录。
    5. “注释性描述”字段记录着用户的一些个人情况。

      • 例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。
    6. “主目录”,也就是用户的起始工作目录。

      • 它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。
    7. 用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

      • Shell 是用户与 Linux 系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。
      • 系统管理员可以根据系统情况和用户习惯为用户指定某个 Shell。如果不指定 Shell,那么系统使用sh 为默认的登录 Shell,即这个字段的值为 /bin/sh。
      • 用户的登录 Shell 也可以指定为某个特定的程序(此程序不是一个命令解释器)。
      • 利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些 Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。
    8. 系统中有一类用户称为伪用户(pseudo users)。

      • 这些用户在 /etc/passwd 文件中也占有一条记录,但是不能登录,因为它们的登录 Shell 为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

(2)/etc/shadow 文件

口令配置文件

  • 每行的含义:
    1. “登录名”是与 /etc/passwd 文件中的登录名相一致的用户账号
    2. “口令”字段存放的是加密后的用户口令字,长度为13个字符。如果为空,则对应用户没有口令,登录时不需要口令;如果含有不属于集合 { ./0-9A-Za-z }中的字符,则对应的用户不能登录。
    3. “最后一次修改时间”表示的是从某个时刻起,到用户最后一次修改口令时的天数。时间起点对不同的系统可能不一样。例如在 SCO Linux 中,这个时间起点是 1970 年 1 月 1 日。
    4. “最小时间间隔”指的是两次修改口令之间所需的最小天数。
    5. “最大时间间隔”指的是口令保持有效的最大天数。
    6. “警告时间”字段表示的是从系统开始警告用户到用户密码正式失效之间的天数。
    7. “不活动时间”表示的是用户没有登录活动但账号仍能保持有效的最大天数。
    8. “失效时间”字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

查看某用户密码(没意义,由于 /etc/shadow 包含用户加密的密码,只有 root 用户才能查看此文件):

1
2
3
4
5
6
7
# 切换到root用户
su root
# 查看密码加密方式
authconfig --test|grep hashing # 若输出password hashing algorithm is md5,即加密方式为md5
# 查看用户加密后的密码
cat /etc/shadow|grep 用户名
# 拿到密码后,直接找一个在线md5解密工具暴力破解,如https://www.somd5.com/

(3)/etc/group 文件

组(group)的配置文件,用户组的所有信息都存放在/etc/group文件中。

  • 每行含义:

    1. “组名”是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。
    2. “口令”字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
    3. “组标识号”与用户标识号类似,也是一个整数,被系统内部用来标识组。
    4. “组内用户列表”是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。

五. 文件与目录管理

1. 基本操作(touch、rm…)

  • pwd:(Print Working Directory),显示当前工作目录的绝对路径,比如 /home/zhang

  • ls【选项】

    • -a:显示当前目录所有的文件和目录,包括隐藏的;
    • -l:以列表(长格式)的方式显示信息。
    • -h:代表 human-readable,与-l 一起,以易于阅读的格式输出文件大小。
    • -i:会在第一列列出文件的 inode 号。
    • -F:这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是目录名,则会加上一个’/’ 字符。
    • ll 其实是 ls -alF 的别名
    • lscpu:列出 cpu 信息
    • lsmem:列出内存信息
    • lsblk:列出磁盘信息
  • cd:更换当前目录。

    cd ~ 或者直接cd:回到自己的家目录;

    cd .. :回到当前目录的上一级目录;

    cd - :回到上一次所在的目录

  • mkdir【选项】目录名:创建目录(可以 一次性创建多个目录,只需要在多个目录用空格隔开)。

    • -p:递归创建出具有嵌套叠层关系的文件目录,比如 mkdir -p /home/zhang/a/b/c/d
  • rmdir 目录名:删除空目录。rmdir不能删除非空的目录。如果需要删除非空的目录,需要使用rm -rf。

  • cp 源文件 文件/目录 :拷贝文件到指定目录(源文件可以是多个,中间用空格隔开);

    • -r / -R:递归复制整个文件夹。
    • 强制覆盖不提示的方法:cp 命令改为 \cp
    • 示例1:cp file1 file2 dir1 将文件 1 和 2 复制到目录 1 下,注意目录 1 必须存在
    • 示例2:cp -r dir1 dir2 将目录 1 下所有文件递归的复制到目录 2 下,此时目录 2 可以不存在,会自动创建
  • rm 源文件 目录:移除文件或目录;(使用rm-rf删除非空的目录)

    • -r:递归删除整个文件夹;
    • -f:强制删除不提示。
    • -i:会询问是否删除,需要输入 y/n,降低误删除的可能性
  • mv 源文件 目录:移动文件与目录(mv 源文件 目标文件 :重命名),注意 mv 命令只改变文件位置/文件

    名,inode 号和时间戳信息并未改变。

  • touch 【选项】 文件:创建空文件或者更新文件最近修改时间。可以一次性创建多个文件

    • -a 仅修改“读取时间”(atime),即访问时间
    • -m 仅修改“修改时间”(mtime)
    • -d 同时修改 atime 与 mtime
    • 更新文件时间举例:touch -d “2017-05-04 15:44” anaconda-ks.cfg
    • 源文件已经存在,直接 touch 源文件名,不会将源文件清空,而只会将最近修改时间变化为当前时间。
  • ln: 给文件创建一个软链接

    • 用法:ln -s [源文件或目录] [软链接名]

    • 示例:ln -s a.txt a,此时就会出现 a -> a.txt ,那么对 a 的操作就是对 a.txt 的操作。

    • 软链接生效是通过创建一个特殊类型的文件,这个文件包含一个关联文件或目录的文本指针。一个符号链接指向一个文件,而且这个符号链接本身与其它的符号链接几乎没有区别。如果往软链接里面写入东西,那么相关联的文件也被写入不过当你删除软链接时,原文件并不会被删除。如果先于符号链接删除文件,这个链接仍然存在,但是不指向任何东西。在这种情况下,这个链接被称为坏链接。

    • 注意:创建硬链接的格式为:ln 源文件名 硬链接名,但是硬链接具有以下两个局限性,因而被软链接所替代。(系统不会为硬链接创建新的 inode 号和文件,所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的 inode 连接数就会增加 1。且只有当该文件的 inode 连接数为 0 时,才算彻底被将它删除。因此即便删除原始文件,依然可以通过硬链接文件来访问

      ① 硬链接不能跨越物理设备,即只能对处于同一存储媒体的文件创建硬链接。

      ② 硬链接不能关联目录,只能是文件。

    • 硬链接是别名,软链接是快捷方式

  • wc:统计文件内容信息(包含行数、单词数、字节数)

    • 用法:wc 【-lwc】 文件路径
      • -l:表示 lines,行数
      • -w:表示 words,单词数 依照空格来判断单词数量
      • -c:表示 bytes,字节数
    • 如果不指定选项,默认是显示行数、单词数、字节数
  • file:确定文件类型

    • 用法:file 文件名

2. 文件属性

用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。

(1)ls -l

使用ls -l指令查看文件时,显示的内容如图所示
image-20210727203219371

文件权限说明:

  • 第 1 个字符代表文件类型

    当为[ d ]则是目录

    当为[ - ]则是文件

    若是[ l ]则表示为链接文档(link file),软链接

    若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);

    若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

  • 第 2-10 个字符,以三个为一组, 每一组分别代表对文件拥有者、所属群组以及其它人的文件权限,均为『rwx』 的三个参数的组合。[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。

连接数指的是文件的硬链接数

(2)rwx 权限详解

  • rwx 作用到文件:

    • r:read,可读取文件。
    • w:write,可修改文件。但不代表可以删除该文件。删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件。
    • x:execute,可执行文件。可以被执行。
  • rwx 作用到目录:

    • r:可读取目录下文件,比如可以ls查看目录内容。
    • w:可修改目录内文件,在本目录内:创建+删除+重命名目录/文件。
    • x:可执行目录内文件,比如可以cd进入该目录。
  • 关于删除目录/文件

    • 若想删除一个文件/目录,只有拥有此文件/目录的上级目录(父目录)的写权限后,才能删除此文件,并且与此文件/目录的权限没有任何关系。
    • 如果没有父目录的写权限,即使有文件/目录的rwx权限,也不能删除;
    • 如果有父目录的写权限,即使没有文件/目录的任何权限,也可以删除。(对文件/目录删除的操作,其实是对其父目录的写操作)

(3)修改文件所属组(chgrp)

更改文件所属组群,这个可以被现在的 chown 所替代了:

chgrp [-R] 属组名 文件名

  • -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。

(4)修改文件拥有者(chown)

更改文件拥有者,使用这个命令需要超级用户权限:

chown [–R] 账号名 文件名,把文件所有者从当前属主更改为新的账号用户。

chown [-R] 账号名:组名 文件名 ,把文件所有者改为新的账号用户,文件用户组改为新的用户组。

chown [-R] :组名 文件名,把文件用户组改为新的用户组,文件所有者不变。

chown [-R] 账号名: 文件名 ,把文件所有者改为新的账号用户,文件用户组改为新用户所在的组。

(5)修改文件属性(chmod)

  • 文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
  • 目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx

更改文件属性:chmod

  • Linux文件属性有两种设置方法,一种是数字,一种是符号。
  • 可以使用数字来代表各个权限(r:4 w:2 x:1)
  • 每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx—] 分数则是:
    • owner = rwx = 4+2+1 = 7
    • group = rwx = 4+2+1 = 7
    • others= — = 0+0+0 = 0

使用数字修改权限

  • chmod [-R] xyz 文件或目录
    • xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
    • -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
    • 举例:chmod 741 abc.txt 表示文件所有者权限为rwx,所属组权限为r–,其他用户权限为–x

使用符号修改权限

  • chmod [-R] u=xxx,g=xxx,o=xxx 文件或目录

  • u(user), g(group), o(others) ,

  • 举例:chmod u=rwx,g=r–,o=–x abc.txt 表示文件所有者权限为rwx,所属组权限为r–,其他用户权限为–x

3. 文件查看(cat、more、less…)

  • cat【-n】文件名:查看文件内容。只能浏览文件,而不能修改文件。

    • -n:显示行号。

    • cat 是连接文件,它的好处是可以同时读取多个文件,然后复制他们到标准输出。因而cat经常适用于显示多个简短的文本文件(如果文件较长,可以使用 less 命令分页查看)。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      [root@localhost zhang]# cat zhang.txt -n
      1 zhang
      [root@localhost zhang]# cat li.txt -n
      1 li
      [root@localhost zhang]# cat hu.txt -n
      1 hu
      [root@localhost zhang]# cat zhang.txt li.txt hu.txt -n
      1 zhang
      2 li
      3 hu
    • 如果只使用 cat 命令,而没指定文件名,程序就会等待输入数据,然后让按下 Ctrl+D 后,就相当于告诉cat,在标准输入中,已经到达文件末尾,然后 cat 会把标准输入进行标准输出。也就是说,如果没有文件名参数,cat 会复制标准输入到标准输出,我们也可以通过重定向,利用 cat 的这种特性把标准输入重定向到一个文件中。

      1
      2
      3
      4
      [root@localhost zhang]# cat > out.txt  (这条命令将标准输入重定向到out.txt中)
      这是我的标准输入! (注意输入完后,需要按下ctrl+D/C)
      [root@localhost zhang]# cat out.txt (这条命令是查看out.txt文件内容)
      这是我的标准输入!
    • 结尾加上 | more:分页显示,不会全部一下显示完。

    • 如果想把多个文件合并为一个,就可以使用 cat 和重定向>联合进行实现

  • more:是一个基于 VI 编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more 还内置了很多快捷键:

    • 空白键(Space):向下翻一页
    • Enter:向下翻一行
    • q:立刻离开more,不再显示该文件内容
    • F:向下滚动一屏
    • B:返回上一屏
    • = :输出当前行的行号
    • :f 输出文件名和当前行的行号
  • less:用来分屏查看文件内容,与 more 相似,但是更强大,支持各种显示终端。less 指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容。对于显示大型文件具有较高的效率。如果文件多于一页,我们可以上下滚动文件。如果想要退出 less 程序,只需要按下”q”键即可。如果想要快速定位到文件末尾,可以按“G”键

  • head【-n 行号】文件:显示文件的开头部分。-n :后面接数字,代表显示几行的意思(如果不指定,默认显示10行)

  • tail【-n 行号】文件:输出文件中尾部的内容(如果不指定显示行号,默认显示最后10行)。

    • -f:实时追踪该文档的所有更新(即当新的内容添加到文件后,它们会立即出现在屏幕上,这样会一直继续下去直到你输入Ctrl+C)该命令一般用于查看系统的日志比较多。
  • > 指令:将标准输出重定向到一个文件中。如果不存在会创建文件,否则会将原来的文件内容覆盖。

    • 还可以通过命令> 文件名用于清空一个已存在的文件或是创建一个新的空文件,因为重定向的内容为空(> 前没有任何东西)

    • 标准输出重定向默认不会把错误输出到文件中,如果想要重定向标准输出和错误到同一个文件,可以在后面补上2>&1,或者使用一种更简单的方式,使用命令&> 文件名。在linux中,用文件描述符0,1,2分别表示标准输入、输出、错误。

    • 举例1:python main.py >a.txt 将程序的标准输出重定向到a.txt文件中;

    • 举例2:python main.py 2>a.txt 将程序的标准错误重定向到a.txt文件中;

    • 举例3:python main.py >a.txt 2>&1 将程序的标准输出以及错误都重定向到a.txt文件中。

      另外一种简便写法:python main.py &>a.txt

  • >>指令:将标准输出重定向到一个文件中。如果不存在会创建文件,否则不会覆盖原来的文件内容,而是追加到文件的尾部。

  • echo:输出内容到控制台。

  • history:查看历史指令

4. 搜索查找(find、locate、grep)

  • **find**:find 【查找路径】【选项】【操作】

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

    选项:

    • -name (文件名):按照指定的文件名查找模式查找文件。
    • -user (用户名):按照指定的用户名查找模式查找文件。
    • -size (+多少/-多少/多少):按照指定的文件大小查找模式查找文件(+50KB 为查找超过 50KB 的文件,而-50KB 为查找小于 50KB 的文件)
    • 举例:查询 /目录下所有.txt的文件:find / -name *.txt
  • locate:locate (搜索文件)

    • 可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。
    • locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate 时刻。
    • 在第一次运行之前,必须使用 updatedb 指令创建locate数据库(使用updatedb可以更新数据库)。
    • 一般在locate 搜索文件前,先 updatedb 更新数据
    • 举例:locate txt | grep zhang(文件可以是任何字母,如果忘记了全称,也可以查找后缀等等缩小范围)
  • **grep**:过滤查找,表示将前一个命令的处理结果输出传递给后面的命令处理。经常跟管道一起使用。

    管道就是“|”,它可以将前一个命令的标准输出送至到后一个命令的标准输入。

    • grep [选项] 查找内容 源文件
    • -n:显示匹配行及行号。
    • -i:忽略大小写字母。
    • 举例:ps -aux | grep python 在所有运行的程序中,查找是python的程序。
  • which:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。比如想要把一个程序安装地址添加到环境变量,但又忘了程序安装目录,就可以使用 which 命令。比如:which python ,输出/usr/bin/python

  • whereis:用于程序名的搜索,只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

5. 压缩和解压

  • gzip/gunzip:压缩文件/解压
    • gzip (文件):压缩为.gz文件,原来文件不保留,且不能压缩目录。
    • gunzip (文件):解压缩,同样也不保留源文件。
  • zip/unzip:压缩文件/解压
    • zip [选项] (压缩后文件xxx.zip) (将要压缩的文件)
    • unzip [选项] (要解压的文件xxx.zip)
    • zip -r:递归压缩,即压缩目录
    • unzip -d (目录):指定解压后的文件的存放目录
  • tar:打包指令,要结合-z进行压缩,最后打包压缩是以.tar.gz结尾的文件(一个常见的,与文件压缩结合一块使用的文件管理任务是归档。归档就是收集许多文件,并把它们捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用。当把旧数据从一个系统移到某种类型的长期存储设备中时,也会用到归档程序。)
    • tar [选项] xxx.tar.gz (打包的内容)
    • -c:产生.tar打包文件
    • -v:显示详细信息
    • -f:指定压缩后的文件名
    • -z:打包同时压缩(使用gzip压缩)
    • -x:解压.tar文件
    • 压缩:tar -zcvf (压缩后文件名) (要压缩的文件)
      • 可以使用*?等通配符,压缩文件可以包含多个,打包在一起后再进行压缩。
    • 解压:tar -zxvf (要解压的文件)
    • 解压到指定目录:tar -zxvf (要解压的文件) -C (指定目录),指定解压到的目录要存在。

6. 环境变量

可以通过env命令查看系统所有的环境变量。

应用于所有用户的全局配置脚本是 /etc/profile 。

用于个人的启动文件是 ~/.bash_profile 可以用来扩展或重写全局配置脚本中的设置。

1
2
3
4
# $是参数展开,$PATH表示原来的环境变量,:是环境变量之间的分隔符,$HOME/bin是要新增的环境变量
PATH=$PATH:$HOME/bin
# 使用exprort后,shell的子进程就可以使用环境变量的内容
export PATH

当修改了环境变量时,文件修改并不会立即生效,直到我们关闭终端会话,再重新启动一个新的会话,因为这些文件只是在刚开始启动终端会话时读取。如果想要立即生效,我们可以使用source 文件名来激活文件修改。

六. 进程管理

1. 进程概述

  • 在 Linux 中,每个执行的程序(代码)都称为一个进程。每个进程都分配一个 ID 号
  • 每一个进程,都会对应一个父进程。
  • 每个进程都可能以两种方式存在。前台和后台。
    • 前台进程:用户目前的屏幕上可以进行操作的。
    • 后台进程:实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
  • 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才结束。

2. 显示进程(ps)

ps [选项]:查看目前系统中,有哪些正在执行,以及它们执行的状况(process status 进程状态),默认情况下(即不加选项参数),ps 不会显示很多进程信息,只会显示运行在当前控制台下的属于当前用户的进程。

  • ps -a:显示当前终端的所有进程信息。
  • ps -u:以用户的格式显示进程信息。
  • ps -x:显示后台进程运行的参数。
  • ps -axu:查看所有进程信息。
  • ps -axu | grep xxx:查看特定的进程
  • ps -e:等价于ps -a
  • ps -ef:以全格式显示当前所有的进程,(可以查看进程的父进程,在进程方案中,一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程)。
1
2
3
4
5
6
➜  ~ ps -aux            
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
➜ ~ ps -ef
UID PID PPID C STIME TTY TIME CMD
...
image-20201210204558543
字段 说明
USER 用户说明
PID 进程识别号
%CPU 进程占用 cpu 百分比
%MEM 进程占用物理内存百分比
VSZ 进程占用虚拟内存大小(KB)
RSS 进程占用物理内存大小(KB)
TTY 终端机号(如果是?,则表示没有控制终端)
STAT 进程状态,S 睡眠,进程没有运行,而是,正在等待一个事件R 正在运行或准备运行;Z 僵尸进程,即已经终止,但父进程没有清空它(父进程已不存在);T 被跟踪或被停止;**<表明是一个高级优先进程,会给与更多的 CPU 时间**。
STARTED 进程启动的时间
TIME 此进程所消耗的CPU时间
COMMAND 正在执行的命令或进程名
PPID 该进程的父级进程id,如果一个程序的父级进程找不到,该程序的进程称之为僵尸进程(parent process ID)

3. 查看进程树(pstree)

  • 查看进程树:pstree [选项]
    • -p:显示进程的PID
    • -u:显示进程的所属用户

4. 终止进程(kill)

若是某个进程执行一半需要停止时,或是消耗了很大的系统资源时,此时可以考虑停止该进程,使用kill命令来完成此任务

  • kill [选项] 进程号:通过进程号杀死进程
    • -9:表示强迫进程立刻停止。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。
  • killall 进程名称:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用。
  • 默认参数下,kill 发送SIGTERM(15)信号给进程,告诉进程,你需要被关闭,请自行停止运行并退出,也就是告诉进程可能的话就停止运行,但是如果有不服管教的进程,那它会忽略此请求(有时候系统会觉得某个进程正在执行,可能是误操作,所以不会真正杀死进程,比如强制关掉某个终端,就必须使用-9)。而kill -9 发送 SIGKILL 信号给进程,告诉进程,你被终结了,请立刻退出。TERM(或数字9)表示“无条件终止”;
  • 总结就是:kill -9 无条件终止,kill -15 尽可能终止
  • 案例:踢掉某个非法用户

也可以直接使用ps -aux | grep sshd,找到非法用户名(sshd:xxx@pts/x)

5. 服务(Service)管理

服务(Service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysql,sshd 防火墙等),因此我们又称为守护进程。

(1)service 管理指令(systemctl)

service 管理指令:

在 CentOS7.0 之前:service 服务名 [命令]

在 CentOS7.0 之后:systemctl [命令] 服务名

  • 命令

    • start :立即启动服务
    • stop:立即关闭服务
    • restart: 重新启动服务
    • reload :不关闭服务,但使得新配置文件生效
    • status:显示服务的状态(active(running)正在执行、inactive(dead)未在执行)
    • enable:设定服务开机自启
    • disable:设置服务开机不自启
  • 查看防火墙情况:

    • service iptables status
    • systemctl status firewalld(7.0之后的版本)
  • 测试某个端口是否在监听:telnet

(2)查看所有服务开机自启情况

  • 方式1:setup 指令
  • 方式2:ls -l /etc/init.d/

(3)服务的运行级别(runlevel)

  • 查看或修改默认级别:vim /etc/inittab
  • 每个服务对应的每个运行级别都可以设置
  • 指定运行级别
    • 0.关机
    • 1.单用户模式【可用于找回丢失密码】
      • 单用户模式下只启动基本的系统进以及一个控制台终端进程。
      • 通常用来再系统有问题时进行紧急的文件系统维护,只有一个人(系统管理员)能登录到系统上操作数据。
    • 2.多用户状态没有网络服务
    • 3.多用户状态有网络服务
      • 标准的启动运行级,大多数应用软件都会启动。
    • 4.系统未使用保留给用户
    • 5.图形界面
    • 6.系统重启
    • 系统的运行级别配置文件:/etc/inittab
    • 切换到指定运行级别的指令:init [012356]

(4)开机流程

开机->BIOS->/boot->init进程1->运行级别->运行级对应的服务

(5)chkconfig指令

chkconfig:可以给每个服务的各个运行级别设置自启动/关闭

  • 查看xxx服务:chkconfig –list | grep xxx
  • 查看服务的状态:chkconfig 服务名 –list
  • 给服务的运行级别设置自启动:chkconfig –level 5 服务名 on/off
  • 要所有运行级别关闭或开启:chkconfig 服务名 on/off
  • chkconfig重新设置后需要重新启动才能生效

6. 动态监控进程(top)

top 与 ps 相似,都是用来显示正在执行的进程,top 的不同之处在于 top 执行一段时间可以更新正在运行的进程,即查看服务器的进程占的资源(100%使用)。

top [选项]

  • -d 秒数:指定top命令每隔几秒更新。默认是3秒。
  • -i:使top不显示任何闲置或者僵死进程。
  • -p:通过指定监控进程ID来仅仅监控某个进程的状态。
  • 交互操作说明:
操作 功能
P 以CPU使用率排序,默认就是此项
M 以内存的使用率排序
N 以PID排序
q 退出top

使用uptime命令可以看到 top 第一行的内容,其中 load average 后面的三个数分别是最近1分钟、5分钟、15分钟的负载情况。load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑 CPU 的数量,结果高于 5 的时候就表明系统在超负荷运转了。

七. 网络管理

1. IP地址(ipconfig)

ifconfig

2. 测试主机之间网络的连通性(ping)

ping命令用于测试主机之间网络的连通性。

参数 说明
-c 次数 指定发送的ICMP报文的次数
-i 时间间隔 相邻两次发送报文的时间间隔,默认为1s

3. 查看网络情况(netstat)

netstat 用于查看占用端口的进程

netstat [选项]

  • -an:按一定顺序排列输出
  • -n:表示将地址从字母组合转化成ip地址,将协议转化成端口号来显示
  • -p:显示哪个进程在调用(表示显示发起连接的进程pid和进程名称)
  • -t :显示TCP传输协议的连线状况
  • -u :显示UDP传输协议的连线状况
  • -l:显示监听中的服务器的Socket

常用:netstat -tunlp

  1. 查看所有的网络服务

    • netstat -anp | more
  2. 查看sshd的服务的信息

    • netstat -anp | grep sshd
  3. 查看所有处于连接状态的端口信息

    img

4. 防火墙(TODO)

对于 CentOS7 之前,防火墙为 iptables,CentOS7 之后,使用的是 firewall。

service iptables start/restart/stop :iptables 服务启动/重启/关闭

service iptables status:查看 iptables 的状态

简单设置防火墙规则:

例如,需要允许80端口通过防火墙,则规则可以用以下的命令来设置

iptables -I INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口

  • Iptables:主命令
  • -I:表示将规则放到最前面
  • -A:add,添加规则(最后)
  • INPUT:进站请求【出站output】
  • -p:protocol,指定协议(icmp/tcp/udp)
  • –dport:指定端口号
  • -j:指定行为结果,允许(accept)/禁止(reject)/丢弃(drop)

开放某个端口

1
2
firewall-cmd --zone=public --add-port=15672/tcp --permanent # 开放命令
firewall-cmd --reload # 刷新防火墙

5. 文件下载(wget)

wget 是 Linux 系统下载文件工具,用来从指定的 URL 下载文件。wget 非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget 会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget 支持 HTTP,HTTPS 和 FTP 协议,可以使用 HTTP 代理。所谓的自动下载是指,wget 可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个 wget 下载任务,然后退出系统,wget 将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

语法:wget [参数] [URL地址]

  • 常规下载: wget https://github.com/jaywcjlove/linux-command/archive/master.zip
  • 自定义保存文件名: wget -O 自定义名称 https://github.com/jaywcjlove/linux-command/archive/master.zip
  • 后台下载: wget -b https://github.com/jaywcjlove/linux-command/archive/master.zip
  • 自动断点下载:wget -c http://www.gitnavi.com/index.html (使用wget -c重新启动下载中断的文件,对于我们下载大文件时突然由于网络等原因中断非常有帮助,我们可以继续接着下载而不是重新下载一个文件)
  • 伪装代理名称下载:wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" https://github.com/jaywcjlove/linux-command/archive/master.zip

八. 软件安装

1. CentOS

(1) RPM 包安装

RPM:RedHat Package Manager,红帽软件包管理工具。 Linuxd分发版本都有采用(suse,redhat,centos等)

(1)查看指令

  • RPM 查询已安装的 rpm 列表:rpm -qa | grep xx
    • 查看是否安装 firefox:rpm -qa |grep firefox
    • 如果是 i686,i386 表示 32 位系统,noarch 表示通用
  • rpm -qa:查询所安装的所有rpm软件包
  • rpm -q xx:查询xx软件包是否安装
  • rpm -qi xx:查询软件包信息
  • rpm -ql xx:查询软件包中的文件
  • rpm -qf 文件全路径名:查询文件所属的软件包

(2)卸载指令

  • 卸载 rpm 包:rpm -e 软件包名称
  • 如果其他软件依赖于要卸载的包,删除时可能会发生依赖错误
  • 忽视依赖强制删除的方法:rpm -e –nodeps 软件包名称 可以强制删除,但不建议这样做,否则会导致程序无法运行

(3)安装指令

  • 安装 rpm 包:rpm -ivh 软件包全路径名称
    • i=install:安装
    • v=verbose:提示
    • h=hash:进度条

(2) yum 在线安装

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

  • yum list | grep xx:查询yum服务器是否有需要安装的软件
  • yum install xx:安装指定的yum包
    • 参数,-y(当安装过程提示选择全部为”yes”)
  • yum -y remove xx / yum erase xx:卸载指定的yum包
  • yum update:更新系统软件包

2.Ubuntu

(1)deb 包安装

安装:先从网上下载 deb 包,然后使用命令 depk -i xxx.deb

删除:depk - r 名称

(2)agt-get 在线安装

Advanced Package Tool,又名 apt-get,是一款适用于UnixLinux系统的应用程序管理器。最初于1998年发布,用于检索应用程序并将其加载到 Debian Linux 系统(比如Ubuntu)。

  • apt-get install xx:安装指定的软件包
  • apt-get remove xx:卸载一个已安装的软件包(保留配置文档)
  • apt-get update; apt-get upgrade:更新系统软件包(软件列表)

九. 磁盘和内存管理

对于磁盘的使用,首先找到磁盘所在分区(fdisk)、然后挂载(mount)

1. df 指令

用于显示目前在 Linux 系统上的文件系统磁盘使用情况统计。可以加上-h,以人类友好格式显示文件系统硬盘空间使用情况。

1
2
3
4
5
6
7
8
9
10
11
➜  ~ df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 7.8G 0 7.8G 0% /dev
tmpfs 1.6G 10M 1.6G 1% /run
/dev/sda2 3.6T 2.7T 812G 77% /
tmpfs 7.8G 4.0K 7.8G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 511M 3.5M 508M 1% /boot/efi
tmpfs 1.6G 0 1.6G 0% /run/user/1000
tmpfs 1.6G 0 1.6G 0% /run/user/1004

2. du 指令

显示每个文件和目录的磁盘使用空间文件的大小(df 是全部的文件系统磁盘)。

du [选项][文件]

常见选项:

  • -a或-all 显示目录中个别文件的大小,单位为KB。
  • -b或-bytes 显示目录或文件大小时,以byte为单位。
  • -c或–total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  • -m或–megabytes 以MB为单位输出。
  • -s或–summarize 仅显示子目录的总值,而不会把子目录中所有文件大小都列出来,如果没有s选项,非目录大小不会列出来。
  • -h或–human-readable 以K,M,G为单位,提高信息的可读性。
1
2
3
4
5
6
7
8
//查看当前目录下各个文件及目录占用空间大小
du -sh *

[zhang@VM-0-13-centos ~]$ du -sh *
4.0K a.txt
4.0K cal.txt
4.0K date.txt
12K mydir

3. free指令

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
➜  ~ free -h
total used free shared buff/cache available
Mem: 15G 7.8G 287M 676M 7.5G 6.7G
Swap: 976M 38M 938M

Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

4. mount 指令

挂载:Linux 中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”。

注意:“挂载点”的目录需要以下几个要求:

(1)目录事先存在,可以用 mkdir 命令新建目录;

(2)挂载点目录不可被其他进程使用到;

(3)挂载点下原有文件将被隐藏。

挂载指令:mount [-t vfstype] [-o options] device dir

  • -t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
    • 光盘或光盘镜像:iso9660
    • DOS fat16文件系统:msdos
    • Windows 9x fat32文件系统:vfat
    • Windows NT ntfs文件系统:ntfs
    • Mount Windows文件网络共享:smbfs
    • UNIX(LINUX) 文件网络共享:nfs
  • -o options 主要用来描述设备或档案的挂接方式。常用的参数有:
    • loop:用来把一个文件当成硬盘分区挂接上系统
    • ro:采用只读方式挂接设备
    • rw:采用读写方式挂接设备
    • iocharset:指定访问文件系统所用字符集
  • device 要挂接(mount)的设备。
  • dir设备在系统上的挂接点(mount point)。

简单挂载:mount 设备原始地址 要挂载的位置路径,比如sudo mount /dev/sdb1 /mnt

  • 设备原始地址:地址统一都在/dev下,然后根据大小确定具体name值(使用lsblk/fdisk指令),拼凑在一起组成原始地址,例如当前:“/dev/sr0”

  • 要挂载的位置路径:挂载目录一般都在mnt下,也可以在mnt下建目录,此处以“/mnt/dvd”为例

简单解挂:umount 当前设备的挂载点(即路径),比如umount /media/zhang/张李虎,注意不要在挂载点去解除挂载(相当于要拆房子,自己却在房子中),不允许的操作。

5. lsblk 指令

lsblk 【选项】【设备文件名】:

选项:

  • -d:仅列出磁盘本身,并不会列出该磁盘的分区信息
  • -f:同时列出该磁盘内的文件系统名称
  • -i:使用ASCII的字符输出,不要使用使用复杂的编码(在某些环境下有用)
  • -m:同时输出该设备在/dev下面的权限信息(rwx的数据)
  • -p:列出该设备的完整文件名(因为不加这个选项,显示的是最后的名字)
  • -t:列出该磁盘设备的详细数据,包括磁盘列阵机制、预读写的数据量大小等
1
2
3
4
5
6
➜  ~ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 3.7T 0 disk
├─sda2 8:2 0 3.7T 0 part /
├─sda3 8:3 0 977M 0 part [SWAP]
└─sda1 8:1 0 512M 0 part /boot/efi
说明
NAME 设备的文件名,如果不加-p选项,会忽略/dev等前导目录
MAJ:MIN 分别是主要与次要设备代码。内核识别的设备都是通过这两个代码来实现的
RM 是否为可卸载的设备,如光盘、USB磁盘等
SIZE 容量
RO 是否为只读设备的意思
TYPE 是磁盘(disk)、分区(partition)、只读存储器(rom)等输出
MOUNTPOINT 挂载点

6. fdisk 指令

fdisk指令用于管理安装在系统上的任何存储设备上的分区。其可以在设备上编辑,删除,和创建分区,但必须要有管理员权限。

  • -l 列出素所有分区表

在挂载之前,首先要知道所要挂载U盘所在的分区,就需要使用sudo fdisk -l

十. 其他指令

1. 时间(data/cal)

  • date:显示当前日期和时间

    • date “+%Y”:显示当前年份

    • date “+%d”:显示当前月份

    • date “+%F”:等价于date “+%Y-%m-%d” ,显示年月日

    • date “+%T”:等价于date “+%H:%M:%S” ,显示时分秒

    • date “+%Y-%m-%d %H:%M:%S”:显示年-月-日 时:分:秒

    • 设置日期:date -s 字符串时间

    • date -d “**-1 day**” “+%Y-%m-%d %H:%M:%S” :获取之前或者之后的某个时间(备份)

      符号的可选值:+(之后) 或者 - (之前)

      单位的可选值:day(天)、month(月份)、year(年)

    1
    2
    3
    4
    5
    6
    7
    8
    ➜  ~ date                     
    2020年 12月 21日 星期一 18:41:14 CST
    ➜ ~ date "+%Y-%m-%d %H:%M:%S" # 引号也可以不要,但+左边要有空格,右边没有空格
    2020-12-21 18:42:39
    ➜ ~ date "+%F"
    2020-12-21
    ➜ ~ date -d "-1 year" "+%F"
    2019-12-21
  • cal:查看日历指令;

    • cal [月] [年份]:显示某一年或月的日历

2. 定时任务

(1)周期性执行(crontab)

默认情况下,linux 操作系统会自动启动 crond 进程(周期性的执行某种任务或等待处理某些事件的一个守护进程),此进程会每分钟定期检测是否有需要执行的任务,如果有,就会执行该任务(类似于闹钟,定点执行)。

而 crontab 就是所需要执行任务的表。

指令: crontab [-u user] [ -e | -l | -r ] / crontab [-u user] file

系统会默认运行 crond 进程:

1
2
3
[zhang@VM-0-13-centos etc]$ ps -aux|grep crond
root 1243 0.0 0.0 126420 1652 ? Ss 13:44 0:00 /usr/sbin/crond -n
zhang 2833 0.0 0.0 112812 972 pts/0 R+ 19:07 0:00 grep --color=auto crond

任务分类:

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在 /etc 目录下有一个crontab 文件,这个就是系统任务调度的配置文件

  • 用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在 /var/spool/cron/ 文件名下,其文件名与用户名一致。(即当用户创建一个 crontab 任务后,就会在 var/spool/cron 目录下,创建一个与用户名一样的文件,该文件内容就是用户创建的 crontab 任务的内容)

选项:

  • -u user:-u 用来指定某个用户的 crontab 服务,例如,“-u zhang”表示设定用户 zhang 的 crontab 服务,此参数一般由 root 用户来运行,如果不设置,默认为当前用户。
  • file:file 是命令文件的名字(通常是 shell 脚本),表示将 file 做为 crontab 的任务列表文件并载入 crontab。如果在命令行中没有指定这个文件,crontab 命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑用户的 crontab 文件内容。当用户编辑完文件内容后,会在/var/spool/cron目录下,创建一个与用户名一样的文件,该文件内容就是用户创建的 crontab 任务的内容
  • -l:显示某个用户的 crontab 文件内容
  • -r:从 /var/spool/cron 目录中删除某个用户的 crontab 文件

crontab内容格式:

1
2
3
4
5
6
7
8
9
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
# 分钟 小时 天 月 周 所要定时执行的命令

前五个时间设定段,可以含如下特殊字符:

  • 星号(*):代表所有可能的值,例如 month 字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作;
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”;
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在 minute 字段,表示每十分钟执行一次。

举例1:每隔一分钟,将当前日期追加到 /home/zhang/date.txt 文本中。

1
2
3
4
5
6
7
[zhang@VM-0-13-centos ~]$ crontab -l
no crontab for zhang
[zhang@VM-0-13-centos ~]$ crontab -e # 输入*/1 * * * * date +%F >> /home/zhang/date.txt
no crontab for zhang - using an empty one
crontab: installing new crontab
[zhang@VM-0-13-centos ~]$ crontab -l
*/1 * * * * date >> /home/zhang/date.txt

举例2:每天凌晨 4 点,将 mysql 的一个名叫 account 的数据库备份到 account_db.bak 中

1
0 4 * * * mysqldump -u root -p 密码 account >/home/zhang/account_db.bak

(2)一次性执行(at)

crontab 会循环执行任务,而如果只想在某个时间点执行一次,就可以使用 at 命令(一次性定时任务)。同样,linux 也会运行一个名叫 atd 的守护进程查看是否有任务需要定点执行(将任务时间与当前时间对比,如果相等即执行)。

指令:at 【选项】【时间】

系统会默认运行atd进程:

1
2
3
[zhang@VM-0-13-centos ~]$ ps -ef|grep atd
root 1244 1 0 13:44 ? 00:00:00 /usr/sbin/atd -f
zhang 14403 6861 0 20:07 pts/1 00:00:00 grep --color=auto atd

选项:

  • -l:列出当前用户的at任务列表,也可使用 atq
  • -d 任务编号:取消一个 at 任务,后面跟 at 任务编号,也可使用 atrm 任务编号代替
  • -c 任务编号:显示该任务的实际内存,如:at -c 1 ,显示 1 号任务的详情
  • 时间格式
    • HH:MM 如: at 02:30
    • HH:MM YYYY-MM-DD 如:at 8:00 2020-01-01
    • HH:MM[am | pm] [month] [date] 如:at 8:00 Oct 1 # 在十月一号的八点
    • HH:MM[am | pm] + number [minutes | hours | days | weeks] 如:at 8:00 + 1days
    • now + 时间 比如在十分钟后:at now + 10 minutes,在一天后:at now + 1 days

使用 ctrl+D 退出

举例:在一分钟后,将日历写入到 cal.txt 文本中

1
2
3
[zhang@VM-0-13-centos ~]$ at now + 1 minutes
at> cal >/home/zhang/cal.txt<EOT> # 输入结束后,按ctrl+D退出
job 3 at Thu Apr 22 20:15:00 2021

3. 找回 root 密码

必须在服务器机上找回 root 密码,不能远程修改。

一步:重启,按下”e”键,进入编辑模式

第二步:在 linux16 这行的后面输入“rd.break“,按下 Ctrl+X,以单用户模式启动

第三步:依次输入

#mount –o remount,rw /sysroot

#chroot /sysroot

#passwd 修改root密码

#touch /.autorelabel

#exit

#reboot,重启后密码就修改成功了!

4. 有趣的指令

(1) 火车(sl)

1
2
3
4
5
6
# 实现效果:一辆呼啸而过的火车。
# 安装依赖
yum install -y epel-release
yum install -y sl
# 运行指令
sl
image-20210508144544722

(2)一头牛(cowsay)

1
2
3
4
5
6
# 实现效果:打印出来一头牛
# 安装依赖
yum install -y epel-release
yum -y install cowsay
# 运行
cowsay "hello world"

5. Sed 指令

sed 是 stream editor(流编辑器)的简称。它对文本流,即一系列指定的文件或标准输入进行编辑。

常用指令:

  • sed 's/regexp/replacement/' 文件名。这个命令类似于 vim 中的替换命令,只要找到一个 regexp (正则表达式)匹配项,就将替换为 replacement 的内容。

    举例:

    • sed ‘s/aaa/bbb/‘ a.txt 将 a.txt 文本中所有的 aaa 替换成 bbb

6. 排序数据(sort)

顾名思义,sort 是对数据进行排序的命令。默认情况下,sort 命令按照会话指定的默认语言的排序规则对文本文件中的数据行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[zhang@VM-0-13-centos ~]$ cat test.txt 
cc
bb
dd
aa
2
1
4
3
[zhang@VM-0-13-centos ~]$ sort test.txt
1
2
3
4
aa
bb
cc
dd

默认情况下,sort 会把数字当做字符来执行标准的字符排序,会使得 10 排在 2 的前面,如果想要按照数字排序的方式,需要添加 -n 参数。

十一. Shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序,通过按顺序一行行的执行命令(解释型,不需要编译),实现相应的功能。

1. 第一个 shell 脚本

  • ① 编写脚本文件(创建一个helloword.sh文件,输入下面内容)。

    注意:脚本文件需具有执行权限,代码第一行是指定脚本要使用的shell解释器(可省略)

    1
    2
    3
    #!/bin/bash
    # 这是我的第一个脚本
    echo 'Hello World!'
  • ② 执行脚本文件。

    注意:不能直接使用 helloworld.sh,因为这样会去环境变量中找有没有叫helloworld.sh的,找不到就会执行不了,因而需要使用文件路径(绝对/相对)来执行脚本文件。

    1
    ./helloworld.sh

2. 变量

变量定义:变量名=变量值,不需要指定变量的类型(默认会当成字符串)。

定义有类型的变量(declare):declare -i 变量名=变量值(将变量看成整数)

变量定义规则:

  • 变量名区分大小写。所有的环境变量名均使用大写字母,如果是自己创建的局部变量或shell脚本,尽量使用小写字母。
  • 命名中只能含有字母,数字和下划线,且首个字符不能以数字开头。
  • 变量名后面等号两边不能有空格,即变量名、等号、值之间不能有空格。如果在赋值表达式中加上了空格,shell会把值当成一个单独的命令。
  • 不能使用bash中的关键字。

变量名的使用:

1
2
3
$变量名 / ${变量名}
# 相同点:都可以调用变量。
# 不同点:${变量名}可以只截取变量的一部分(如${变量名:1:3}表示截取变量的(1,3]字符),而$变量名不可以。

举例:

1
2
3
4
#!/bin/bash
# 输出当前时间
current=`date +%F` # 注意外面的不是单引号,而是“飘号”
echo $current

用户输入:read【选项】 变量名

常见选项 含义
-p 定义提示用户的信息
-n 定义字符数(限制变量值的长度)
-s 不显示(不显示用户输入的内容)
-t 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间)

举例:

1
2
3
4
#!/bin/bash
# 用户输入自己的名字,然后在屏幕上显示其名字
read -p "请输入你的名字:" name
echo "你的名字是:"+$name # 可以替换为echo "你的名字是:$name"

注意:shell脚本中单引号与双引号的区别:

  • 单引号中的内容会原样输出

  • 双引号中的内容会进行变量替换

  • 举例

    1
    2
    3
    4
    #!/bin/bash
    name="张三"
    echo "$name" # 会输出张三
    echo '$name' # 会输出$name

3. 运算符

1)算术运算符

运算符 说明 举例
+ 加法 expr $a + $b
- 减法 expr $a - $b
* 乘法 expr $a \* $b
/ 除法 expr $b / $a
% 取余 expr $b % $a
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ]
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ]

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr

举例:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# 让用户输入两个数,然后计算这两个数的四则运算,并输出在屏幕上。
read -p "请输入第一个数:" a
read -p "请输入第二个数:" b
val1=`expr $a + $b`
val2=`expr $a - $b`
val3=`expr $a \* $b`
val4=`expr $a / $b`
echo "$a + $b = $val1"
echo "$a - $b = $val2"
echo "$a * $b = $val3"
echo "$a / $b = $val4" # 注意:两个整数相除结果为整除
1
2
3
4
5
6
请输入第一个数:8
请输入第二个数:3
8 + 3 = 11
8 - 3 = 5
8 * 3 = 24
8 / 3 = 2

注意:

  • 运算符左右两边都需要有空格,如果没有空格表示是字符串连接.

  • 计算乘法时,需使用/*,因为shell可能会误解星号含义.

  • expr 只能进行整数之间的四则运算,如果计算的时非整数,会出现错误.

  • expr 默认是直接把运算结果输出到控制台,如果需要赋值,则需要使用飘符号`.

  • 对于四则运算,最好用$(())代替expr,效率更高,而且运算符两边不用空格.(但也只能计算整数

    $((expression))是linux的一种字符展开(更具体来说是算术表达式展开),在括号里面输入表达式。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
    read -p "请输入第一个数:" a
    read -p "请输入第二个数:" b
    val1=$(($a+$b))
    val2=$(($a-$b))
    val3=$((a\*$b))
    val4=$(($a/ $b))
    echo "$a + $b = $val1"
    echo "$a - $b = $val2"
    echo "$a * $b = $val3"
    echo "$a / $b = $val4"
  • 对于四则运算,也可以使用$[],运算符两边也不用空格.

  • bash 不支持浮点运算,如果需要进行浮点运算,需要借助bc / awk 处理

2) 关系运算符

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ]
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ]
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ]
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ]
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ]
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ]

3) 逻辑运算符

运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ]
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ]
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ]

十二. 软件安装

1. JDK 安装

  • 默认 CentOS 安装了 openJDK,首先将其卸载掉,首先查看默认安装的 openJDK

    1
    rpm -qa|grep openjdk
    1
    2
    3
    4
    5
    # 有四个openjdk
    java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
    java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
    java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
    java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64
  • 将查出来的openjdk通通卸载掉

    1
    2
    3
    4
    5
    rpm -e --nodeps java-1.8.0-openjdk 
    rpm -e --nodeps java-1.8.0-openjdk-headless
    rpm -e --nodeps java-1.7.0-openjdk
    rpm -e --nodeps java-1.7.0-openjdk-headless
    rpm -qa|grep openjdk
  • 下面开始正式安装 jdk8,在官网下载 jdk 安装压缩包(以 .tar.gz 结尾)

    image-20201216222717629

  • 在 /usr 目录下建一个 java 文件夹,把下载的安装包放到此文件夹中,并解压

    1
    2
    3
    4
    mkdir /usr/java
    # 通过ftp工具将下载的安装包放入/usr/java文件夹中
    cd /usr/java
    tar -zxvf jdk-8u291-linux-x64.tar.gz
  • 配置环境变量,编辑 /etc/profile 文件

    1
    vim /etc/profile
  • 在文件最后加入下面内容,保存退出

    1
    2
    3
    4
    5
    # JDK的环境变量
    JAVA_HOME=/usr/java/jdk1.8.0_291
    PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME
    export PATH
  • 刷新配置使文件生效

    1
    source /etc/profile
  • 查看 jdk 是否安装成功

    1
    2
    3
    4
    5
    java -version
    # 若屏幕输出以下内容,即安装成功
    java version "1.8.0_291"
    Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

十三. 虚拟机安装

1. 安装 CentOS

  • 点击创建新的虚拟机

    image-20210508140557675

  • 选择自定义(高级),然后点击下一步

    image-20210508144632653
  • 点击下一步

    image-20210508151647091
  • 选择稍后安装操作系统,然后点击下一步

    image-20210508151707358
  • 选择操作系统为 linux,版本为 CentOS 7 64 位,然后点击下一步

    image-20210508151750786
  • 设置虚拟机名称和位置,然后点击下一步

    image-20210508151952271
  • 设置虚拟机的 CPU 数量与内核数量,然后点击下一步

    image-20210508152030682
  • 设置虚拟机的内存大小,然后点击下一步

    image-20210508152009611
  • 设置虚拟机的网络连接类型,然后点击下一步

    image-20210508152040538
  • 后面三步,直接点击下一步

  • 设置虚拟机的磁盘大小,然后点击下一步

    image-20210508152109019
  • 点击下一步

    image-20210508152149592
  • 点击完成,等待安装

    image-20210508152136578
  • 设置虚拟机镜像

    image-20210508153112368
  • 点击开启此虚拟机

  • 使用上下键,选择第一项 Insatll CentOS 7,然后按回车

    image-20210508152611793
  • 选择语言为简体中文,然后点击继续

    image-20210508153303801
  • 点击软件安装

    image-20210508153349358
  • 选择 GNOME 桌面,然后勾选开发工具,接着点击完成

    image-20210508153506973
  • 点击安装位置

    image-20210508153553811
  • 选择我要配置分区,然后点击完成

    image-20210508153650481
  • 点击+号,依次配置分区

    image-20210508153924316 image-20210508153837224 image-20210508154016360 image-20210508154407703 image-20210508154142104 image-20210508154257662
  • 点击完成,然后在弹出窗口点击接受更改

    image-20210508154756623
  • 点击 Kdump,将其禁用

    image-20210508154612785 image-20210508154651615
  • 点击网络与主机名,将网络打开

    image-20210508155240649 image-20210508154843040
  • 点击开始安装

    image-20210508155258056
  • 点击 ROOT 密码,然后给 Root 设置一个密码,

    image-20210508155435164 image-20210508155333256
  • 点击创建用户

    image-20210508155558900 image-20210508155633032
  • 安装完毕后,点击重启即可

    image-20210508160721784

2. 快速克隆 CentOS

注意:被克隆的操作系统需要先关机

  • 选择要被克隆的系统,右键选择管理–>克隆

    image-20210508155942780
  • 点击下一步

    image-20210508160807699
  • 点击下一步

    image-20210508160840429
  • 选择创建完整克隆,然后点击下一步

    image-20210508160915487
  • 设置要克隆虚拟机名称和位置,然后点击完成即可

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