# linux_learning **Repository Path**: sun81911/linux_learning ## Basic Information - **Project Name**: linux_learning - **Description**: Linux知识点复习 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2020-06-12 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 目录结构 ### 介绍 Linux 的文件系统是采用**级层式的树状目录结构**,在此结构中的最上层是根目录`/`,然后在此目录下再创建其他的目录 在 Linux 世界里,一切皆文件,即使是一个硬件设备,也是使用**文本**来标志 ### 具体目录说明 1. /bin:是 Binary 的缩写,这个目录存放着最经常使用的命令 2. /sbin:S 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序 3. /home:存放普通用户的主目录,在 Linux 中每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的 4. /root:该目录为系统管理员,也称作超级权限者的用户主目录 5. /lib:系统开机所需要最基本的动态连接共享库,几乎所有的应用程序都需要用到这些共享库 6. /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件 7. /etc:所有的系统管理所需要的配置文件和子目录 8. /usr:用户的很多应用程序和文件都放在这个目录下 9. /boot:存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件 10. /proc:这个目录是一个虚拟的目录,它是系统内存的映射,访回这个目录来获取系统信息 11. /srv:Service 缩写,该目录存放一些服务启动之后需要提取的数据 12. /sys:这是 Linux 2.6 内核的一个很大的变化,该目录下安装了 2.6 内核中新出现的一个文件系统 13. /tmp:这个目录是用来存放一些临时文件的 14. /dev:把所有的硬件用文件的形式存储 15. /media:Linux 系统会自动识别一些设备,例如 U 盘、光驱等等,识别后Linux 会把识别的设备挂载到这个目录下 16. /mnt:系统提供该目录是为了让用户临时挂载别的文件系统,可以将外部的存储挂载在/mnt上,然后进入该目录就可以查看里面的内容 17. /opt:这是给主机额外安装软件所摆放的目录,默认为空 18. /usr/local:这是另一个给主机额外安装软件所安装的目录,一般是通过**编译源码**方式安装的程序 19. /var:这个目录中存放着在不断扩充着的东西,习惯将经常被修改的目录放在这个目录下,包括各种日志文件 20. /selinux:SELinux 是一种安全子系统它能控制程序只能访回特定文件 #### 小结 在 Linux 中,目录结构有且只有一个根目录 `/` ,其他的目录都是在 `/` 目录分支 在 Linux 中,所有的设备都可以通过文件来体现,**字符设备文件**如键盘和鼠标,**块设备文件**如硬盘 ## Vi 和 Vim 编辑器 ### 介绍 所有的 Linux 系统都会内建 **Vi 文本编辑器** Vim 具有程序编辑的能力,是 Vi 的增强版本,可以主动的以字体颜色辨别语法的正确性, 方便程序设计,代码补全、编译及错误跳转等方便编程的功能 ### 模式 ![](imgs/vivim模式.png) 1. **一般模式/正常**:使用vi或vim命令打开一个文本文件时,即进入了一般模式 2. **编辑模式/插入模式**:从一般模式中按`i`或`a`即可进入编辑模式,按`esc`即可退出编辑模式至一般模式 3. **命令模式**:从一般模式中按`:`或`/`即可进入命令模式,其中`/`命令用于文本检索,此时使用`q`等命令可以退出编辑器,若按`esc`即可回到一般模式 ### 快捷键 1. **复制** `yy`:复制1行,若前面带数字,如`5yy`即为复制5行 `p`:粘贴 2. **删除** `dd`:删除1行,若前面带数字,如`5dd`即为删除5行 3. **查找** 在命令模式下,使用`/`进行文本检索,如查找hello为`/hello` 此时按`n`查找下一个,按`shift + n`查找上一个 4. **行号** 使用`:set nu`设置文件的行号 使用`:set nonu`取消文件的行号 5. **跳转** 一般模式下,使用`shift + g`到达文档末尾,使用`gg`到达文本首行 6. **撤回** 在一般模式下,按`u`撤销上一个操作,如输入了`hello`单词,按`u`撤销该操作 7. **新增一行** 在一般模式下,按`o`可在光标所在当前行的下方新增一列空行 ## 关机、重启与用户登录注销 ### 关机 立即关机 ```shell # 方式一 shutdown -h now # 方式二 halt ``` 延时关机 ```shell # 1分钟后关机 shutdown -h 1 ``` ### 重启 立即重启 ```shell # 方式一 shutdown -r now # 方式二 reboot ``` 延时重启 ```shell # 2分钟后重启 shutdown -r 2 ``` 在重启和关机前,通常需要先**把内存的数据写入磁盘** ```shell sync ``` ### 用户的登录和注销 登录时尽量少用 root 帐号登录,因为它是系统管理员,最大的权限,避免操作失误 可以利用普通用户登录,登录后再用 `su - 用户名` 命令来切换成系统管理员身份 **注销** ```shell # 方式一 logout # 方式二 exit ``` **注意**:注销指令在**图形运行级别**无效,在运行级别 3 下有效 ## 用户管理 ### 介绍 Linux 系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统 ### 添加用户 **基本语法** ```shell useradd 用户名 ``` **示例** 添加用户xiaoming ```shell useradd xiaoming ``` 细节:当创建用户成功后,会自动的创建和用户同名的家目录`/home/xiaoming` 可以通过 `useradd -d` 指定目录,例如新的用户名`jack`,给新创建的用户指定家目录 ```shell useradd -d /home/skycat jack ``` ### 指定/修改密码 **基本语法** ```shell passwd 用户名 ``` 注意:如果没有带用户名,则是给「当前」登录的用户修改密码 **示例** 给 xiaoming 指定密码 ```shell passwd xiaoming ``` ### 删除用户 **基本语法** ```shell userdel 用户名 ``` **示例** 删除用户 xiaoming,但是要保留家目录 ```shell userdel xiaoming ``` 删除用户以及用户主目录 ```shell userdel -r xiaoming ``` ### 查询用户信息 **基本语法** ```shell id 用户名 ``` **示例** 查询 root 信息 ```shell id root ``` 细节:当用户不存在时,返回无此用户 ### 切换用户 在操作 Linux 中,如果当前用户的权限不够,可以通过 `su -` 指令,切换到高权限用户,比如 root **基本语法** ```shell su - 目标用户名 ``` **示例** 创建一个用户 milan,指定密码,然后切换到 milan ```shell # 新增用户 useradd milan # 指定密码 passwd milan # 切换用户 su - milan ``` **补充** 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要 当需要返回到原来用户时,使用 `exit` 指令 如果 `su -` 没有带用户名,则**默认切换到 root 用户** ```shell su - ``` ### 用户组 类似于角色,系统可以对有共性的多个用户进行统一的管理 #### 新增组 **基本语法** ```shell groupadd 组名 ``` **示例** 增加 wudang ``` groupadd wudang ``` ##### 增加用户时直接加上组 **基本语法** ```shell useradd -g 用户组 用户名 ``` **示例** 增加一个用户 zwj,直接将他指定到 wudang ```shell useradd -g wudang zwj ``` #### 删除组 **基本语法** ``` groupdel 组名 ``` **示例** 删除 wudang 组 ```shell groupdel wudang ``` **注意**:这个组没有用户时,才能删除 #### 修改用户组 **基本语法** ```shell usermod -g 新的组名 用户名 ``` **示例** 创建一个shaolin组,让将zwj 用户修改到shaolin ```shell usermod -g shaolin zwj ``` ### 用户和组的相关文件 #### /etc/passwd 用户 user 的配置文件,记录用户的各种信息 ![](imgs/passwd文件内容.png) 每行的含义:`用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell` #### /etc/shadow 口令的配置文件 ![](imgs/shadow文件内容.png) 每行的含义:`登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留` #### /etc/group 组 group 的配置文件,记录Linux包含的组的信息 ![](imgs/group文件内容.png) 每行含义:`组名:口令:组标识号:组内用户列表` ## 系统指令 ### 指定运行级别 **基本介绍** | 级别 | 说明 | | ----- | -------------------------------------------------- | | 0 | 关机 | | 1 | 单用户,类似安全模式,此模式可以帮助找回 root 密码 | | 2 | 多用户状态没有网络服务 | | **3** | **多用户状态有网络服务** | | 4 | 系统未使用保留给用户 | | **5** | **图形界面** | | 6 | 系统重启 | **示例** 通过 init 来切换不同的运行级别,比如 3 -> 0 关机 ```shell init 0 ``` ### 帮助指令 #### man 指令 获得帮助信息 **基本语法** ```shell man 命令或配置文件 ``` **示例** 查看ls命令的帮助信息 ```shell man ls ``` **细节**:按`q`退出 #### help 指令 获得 shell 内置命令的帮助信息 **基本语法** ```shell help 命令 ``` **示例** 看cd命令的帮助信息 ```shell help cd ``` ``` cd: cd [-L|[-P [-e]]] [dir] Change the shell working directory. Change the current directory to DIR. The default DIR is the value of the HOME shell variable. The variable CDPATH defines the search path for the directory containing DIR. Alternative directory names in CDPATH are separated by a colon (:). A null directory name is the same as the current directory. If DIR begins with a slash (/), then CDPATH is not used. If the directory is not found, and the shell option `cdable_vars' is set, the word is assumed to be a variable name. If that variable has a value, its value is used for DIR. Options: -L force symbolic links to be followed -P use the physical directory structure without following symbolic links -e if the -P option is supplied, and the current working directory cannot be determined successfully, exit with a non-zero status The default is to follow symbolic links, as if `-L' were specified. Exit Status: Returns 0 if the directory is changed, and if $PWD is set successfully when -P is used; non-zero otherwise. ``` ### 文件和目录相关指令 #### pwd 指令 **基本语法** ```shell pwd ``` **示例** 显示当前工作目录的绝对路径 ```shell pwd ``` #### ls 指令 **基本语法** ```shell ls 选项 目录或是文件 ``` **常用选项** | 选项 | 作用 | | ---- | ------------------------------------------ | | -a | 显示当前目录所有的文件和目录,包括隐藏文件 | | -l | 以列表的方式显示信息 | | -h | 显示文件大小时,以 kb, mb, gb 单位显示 | **示例** 查看当前目录的所有内容信息 ```shell ls -lha ``` 查看/root目录的所有内容信息 ```shell ls -lha /root ``` #### cd 指令 **基本语法** ```shell cd 参数 ``` **示例** 使用绝对路径切换到/root目录 ```shell cd /root ``` 回到当前目录的上一级目录 ```shell cd .. ``` 回到家目录 ```shell cd ~ ``` #### mkdir 指令 mkdir指令用于创建目录 **基本语法** ```shell mkdir 选项 要创建的目录 ``` **常用选项** | 选项 | 作用 | | ---- | ------------ | | -p | 创建多级目录 | **示例** 创建一个目录 /home/dog ```shell mkdir /home/dog ``` 创建多级目录 /home/animal/tiger ```shell mkdir -p /home/animal/tiger ``` #### rmdir 指令 删除空目录 **基本语法** ```shell rmdir 选项 要删除的空目录 ``` **示例** 删除一个空目录 /home/dog ```shell rmdir /home/dog ``` **注意**:rmdir 删除的是空目录,如果目录下有内容时无法删除的 #### touch 指令 touch指令创建空文件,还可以更新文件的修改时间 **基本语法** ```shell touch 文件名称 ``` **示例** 创建一个空文件 hello.txt ```shell touch hello.txt ``` **细节**:如果文件存在,则表示刷新该文件的修改时间 #### cp 指令 拷贝文件到指定目录 **基本语法** ```shell cp 选项 源文件 目标文件 ``` **常用选项** | 选项 | 作用 | | ---- | ------------------ | | -r | 递归复制整个文件夹 | **示例** 将 /home/aaa.txt 拷贝到 /home/bbb 目录下 ```shell cp /home/aaa.txt /home/bbb ``` 将 /home 整个目录拷贝 /opt ```shell cp -r /home /opt ``` **细节**:强制覆盖不提示的方法,使用`\cp` ```shell \cp -r /home /opt ``` #### rm 指令 移除文件或目录 **基本语法** ```shell rm 选项 要删除的文件或目录 ``` **常用选项** | 选项 | 作用 | | ---- | ------------------ | | -r | 递归删除整个文件夹 | | -f | 强制删除不提示 | **示例** 将 /home/aaa.txt 删除 ```shell rm /home/aaa.txt ``` 递归删除整个文件夹 /home/bbb ```shell rm -r /home/bbb ``` **细节**:带上 -f 参数强制删除不提示 ```shell rm -rf /home/bbb ``` #### mv 指令 移动文件与目录或重命名 **基本语法** 重命名 ```shell mv oldNameFile newNameFile ``` 移动文件或目录 ```shell mv /temp/movefile /targetFolder ``` **示例** 将 /home/aaa.txt 文件 重新命名为 pig.txt ```shell mv /home/aaa.txt pig.txt ``` 将 /home/pig.txt 文件移动到 /root 目录下 ```shell mv /home/pig.txt /root ``` #### cat 指令 查看文件内容 **基本语法** ```shell cat 选项 要查看的文件 ``` **常用选项** | 选项 | 作用 | | ---- | -------- | | -n | 显示行号 | **示例** 输出 /ect/profile 文件内容,并显示行号 ```shell cat -n /etc/profile | more ``` **细节**:cat 只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令 `| more`,把cat 输出结果交给 more 处理 #### more 指令 一个基于VI编辑器的文本过滤器,以全屏幕的方式按页显示文本文件的内容 **基本语法** ```shell more 要查看的文件 ``` **示例** 采用more查看文件 ```shell more /etc/profile ``` **快捷键** | 操作 | 作用 | | ----- | ---------- | | 回车键 | 下翻一行 | | 空格键 | 下翻一页 | | q | 退出 | | ctrl + f | 向下滚动一屏 | | ctrl + b | 向上滚动一屏 | | = | 输出当前行的行号 | | :f | 输出文件名和当前行的行号 | #### less 指令 less指令用来分屏查看文件内容,它的功能与more指令类似,但是比more指令更加强大,支持各种显示终端 less指令在显示文件内容时,并不是一次将整个文件加载之后才显示,而是根据显示需要加载内容,对于显示大型文件具有较高的效率 **基本语法** ```shell less 要查看的文件 ``` **快捷键** | 操作 | 作用 | | ------- | ---------------------------------------------- | | 空格键 | 下翻一页 | | q | 退出 | | /字符串 | 向下搜寻字符串的功能,n: 向下查找,N: 向上查找 | | ?字符串 | 向上搜寻字符串的功能,n: 向上查找,N: 向下查找 | **示例** 采用less查看文件 ``` less /etc/profile ``` #### echo 指令 输出内容到控制台 **基本语法** ```shell echo 选项 输出内容 ``` **示例** 使用 echo 指令输出环境变量 PATH ```shell echo $PATH ``` **扩展内容** 查看系统的所有环境变量 ```shell env ``` 修改「系统」环境变量 ```shell vim /etc/profile ``` 修改「个人」环境变量 ```shell vim ~/.bash_profile ``` #### head 指令 用于显示文件的开头部分内容,默认情况下head指令显示文件的前10行内容 **基本语法** ```shell head 选项 文件 ``` **常用选项** | 选项 | 作用 | | ------- | -------------------------------------- | | -n 行数 | 查看文件头指定行数内容,可以是任意行数 | **示例** 查看 /etc/profile 的前面5行代码 ```shell head -n 5 /etc/profile ``` #### tail 指令 用于输出文件中尾部的内容,默认情况下tail指令显示文件的后10行内容 **基本语法** ```shell tail 选项 文件 ``` **常用选项** | 选项 | 作用 | | ------- | -------------------------------------- | | -n 行数 | 查看文件尾指定行数内容,可以是任意行数 | | -f | 实时追踪该文档的所有更新 | **示例** 查看 /etc/profile 最后5行的代码 ``` tail -n 5 /etc/profile ``` 实时监控 date.log ```shell tail -f date.log ``` #### \> 和 >> 指令 **介绍** \>:覆盖写 \>>:追加写 **示例** 将 /home 目录下的文件列表写入到 /home/info.txt 中 ```shell ls -l /home > /home/info.txt ``` **细节**:如果文件不存在,则会自动创建 将当前日历信息「追加」到 /home/mycal 文件中 ```shell date >> /home/mycal ``` #### ln 指令 软链接也成为符号链接,类似于windows里的快捷方式,主要存放了链接其他文件的路径 **基本语法** ```shell ln -s 原文件或目录 软链接名 ``` **示例** 在/home 目录下创建一个软连接 linkToRoot,连接到 /root 目录 ```shell ln -s /root linkToRoot ``` 删除软连接 linkToRoot ```shell rm -rf linkToRoot ``` **注意**:当使用pwd指令查看目录时,仍然看到的是软链接所在目录 ```shell cd linkToRoot ``` 此时已进入到/root目录 ```shell pwd ``` ```shell /home/linkToRoot ``` #### history 指令 查看已经执行过历史命令,也可以执行历史指令 **基本语法** ```shell history ``` **示例** 显示所有的历史命令 ```shell history ``` 显示最近使用过的10个指令 ```shell history 10 ``` 执行历史编号为5的指令 ```shell !5 ``` ### 时间日期类 #### date 指令 ##### 显示当前日期 **基本语法** ```shell date 时间格式 ``` **示例** 显示当前时间信息 ```shell date ``` 显示当前时间年月日 ```shell date "+%Y-%m-%d" ``` 显示当前时间年月日时分秒 ```shell date "+%Y-%m-%d %H:%M:%S" ``` ##### 设置最新时间 **基本语法** ```shell date -s 字符串时间 ``` **示例** 设置系统当前时间成 `2020-11-11 11:22:22` ```shell date -s "2020-11-11 11:22:22" ``` #### cal 指令 查看日历 **基本语法** ```shell cal 选项 月份 年份 ``` **示例** 显示当前月份日历 ```shell cal ``` 显示2012年9月的日历 ```shell cal 9 2012 ``` ### 搜索查找类 #### find 指令 将从指定目录向下递归地遍历其各个子目录,将满足条件的文件或者目录显示在终端 **基本语法** ```shell find 搜索范围 选项 ``` **选项说明** | 选项 | 作用 | | -------------- | ------------------------------------------------- | | -name 文件名 | 按照指定的文件名查找文件,可以使用通配符 `*`, `?` | | -user 用户名 | 查找属于指定用户名的所有文件 | | -size 文件大小 | 按照指定的文件大小查找文件 | **通配符规则** | 通配符 | 作用 | | ------ | -------------------------------------- | | * | 代表任意多个字符 | | ? | 代表一个字符 | | [ ] | 中间为字符组合,仅匹配其中任意一个字符 | **示例** 根据文件名称查找 /home 目录下的hello.txt文件 ```shell find /home -name hello.txt ``` 查找/opt目录下,所属用户名为 nobody 的文件 ```shell find /opt -user nobody ``` 查找整个系统下大于10M的文件 `+n 大于`, ` -n 小于`, `n 等于` ```shell find / -size +10M ``` #### locate 指令 locate指令可以快速定位文件路径,locate指令利用事先建立的系统中所有文件名称及路径的locate数据库,实现快速定位给定的文件,而无需遍历整个文件系统,查询速度较快 为了保证查询结果的准确度,必须定期更新locate时刻 **基本语法** ```shell locate 搜索文件 ``` **注意** 由于locate指令基于数据库进行查询,所以第一次运行前,必须使用`updatedb`指令创建locate数据库 如果未找到updtedb命令,则需‎要先用`yum install mlocate`安装`mlocate` **示例** 使用 locate 指令快速定位 hello.txt 文件所在目录 ```shell locate hello.txt ``` #### grep 指令和管道符号 grep 指令表示过滤查找 管道符 `|` 表示将前一个命令的处理结果输出传递给后面的命令处理 **基本语法** ```shell grep 选项 查找内容 源文件 ``` **常用选项** | 选项 | 作用 | | ---- | ---------------- | | -n | 显示匹配行及行数 | | -i | 忽略字母大小写 | **示例** 在 /etc/profile 文件中,查找"if"所在行,并且显示行号,忽略大小写 ```shell grep -ni "if" /etc/profile ``` 查看当前服务器有没有 sshd 服务在监听 ```shell netstat -anp | grep sshd ``` ### 压缩和解压类 #### gzip/gunzip 指令 gzip 用于压缩文件,gunzip 用于解压文件 **基本语法** 压缩文件,只能将文件压缩为`*.gz`文件 ```shell gzip 文件 ``` 解压缩文件 ```shell gunzip 文件.gz ``` **示例** 将 /home下的 hello.txt文件进行压缩 ```shell gzip /home/hello.txt ``` 将 /home下的 hello.txt.gz 文件进行解压缩 ```shell gunzip /home/hello.txt.gz ``` #### zip/unzip 指令 zip 用于压缩文件,unzip 用于解压 **基本语法** 压缩文件和目录 ```shell zip 选项 xxx.zip 需要压缩的内容 ``` 解压缩文件 ```shell unzip 选项 xxx.zip ``` **常用选项** | 选项 | 作用 | | ----------------- | ------------------------ | | zip -r | 递归压缩,压缩目录 | | unzip -d 存放目录 | 指定解压后文件的存放目录 | **示例** 将 /home下的所有文件进行压缩成 mypackage.zip ```shell zip -r mypackage.zip /home ``` 将 mypackge.zip 解压到 /opt/tmp 目录下 ```shell unzip -d /opt/tmp mypackage.zip ``` **细节**:若 /opt/tmp 不存在,会自动创建 #### tar 指令 可以压缩和解压,打包后的文件是 `.tar.gz` 的文件 **基本语法** 打包压缩 ```shell tar 选项 xxx.tar.gz 待打包的内容/目录 ``` 解压缩 ```shell tar 选项 xxx.tar.gz -C 解压缩路径 ``` **选项说明** | 选项 | 作用 | | ---- | -------------------- | | -c | 产生.tar打包文件 | | -v | 显示详细信息 | | -f | 指定打包后的文件名称 | | -z | 打包同时压缩 | | -x | 解包.tar文件 | **示例** 压缩多个文件,将 /home/a1.txt 和 /home/a2.txt 压缩成 a.tar.gz ```shell tar -zcvf a.tar.gz /home/a1.txt /home/a2.txt ``` 将 /home 的文件夹 压缩成 myhome.tar.gz ```shell tar -zcvf myhome.tar.gz /home ``` 将 a.tar.gz 解压到当前目录 ```shell tar -zxvf a.tar.gz ``` 将 myhome.tar.gz 解压到 /opt/tmp2 目录下 ```shell tar -zxvf myhome.tar.gz -C /opt/tmp2 ``` **注意**:/opt/tmp2 事先需要存在 ## 组管理和权限管理 ### 组基本介绍 在Linux中的每个用户必须属于一个组,不能独立于组外 在Linux中每个文件有所有者、所在组、其它组的概念 **概念分析** 1. 在 Linux 中,一个用户属于一个组 2. 当创建一个用户后,默认会在/home/xxx创建一个和用户名相同的目录,该目录就是用户家目录 3. 当用户登陆后,会切换到/home/xxx目录 4. 一个用户默认不能进入其他用户的家目录 5. 用户权限体现在对文件的操作 ### 文件/目录的所有者 一般为文件的创建者 #### 查看文件的所有者 可以通过 ```shell ls -lha ``` 进行查看文件的详细信息 #### 修改文件所有者 **基本语法** ```shell chown 用户名 文件名 ``` **示例** 使用 root 创建一个文件apple.txt,然后将其所有者修改成 tom ```shell chown tom apple.txt ``` ### 文件/目录的所在组 #### 修改文件所在的组 **基本语法** ```shell chgrp 组名 文件名 ``` **示例** 使用root用户创建文件 orange.txt,将这个文件所在组修改到 police 组 ```shell chgrp police orange.txt ``` #### 改变用户所在组 在添加用户时,可以指定将该用户添加到哪个组中,同样的用root的管理权限可以改变某个用户所在的组 **基本语法** 改变用户所在组 ```shell usermod -g 组名 用户名 ``` 改变用户登陆的初始目录 ```shell usermod -d 目录名 用户名 ``` **示例** 创建一个bandit组,将 tom 用户从原来所在的police组,修改到 bandit 组 ```shell usermod -g bandit tom ``` ### 权限基本介绍 **文件详细信息** ``` -rw-r--r--. 1 root root 0 5月 27 15:19 hello.txt ``` **信息说明** 1. 第 `0` 位确定文件类型 1. `-`:普通文件 2. `d`:目录 3. `l`:连接文件 4. `c`:字符设备文件,如键盘鼠标 5. `b`:块设备文件,如硬盘 2. 第 `1-3` 位确定文件所有者拥有该文件的权限 1. `r`:读权限 2. `w`:写权限 3. `x`:执行权限 3. 第 `4-6` 位确定所属组,同组用户拥有该文件的权限 4. 第 `7-9` 位确定其他组用户拥有该文件的权限 5. 第 `10` 位如果是「文件」,表示硬链接的数目;如果是「目录」,则表示有多少个子目录 6. 第 `11` 位,用户名 7. 第 `12` 位,用户所在组 8. 第 `13` 位文件大小,如果是目录,则统为 `4096` 9. 第 `14` 位文件最后修改时间 10. 第 `15` 位文件名 ### 权限分析 **对于文件而言** 1. `r` 代表可读 read,可以读取查看 2. `w` 代表可写 write,可以修改但是不代表可以删除该文件 删除一个文件的前提条件是**对该文件所在的目录**有写权限,オ能删除该文件 3. `x` 代表可执行 execute,可以被执行 **对于目录而言** 1. `r` 代表可读 read,可以读取,ls 查看目录内容 2. `w` 代表可写 write,可以修改,在目录内进行创建、删除和重命名目录 3. `x` 代表可执行 execute,可以进入该目录 ### 修改文件权限 通过 chmod 指令,可以修改文件或者目录的权限 **方式一:+、-、= 变更权限** u:所有者 g:所有组 o:其他人 a:所有人 (u、g、o 的总和) **基本语法** 给所有者读写执行权限,给所在组的用户读写权限,给其他人执行权限 ```shell chmod u=rwx,g=rx,o=x 文件/目录 ``` 给其它用户增加写的权限 ```shell chmod o+w 文件/目录 ``` 给所有用户去掉执行权限 ```shell chmod a-x 文件/目录 ``` **示例** 给 abc 文件的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限 ```shell chmod u=rwx,g=rx,o=rx abc ``` 给 abc 文件的所有者除去执行的权限,增加组写的权限 ```shell chmod u-x,g+w abc ``` 给 abc 文件的所有用户添加读的权限 ```shell chmod a+r abc ``` **方法二:数字变更权限** 1. `r`=4 2. `w`=2 3. `x`=1 4. `rwx`=4+2+1=7 `chmod u=rwx,g=rx,o=x 文件/目录` 相当于 `chmod 751 文件/目录` **示例** 将 /home/abc.txt 文件的权限修改成 `rwxr-xr-x` ```shell chmod 751 /home/abc.txt ``` ### 修改文件所有者 **基本语法** 改变文件的所有者 ```shell chown 选项 newowner file ``` 改变文件的所有者和所有组 ```shell chown 选项 newowner:newgroup file ``` **常用选项** | 选项 | 作用 | | ---- | -------------------------------------- | | -R | 使指定目录其下所有子文件或目录递归生效 | **示例** 请将 /home/abc.txt 文件的所有者修改成 tom ```shell chown tom /home/abc.txt ``` 请将 /home/kkk 目录下所有的文件和目录的所有者都修改成 tom ```shell chown -R tom /home/kkk ``` 将home下的所有文件和目录的所有者都改成 tom,将所在组改成 police ```shell chown -R tom:police /home ``` ### 修改文件所在组 **基本语法** ```shell chgrp newgroup file ``` **示例** 将 /home/abc.txt 文件的所在组修改成 shaolin ```shell chgrp shaolin /home/abc.txt ``` 将 /home/kkk 目录下所有的文件和目录的所在组都修改成 shaolin ```shell chgrp -R shaolin /home/kkk ``` ## 定时任务调度 ### crond 任务调度 crontab 进行定时任务的设置 **概述** 任务调度是指系统在某个时间执行的特定的命令或程序 **任务调度分类** 1. 系统工作,有些重要的工作必须周而复始地执行,如病毒扫描等 2. 个别用户工作,个别用户可能希望执行某些程序,比如对mysql数据库的备份 **基本语法** ```shell crontab 选项 ``` **常用选项** | 选项 | 作用 | | ---- | ------------------------------- | | -e | 编辑crontab定时任务 | | -l | 查询crontab定时任务 | | -r | 删除当前用户所有crontab定时任务 | **示例** 每分钟执行 `ls -l /etc > /tmp/to.txt` 命令 ```shell */1 * * * * ls -l /etc > /tmp/to.txt ``` **参数说明** | 项目 | 含义 | 范围 | | ------- | ---- | --------------------- | | 第1个 * | 分钟 | 0~59 | | 第2个 * | 小时 | 0~23 | | 第3个 * | 日 | 1~31 | | 第4个 * | 月 | 1~12 | | 第5个 * | 星期 | 0~7,0和7都代表星期天 | **符号说明** | 符号 | 含义 | | ---- | ------------------------------------------------------------ | | * | 代表任何时间,比如第1个*,就代表每小时每分钟都执行1次 | | , | 代表不连续的时间,如`0 8,12,16 * * *` 命令,代表在每天的8:00, 12:00, 16:00都执行命令 | | - | 代表连续的时间范,如`0 5 * * 1-6` 命令,代表在周一到周六的5:00执行命令 | | */n | 代表每隔多久执行一次,如`*/10 * * * *` 命令,代表每隔10 分钟执行命令 | ## 磁盘分区、挂载 ### 分区基本知识 **mbr 分区** 1. 最多支持四个主分区 2. 系统只能安装在主分区 3. 扩展分区要占一个主分区 4. MBR最大只支持2TB,但拥有最好的兼容性 **gtp 分区** 1. 理论支持无限多个主分区,但操作系统可能限制,比如 windows下最多128个分区 2. 最大支持18EB的大容量 ### Linux 分区 #### 原理介绍 Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分 Linux采用了挂载 mount 的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这时要载入的分区将使它的存储空间在一个目录下获得 #### 硬盘说明 Linux硬盘分IDE硬盘和SCSI硬盘 **对于IDE硬盘** 驱动器标识符为 `hdx~` 其中`hd`表明分区所在设备的类型,这里是指IDE硬盘了 `x`为盘号,a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘 `~`代表分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区 **例如** `hda3` 表示为第1个IDE硬盘上的第3个主分区或扩展分区 `hdb2` 表示为第2个IDE硬盘上的第2个主分区或扩展分区 **对于SCSI硬盘** 驱动器标识符为`sdx~` SCSI硬盘是用`sd`来表示分区所在设备的类型的 其余则和IDE硬盘的表示方法一样 **例如** `sdb1` 表示第2块scsi 硬盘的第1个主分区或扩展分区 #### 查看所有设备挂载情况 **命令** ```shell # 方式一 lsblk # 方式二 lsblk -f ``` #### 新增硬盘步骤 1. 增加一块硬盘 2. 重启服务器 3. 通过`lsblk`查看新增的硬盘 4. 通过 `fdisk /dev/sdb` 给 `sdb` 硬盘分区 5. 开始分区后,输入 `n`,选择新増分区 然后选择 `p`,分区类型为主分区 2次「回车」默认剩余全部空间 最后输入 `w` 写入分区并退出,若不保存退出输入 q 6. 通过 `mdfs -t ext4 /dev/sdb1` 格式化 `sdb1` 7. 通过 `mkdir /home/newdisk` 创建要挂载的文件目录 1. 方式一:临时挂载 1. 通过 `mount /dev/sdb1 /home/newdisk` 将硬盘分区挂载到 `/home/newdisk` 目录下 **注意**:挂载时不要位于 /home/newdisk 目录中 重启系统时,挂载的关系失效 2. 方式二:永久挂载 1. 通过 `vim /etc/fstab` 配置Linux的分区表 ``` /dev/sdb1 /home/newdisk ext4 defaults 0 0 ``` 2. 通过 `mount -a` 启用自动挂载 #### 卸载硬盘分区 **基本语法** ```shell umount 设备名 挂载路径 ``` **示例** 卸载 /dev/sdb1 硬盘分区 ```shell umount /dev/sdb1 ``` ### 磁盘情况查询 #### 查询系统整体磁盘使用情况 **基本语法** ```shell df -h ``` **示例** 查询系统整体磁盘使用情况 ```shell df -h ``` #### 查询指定目录磁盘占用情况 **基本语法** 查询指定目录的磁盘占用情况,默认为当前目录 ```shell du 选项 目录 ``` **选项说明** | 选项 | 作用 | | ------------- | ------------------------ | | -s | 指定目录占用大小汇总 | | -h | 带计量单位 | | -a | 含文件 | | --max-depth=1 | 子目录深度 | | -c | 列出明细的同时增加汇总值 | **示例** 查询 /usr 目录的磁盘占用情况,深度为1 ```shell du -hac --max-depth=1 /usr ``` ## 网络配置 ### 网络环境配置 #### 配置网络静态IP 1. 通过`ifconfig`命令查看网卡名称 ``` enp0s3: flags=4163 mtu 1500 inet6 fe80::1d39:2448:19ee:a5e5 prefixlen 64 scopeid 0x20 ether 08:00:27:72:80:59 txqueuelen 1000 (Ethernet) RX packets 1528 bytes 102035 (99.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 182 bytes 25962 (25.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73 mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 loop txqueuelen 1000 (Local Loopback) RX packets 32 bytes 2592 (2.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 32 bytes 2592 (2.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` 2. 定位到`cd /etc/sysconfig/network-scripts` 3. 此时找到名为`enp0s3`的网卡配置`ifcfg-enp0s3` 4. 编辑配置文件`vim ifcfg-enp0s3`,修改并加入 ``` # 静态IP BOOTPROTO=static # 自启 ONBOOT=yes # IPv4地址 IPADDR=192.168.31.100 # 子网掩码 NETMASK=255.255.255.0 # 网关 GATEWAY=192.168.31.1 # 主DNS服务器,此为阿里的DNS DNS1=223.5.5.5 ``` 5. 保存退出,重启网络服务`service network restart` #### 修改主机名 查看当前主机名 ```shell hostname ``` 修改主机映射文件 ```shell vim /etc/hostname ``` ``` mylinux ``` **注意**:主机名称不要有`_`下划线 修改 `/etc/hosts` 增加ip和主机的映射 ```shell vim /etc/hosts ``` ``` 192.168.31.100 mylinux ``` 保存退出,重启生效 ## 进程管理 ### 基本介绍 在Linux中,每个执行的程序/代码都称为一个进程,每一个进程都分配一个ID号 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,例如 www服务器 每个进程都可能以两种方式存在,前台与后台 1. 前台进程就是用户目前的屏幕上可以进行操作的 2. 后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行,例如 sshd, crond 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,直到关机才才结束 ### 显示系统执行进程 **基本语法** ```shell ps 选项 ``` **常用选项** | 选项 | 作用 | | ---- | ---------------------------------------- | | -a | ‎显示当前终端所有进程信息 | | -u | 以用户的格式显示进程信息 | | -x | ‎显示进程运行参数 | | -ef | ‎以全格式显示当前所有进程,可以查看父进程 | **示例** 显示所有的进程 ```shell ps -aux ``` 查看sshd进程 ```shell ps -aux | grep sshd ``` **进程列表分析** ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2 0.0 0.0 0 0 ? S 13:01 0:00 [kthreadd] ``` 1. USER:用户名称 2. PID:进程号 3. %CPU:进程占用CPU的百分比 4. %MEM:进程占用物理内存的百分比 5. VSZ:进程占用的虚拟内存大小,单位kb 6. RSS:程占用的物理内存大小,单位kb 7. TTY:终端名称 8. STAT:进程状态 S 睡眠,进程是会话的先导进程 N 进程拥有比普通优先级更低的优先级 R 正在运行 D 短期等待 Z 僵死进程 T 被跟踪或者被停止等等 9. START:进程的启动时间 10. TIME:CPU时间,即进程使用CPU的总时间 11. COMMAND:启动进程所用的命令和参数,如果过长会被截断显示 ### 终止进程 **介绍** 若是某个进程执行一半需要停止时,或是已消了很大的系统资源时,此时可以考虑停止该进程 使用 kill 命令来完成此项任务 **基本语法** 通过进程号杀死进程 ```shell kill 选项 进程号 ``` 通过进程名称杀死进程,也支持通配符 ```shell killall 进程名称 ``` **常用选项** | 选项 | 作用 | | ---- | ---------------- | | -9 | 强迫进程立即停止 | **示例** 终止远程登录服务sshd ```shell ps -aux | grep "sshd" ``` ``` root 985 0.0 0.2 112920 4316 ? Ss 13:01 0:00 /usr/sbin/sshd -D root 1461 0.0 0.2 158924 5616 ? Ss 13:01 0:00 sshd: root@pts/0 root 1680 0.0 0.0 112728 972 pts/0 R+ 17:29 0:00 grep --color=auto sshd ``` ```shell kill -9 985 ``` 终止多个gedit 编辑器 ```shell killall gedit ``` ### 查看进程树 **基本语法** ```shell pstree 选项 ``` **常用选项** | 选项 | 作用 | | ---- | ------------------ | | -p | 显示进程的PID | | -u | 显示进程的所属用户 | **示例** 树状的形式显示进程的pid ```shell pstree -pu ``` **补充**:若找不到 pstree 命令,则可以通过 `yum install -y psmisc` 命令安装 ### 服务管理 **介绍** 服务本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如 mysql, sshd, 防火墙等,因此又称为「守护进程」 **管理指令** ```shell service 服务名 start|stop|restart|reload|status ``` **补充**:在CentOS 7.0后 不再使用service,而是 systemctl **示例** 查看当前防火墙的状况,关闭防火墙和重启防火墙 ```shell service firewalld status ``` ```shell service firewalld stop ``` ```shell service firewalld restart ``` 设置防火墙服务自启动关闭永久生效 ```shell systemctl disable firewalld ``` ### 动态监控进程 **介绍** top与ps命令很相似,它们都用来显示正在执行的进程 top与ps最大的不同之处在于,top在执行一段时间可以更新正在运行的的进程,默认每 3 秒变化一次 **基本语法** ```shell top 选项 ``` **选项说明** | 选项 | 作用 | | --------- | -------------------------------------------- | | -d 秒数 | 指定 top 命令每隔几秒更新,默认是 3 秒 | | -i | 不显示任何闲量或者僵死运程 | | -p 进程id | 通过指定监控进程 ID 来仅仅监控某个进程的状态 | **交互操作说明** | 操作 | 功能 | | ---- | ------------------------------- | | P | 以 CPU 使用率排序,默认就是此项 | | M | 以内存的使用率排序 | | N | 以 PID 排序 | | q | 退出 | | u | 输入用户名,查看指定用户进程 | | k | 输入进程id,结束进程 | ### 监控网络状态 查看系统网络情况 **基本语法** ```shell netstat 选项 ``` **选项说明** | 选项 | 作用 | | ---- | ------------------ | | -an | 按一定顺序排列输出 | | -p | 显示哪个进程在调用 | **示例** 请查看服务名为 sshd 的服务的信息 ```shell netstat -anp | grep sshd ``` 查看当前系统有哪些端口在监听 ```shell netstat -tlnp ``` ## rpm和yum软件管理 ### rpm包管理 **介绍** 一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中,它生成具有`.rpm`扩展名的文件 RPM 是 RedHat Package Manager,RedHat软件包管理工具的缩写 ### rpm包查询 **基本语法** 查询所安装的所有 rpm 软件包 ```shell rpm -qa ``` 查询软件包是否安装 ```shell rpm -q 软件包名 ``` 查询软件包信息 ```shell rpm -qi 软件包名 ``` 查询软件包中的文件 ```shell rpm -ql 软件包名 ``` 查询文件所属的软件包 ```shell rpm -qf 文件路径 ``` **示例** 查询 mysql-community-server-5.7.29-1.el7.x86_64 是否安装 ```shell rpm -q mysql-community-server-5.7.29-1.el7.x86_64 ``` 查询 mysql-community-server-5.7.29-1.el7.x86_64 软件包信息 ```shell rpm -qi mysql-community-server-5.7.29-1.el7.x86_64 ``` 查询 mysql-community-server-5.7.29-1.el7.x86_64 软件包中的文件 ```shell rpm -ql mysql-community-server-5.7.29-1.el7.x86_64 ``` 查询 /etc/my.cnf 文件所属的软件包 ```shell rpm -qf /etc/my.cnf ``` ### rpm包卸载 **基本语法** ```shell rpm -e 包名称 ``` **示例** 删除 firefox 软件包 ```shell rpm -e firefox ``` **注意** 如果其它软件包依赖于要卸载的软件包,卸载时则会产生错误信息 如果就是要删除这个 rpm 包,可以增加参数` --nodeps` 强制删除 ```shell rpm -e --nodeps firefox ``` ### rpm包安装 **基本语法** ```shell rpm -ivh RPM包全路径名称 ``` **选项说明** | 选项 | 作用 | | ---- | ------------ | | -i | 安装 install | | -v | 提示 verbose | | -h | 进度条 hash | ### yum 使用 **介绍** yum 是一个 Shell 软件包管理器,基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包 **基本指令** 查询 yum 服务器是否有需安装的软件 ```shell yum list | grep "xxx" ``` 安装指定的 yum 包 ```shell yum install xxx ```