second commit

This commit is contained in:
cyl-sql 2021-06-12 09:21:56 +08:00
parent dabb10607c
commit f1ebc121ed
7 changed files with 922 additions and 970 deletions

View File

@ -1,18 +1,102 @@
# 1、什么是Linux
# 什么是Linux
> Linux全称GNU/Linux是一种免费使用和自由传播的[类UNIX](https://baike.baidu.com/item/类UNIX/9032872)操作系统,其内核由[林纳斯·本纳第克特·托瓦兹](https://baike.baidu.com/item/林纳斯·本纳第克特·托瓦兹/1034429)于1991年10月5日首次发布它主要受到[Minix](https://baike.baidu.com/item/Minix/7106045)和Unix思想的启发是一个基于[POSIX](https://baike.baidu.com/item/POSIX)的多用户、[多任务](https://baike.baidu.com/item/多任务/1011764)、支持[多线程](https://baike.baidu.com/item/多线程/1190404)和多[CPU](https://baike.baidu.com/item/CPU)的操作系统。它能运行主要的[Unix](https://baike.baidu.com/item/Unix/219943)工具软件、应用程序和网络协议。它支持[32位](https://baike.baidu.com/item/32位/5812218)和[64位](https://baike.baidu.com/item/64位)硬件。Linux继承了Unix以网络为核心的设计思想是一个性能稳定的多用户网络操作系统。Linux有上百种不同的发行版如基于社区开发的[debian](https://baike.baidu.com/item/debian/748667)、[archlinux](https://baike.baidu.com/item/archlinux/10857530),和基于商业开发的[Red Hat Enterprise Linux](https://baike.baidu.com/item/Red Hat Enterprise Linux/10770503)、[SUSE](https://baike.baidu.com/item/SUSE/60409)、[Oracle Linux](https://baike.baidu.com/item/Oracle Linux/6876458)等。
Linux全称为GNU/Linux是一种免费使用和自由传播的类UNIX操作系统我们常说的Linux指的是Linux内核一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
Linux现在已经是现代互联网体系中不可或缺的一部分了可能你看不见它但是它一直在你身边各种嵌入式设备如手表机器人。还有广为人之的安卓。地球上大多数的服务器都是Linux操作系统。从航天到军事、从科研到金融、从手机到电脑无处不在。
因其开源的特点Linux的发展速度以指数规模增长无数开发者加入到Linux开发的行列中来。本章简单概括一下Linux的优点和发展历史。
*************
# 一、为什么要使用Linux
Linux有以下众多特点
* **开源免费**
Linux是完全免费的操作系统并且开放源代码任何人都可以随意修改其源代码。
* **多用户、多任务**
Linux支持多用户各个用户对于自己的文件设备有自己特殊的权利保证了各用户之间互不影响。多任务则是现代电脑最主要的一个特点Linux可以使多个程序同时并独立地运行。
* **安全可靠**
Linux的代码是开源的所以每个人都可以参与进入修补漏洞。此外Linux的用户权限管理也使得安全风险降低
* **稳定**
Linux服务器一直以稳定性闻名可以持续运行很久都不易崩溃。
* **多平台**
Linux可以运行在多种硬件平台上x86arm及其他各种嵌入式设备。
*****************
以上几类特点是Linux内核的特点我们常说的Linux一般都是指其内核还有很多个人、社区或者企业都有根据Linux内核进行“改装”的发行版各种发行版的特点不同有的注重服务器性能有的注重图形系统。
在Linux那么多年的迅猛发展后Linux也产生了很多与内核无关的优点。例如
* **方便**
Linux的在线安装软件包工具非常方便一行命令即可将软件安装好环境配置非常方便快捷。
* **开源软件多**
大多数的开源软件的首要适配平台都是Linux所以在Linux有许多免费又开源的软件工具让你使用。
********************
# 二、发展历程
20世纪80年代计算机硬件的性能不断提高PC的市场不断扩大当时可供计算机选用的操作系统主要有Unix、DOS和macOC这几种。
Unix价格昂贵不能运行于PCDOS显得简陋且源代码被软件厂商严格保密MacOS是一种专门用于苹果计算机的操作系统。此时计算机科学领域迫切需要一个更加完善、强大、廉价和完全开放的操作系统。由于供教学使用的典型操作系统很少因此当时在荷兰当教授的美国人AndrewS.Tanenbaum编写了一个操作系统名为MINIX为了向学生讲述操作系统内部工作原理。
MINIX虽然很好但只是一个用于教学目的的简单操作系统而不是一个强有力的实用操作系统然而最大的好处就是公开源代码。全世界学计算机的学生都通过钻研MINIX源代码来了解电脑里运行的MINIX操作系统芬兰赫尔辛基大学大学二年级的学生Linus Torvalds就是其中一个。
在吸收了MINIX精华的基础上Linus于1991年写出了属于自己的Linux操作系统版本为Linux0.01是Linux时代开始的标志。他利用Unix的核心去除繁杂的核心程序改写成适用于一般计算机的x86系统并放在网络上供大家下载1994年推出完整的核心Version1.0至此Linux逐渐成为功能完善、稳定的操作系统并被广泛用。
# 三、常用发行版
1、**Debian**
老牌发行版,非常稳定,适合用于服务器。
## 1.1、为什么要使用Linux
2、**Ubuntu**
* 开源
* 多用户、多任务
*
Ubuntu是Debian的一款衍生版侧重于它在这个市场的应用在服务器、云计算、甚至一些运行Ubuntu Linux的移动设备上很常见。于2004年9月首次公布的。属于热门发行版之一因其图形界面开发较完善以及良好的社区支持很受初接触Linux的人群青睐。
## 推荐阅读
3、**CentOS**
CentOS 是一种对 RHELRed Hat Enterprise Linux源代码再编译的产物由于 Linux 是开发源代码的操作系统并不排斥样基于源代码的再分发CentOS 就是将商业的 Linux 操作系统 RHEL 进行源代码再编译后分发,并在 RHEL 的基础上修正了不少已知的漏洞。
4、**Fedora**
Fedora Linux第七版以前为Fedora Core是由Fedora项目社区开发、红帽公司赞助目标是创建一套新颖、多功能并且自由开放源代码的操作系统。Fedora是商业化的Red Hat Enterprise Linux发行版的上游源码。
5、**Kali**
Kali Linux是Debian的一款衍生版。旨在渗透测试和数字取证。它预先构建了用于渗透测试的多种工具。
6、**Arch**
Arch是一款采用滚动发行方式的操作系统只要安装一次就够了每当发行了某个新版本就可以升级发行版无需重新安装。Pacman是Arch Linux的软件包管理器。Arch Linux既支持X86处理器架构又支持X86_64架构安装程序可以从光盘或U盘来运行。
# 四、推荐阅读
有兴趣深入了解Linux以及自由软件开源历史的推荐阅读一下书籍
《只是为了好玩》
@ -22,3 +106,13 @@
《黑客与画家》
# 参考资料
[1] 刘振洪、吴敏凤Linux操作系统实用教程天津天津科学技术出版社2016
[2] https://baike.baidu.com/item/fedora/3293972?fr=aladdin

View File

@ -1,196 +0,0 @@
# Linux的安装
# 一、相关工具、版本简介
1. 虚拟机Oracle VM VirtualBox
2. Ubuntu版本20.04
3. Hadoop版本
# 二、创建虚拟机
成功安装Oracle VM VirtualBox后打开的页面如下
![1](./img/1.1.png)
在开始之前我们首先要准备好Ubuntu ISO镜像文件以便在虚拟机上安装Ubuntu操作系统。在这里我们选取的是`ubuntu-20.04.2.0-desktop-amd64.ios`。那么,具体的安装步骤,可以按照如下指引进行:
1. 新建一个虚拟机
![2](./img/1.2.png)
2. 虚拟机名称和系统类型
![1.3](./img/1.3.png)
3. 为虚拟机分配内存大小
![1.4](./img/1.4.png)
4. 虚拟硬盘的选择
![1.5](./img/1.5.png)
5. 虚拟硬盘文件的选择
![1.6](./img/1.6.png)
6. 存储物理硬盘的选择
![1.7](./img/1.7.png)
7. 虚拟机存放的位置以及虚拟硬盘的大小
![1.8](./img/1.8.png)
8. 设置完成后的界面
![1.9](./img/1.9.png)
# 三、Ubuntu系统的安装
1. 点击设置
![2.1](./img/2.1.png)
2. 设置我们准备好的镜像文件
![2.2](./img/2.2.png)
3. 上面步骤设置完成后返回第一步的在刚刚的【设置】旁边有个【启动】。单击【启动】按钮启动虚拟机。启动后就如下图所示我们可以在左边看到语言选择可以根据喜好选择系统的语言然后单击如图所示的【安装Ubuntu】
![2.3](./img/2.3.png)
4. Ubuntu的安装和更新我们不建议选择如图所示的选项这会为你自动更新系统
![2.4](./img/2.4.png)
5. 安装类型
![2.5](./img/2.5.png)
6. 系统分区
![2.6](./img/2.6.png)
7. 时区选择
![2.7](./img/2.7.png)
8. 用户名和密码的设置
![2.8](./img/2.8.png)
9. 设置完成后,就会进入自动安装的界面
![2.9](./img/2.9.png)
安装完成之后,会提示要重启虚拟机,以及需要输入一个`ENTER`进入。等以上步骤都顺利的完成之后就会显示一个登录界面那Ubuntu的安装就大功告成啦
![2.10](./img/2.10.png)
## 开源软件
# 软件安装
## deb格式
## 二进制格式
## 源码编译
# 生产效率
## 1.搜狗输入法
**1.首先安装fcitx**
在终端输入
```shell
sudo apt-get install fcitx
```
**2.进入搜狗输入法官网选择linux版下载deb文件(ubuntu系统)**
![image-20200901155326691](img/image-20200901155326691.png)
**3.打开设置选择区域与语言选择管理已安装的语言在“键盘输入法系统”选择fcitx**
![image-20200901155408460](img/image-20200901155408460.png)
**4.可能需要重启,再屏幕右上角选择搜狗输入法即可**
![image-20200901155855248](img/image-20200901155855248.png)
![image-20200901155908354](img/image-20200901155908354.png)
## 2.Terminator
terminator可以在同一个窗口分割出多个终端每个终端都是独立的适合大屏使用
![image-20200901170645779](img/image-20200901170645779.png)
# 开发工具
## 1.git
```shell
sudo apt-get install git
```
## 2.vim
**1.首先将vim的源码克隆下来这里因为github可能很慢使用码云的镜像**
```shell
git clone https://gitee.com/mirrors/vim.git
```
**2.安装gcc有则不必安装和各依赖库**
```shell
sudo apt-get install gcc
```
```powershell
sudo apt-get install libncurses5-dev python-dev python3-dev libatk1.0-dev libbonoboui2-dev libcairo2-dev libx11-dev libxpm-dev libxt-dev
```
**3.配置与安装**
```shell
sudo ./configure --with-features=huge --enable-multibyte --enable-rubyinterp --enable-pythoninterp --enable-python3interp --enable-luainterp --enable-cscope --enable-gui=gtk3 --enable-perlinterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ --prefix=/usr/local/vim8
```
--with-features=huge支持最大特性
--enable-rubyinterp打开对 ruby 编写的插件的支持
--enable-pythoninterp打开对 python 编写的插件的支持
--enable-python3interp打开对 python3 编写的插件的支持
--enable-luainterp打开对 lua 编写的插件的支持
--enable-perlinterp打开对 perl 编写的插件的支持
--enable-multibyte打开多字节支持可以在 Vim 中输入中文
--enable-cscope打开对cscope的支持
--enable-gui=gtk3 表示生成采用 GNOME3 风格的 gvim
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ 指定 python 路径
--with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ 指定 python3路径(这里可以根据自己的版本做更改)
--prefix=/usr/local/vim8指定将要安装到的路径

465
Linux/2.Linux安装.md Normal file
View File

@ -0,0 +1,465 @@
# Linux的安装
# 一、相关工具、版本简介
1. 虚拟机Oracle VM VirtualBox
2. Ubuntu版本20.04
# 二、创建虚拟机
成功安装Oracle VM VirtualBox后打开的页面如下
![1](./img/1.1.png)
在开始之前我们首先要准备好Ubuntu ISO镜像文件以便在虚拟机上安装Ubuntu操作系统。在这里我们选取的是`ubuntu-20.04.2.0-desktop-amd64.ios`。那么,具体的安装步骤,可以按照如下指引进行:
1. 新建一个虚拟机
![2](./img/1.2.png)
2. 虚拟机名称和系统类型
![1.3](./img/1.3.png)
3. 为虚拟机分配内存大小
![1.4](./img/1.4.png)
4. 虚拟硬盘的选择
![1.5](./img/1.5.png)
5. 虚拟硬盘文件的选择
![1.6](./img/1.6.png)
6. 存储物理硬盘的选择
![1.7](./img/1.7.png)
7. 虚拟机存放的位置以及虚拟硬盘的大小
![1.8](./img/1.8.png)
8. 设置完成后的界面
![1.9](./img/1.9.png)
# 三、Ubuntu系统的安装
1. 点击设置
![2.1](./img/2.1.png)
2. 设置我们准备好的镜像文件
![2.2](./img/2.2.png)
3. 上面步骤设置完成后返回第一步的在刚刚的【设置】旁边有个【启动】。单击【启动】按钮启动虚拟机。启动后就如下图所示我们可以在左边看到语言选择可以根据喜好选择系统的语言然后单击如图所示的【安装Ubuntu】
![2.3](./img/2.3.png)
4. Ubuntu的安装和更新我们不建议选择如图所示的选项这会为你自动更新系统
![2.4](./img/2.4.png)
5. 安装类型
![2.5](./img/2.5.png)
6. 系统分区
![2.6](./img/2.6.png)
7. 时区选择
![2.7](./img/2.7.png)
8. 用户名和密码的设置
![2.8](./img/2.8.png)
9. 设置完成后,就会进入自动安装的界面
![2.9](./img/2.9.png)
安装完成之后,会提示要重启虚拟机,以及需要输入一个`ENTER`进入。等以上步骤都顺利的完成之后就会显示一个登录界面那Ubuntu的安装就大功告成啦
![2.10](./img/2.10.png)
# 四、软件安装
Linux下常见的两种软件安装方式分别是软件包安装和源码编译安装。
## 4.1、安装包安装
Linux下配置开发环境较便利其中一个原因是Linux有很好的包管理工具。包管理工具可以在操作系统中提供安装、升级卸载软件的方法。在Linux下DPT和RPM是最为常见的两种包管理工具分别应用于基于deb软件包的Linux发行版和基于rpm软件包的Linux发行版。另外还有arch linux系列的Pacman包管理工具。
### 4.1.1、deb
基于 Debian 操作系统 (UBUNTU) 的 DEB 软件包管理工具- Dpkg全称为 Debian Package是一个可以安装、构建、删除及管理 Debian 软件包的命令行工具,用来制作 Debian 包的工具,同时也可以查看、解压 Debian 包。
下面是一些dpkg的普通用法
```
dpkg -i <package.deb>
```
安装一个Debian安装包就像是你手动下载的文件其中`-i`等价于`--install`
```
dpkg -c <package.deb>
```
列出`<package.deb>`的内容中包含的文件结果(其中`-c`等价于`--contents`
```
dpkg -l <package.deb>
```
从`<package.deb>`中提取包裹信息的详细信息,包括软件名称、版本以及大小等(其中`-l`等价于`--info`
```
dpkg -r <package>
```
移除一个已安装的包裹(软件名称可通过`dpkg -I`命令查看,其中`-r`等价于`--remove`
```
dpkg -P <package>
```
完全清除一个已安装的包裹。和 remove 不同的是remove 只是删掉数据和可执行文件purge 另外还删除所有的配制文件。
```
dpkg -L <package>
```
列出`<package>`安装的软件包安装的所有文件(软件名称可通过`dpkg -I`命令查看,其中`-L`等价于`--listfiles`
```
dpkg -l <package>
```
查看`<package>`软件包的信息(软件名称可通过`dpkg -I`命令查看,其中`-l`等价于`--list`
```
dpkg -s <package>
```
显示已安装包裹的详细信息。同时请看 `apt-cache` 显示 Debian 存档中的包裹信息,以及 `dpkg -I` 来显示从一个 `.deb` 文件中提取的包裹信息。(软件名称可通过`dpkg -I`命令查看,其中`-s`等价于`--status`
```
dpkg -reconfigure <package>
```
重新配制一个已经安装的包裹,如果它使用的是 `debconf` (`debconf` 为包裹安装提供了一个统一的配制界面)。
### 4.1.2、rpm格式
**rpm**是 `redhat` 、`fedora`、`suse` 的格式。全称为`Redhat PackageManager` ,是由`Redhat`公司提出的,用于管理`Linux`下软件包的软件。`Linux`安装时,除了几个核心模块以外,其余几乎所有的模块均通过`RPM`完成安装。
下面是一些rmp的使用指令
```
rpm -i <package.rpm>
```
安装需要的包文件,`-iv` 在安装过程中显示正在安装的文件信息,`-ivh` 在安装过程中显示正在安装的文件信息及安装进度。
> 使用举例:
>
> - `rpm -i example.rpm `安装 `example.rpm` 包;
>
> - `rpm -iv example.rpm` 安装 `example.rpm` 包并在安装过程中显示正在安装的文件信息;
>
> - `rpm -ivh example.rpm` 安装 `example.rpm` 包并在安装过程中显示正在安装的文件信息及安装进度;
>
```
rpm -q …
```
查询指令:
- `a` 查询所有已经安装的包以下两个附加命令用于查询安装包的信息;
- `i` 显示安装包的信息;
- `l` 显示安装包中的所有文件被安装到哪些目录下;
- `s` 显示安装版中的所有文件状态及被安装到哪些目录下;
以下两个附加命令用于指定需要查询的是安装包还是已安装后的文件:
- `p` 查询的是安装包的信息;
- `f` 查询的是已安装的某文件信息;
> 使用举例:
>
> - `rpm -qa | grep tomcat4` 查看 `tomcat4` 是否被安装;
> - `rpm -qip example.rpm` 查看 `example.rpm` 安装包的信息;
> - `rpm -qif /bin/df` 查看`/bin/df` 文件所在安装包的信息;
> - `rpm -qlf /bin/df` 查看`/bin/df` 文件所在安装包中的各个文件分别被安装到哪个目录下;
>
```
rpm -U 需要升级的包
```
> 举例:`rpm -Uvh example.rpm` 升级 `example.rpm` 软件包
```
rpm -V 需要验证的包
```
> 举例:`rpm -Vf /etc/tomcat4/tomcat4.conf`
> 输出:`S.5....T c /etc/tomcat4/tomcat4.conf`
> 其中S 表示文件大小修改过T 表示文件日期修改过。更多的验证信息请参考rpm 帮助文件man rpm
## 4.2、编译源码安装
首先说一下使用源代码安装软件的优点:
- 可以获得最新的软件及时修复bug
- 根据用户的需求,灵活定制软件功能
0. tar -xzvf soft.tar.gz #解压一般会生成一个soft目录
1. ./configure #检查环境变量及配置编译选项
2. make #源代码编译成二进制文件
3. make install #将make编译出来的文件安装到指定位置(或默认位置)
卸载make uninstall 或 手动删除,由于软件可能将文件分散地安装在系统的多个目录中,往往很难把它删除干净, 最好在编译前进行配置,指定软件将要安装到目标路径:./configure --prefix=目录名这样可以使用“rm -rf 软件目录名”命令来进行干净彻底的卸载。
## 4.3、在线安装
### 4.3.1、apt包管理
由于操作系统中软件包存在复杂的依赖关系为了解决软件包的依赖性问题和获取问题APT顺势出现了。
APT 是 Ubuntu Linux 中的命令行软件包管理工具,用于获取、安装、编译、卸载和查询 Deb 软件包,以及检查软件包的依赖关系。
apt常用命令
```shell
sudo apt-get update
# 更新本地索引,即更新/var/lib/apt/lists 里边的内容
sudo apt-get upgrade
# 更新所有软件包
sudo apt-get install xx
# 安装软件
sudo apt-get remove xx
# 卸载包
sudo apt-get remove --purge name
# 卸载并彻底清除
sudo apt-get clean
# 清理下载文件的存档
```
### 4.3.2、换源
在线安装如apt包管理的软件仓库地址可能在国外国内连接速度较慢。所以可以将软件仓库地址改为国内源码库。
Ubuntu 的软件源配置文件是 `/etc/apt/sources.list`。将系统自带的该文件做个备份,将该文件替换为下面内容,即可使用 TUNA 的软件源镜像。
用gedit命令打开sources.list文件
```shell
sudo gedit /etc/apt/sources.list
```
将内容改为下面:
```shell
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
```
以上为ubuntu20.04更换清华源码的一个例子。另外还有中科大等众多优秀软件仓库,大家可以自行尝试
清华源https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/
中科大源https://mirrors.ustc.edu.cn/help/
# 五、开源软件
## 5.1、效率工具
### 5.1.1、搜狗输入法
**1.首先安装fcitx**
在终端输入
```shell
sudo apt-get install fcitx
```
**2.进入搜狗输入法官网选择linux版下载deb文件(ubuntu系统)**
![image-20200901155326691](img/image-20200901155326691.png)
**3.打开设置选择区域与语言选择管理已安装的语言在“键盘输入法系统”选择fcitx**
![image-20200901155408460](img/image-20200901155408460.png)
**4.可能需要重启,再屏幕右上角选择搜狗输入法即可**
![image-20200901155855248](img/image-20200901155855248.png)
![image-20200901155908354](img/image-20200901155908354.png)
### 5.1.2、Terminator
terminator可以在同一个窗口分割出多个终端每个终端都是独立的适合大屏使用
![image-20200901170645779](img/image-20200901170645779.png)
命令行安装:
```shell
sudo apt-get install terminator
```
## 5.2、开发工具
### 5.2.1、git
> Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
命令行安装:
```shell
sudo apt-get install git
```
### 5.2.2、vim
> Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。
安装方法:
**1.首先将vim的源码克隆下来这里因为github可能很慢使用码云的镜像**
```shell
git clone https://gitee.com/mirrors/vim.git
```
**2.安装gcc有则不必安装和各依赖库**
```shell
sudo apt-get install gcc
```
```powershell
sudo apt-get install libncurses5-dev python-dev python3-dev libatk1.0-dev libbonoboui2-dev libcairo2-dev libx11-dev libxpm-dev libxt-dev
```
**3.配置与安装**
```shell
sudo ./configure --with-features=huge --enable-multibyte --enable-rubyinterp --enable-pythoninterp --enable-python3interp --enable-luainterp --enable-cscope --enable-gui=gtk3 --enable-perlinterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ --prefix=/usr/local/vim8
```
--with-features=huge支持最大特性
--enable-rubyinterp打开对 ruby 编写的插件的支持
--enable-pythoninterp打开对 python 编写的插件的支持
--enable-python3interp打开对 python3 编写的插件的支持
--enable-luainterp打开对 lua 编写的插件的支持
--enable-perlinterp打开对 perl 编写的插件的支持
--enable-multibyte打开多字节支持可以在 Vim 中输入中文
--enable-cscope打开对cscope的支持
--enable-gui=gtk3 表示生成采用 GNOME3 风格的 gvim
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ 指定 python 路径
--with-python3-config-dir=/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ 指定 python3路径(这里可以根据自己的版本做更改)
--prefix=/usr/local/vim8指定将要安装到的路径
# 六、常用终端快捷键
以下命令仅在ubuntu系统测试其他发行版Linux未测试
Ctrl+Alt+T 打开终端
| 快捷键 | 功能 |
| ---------------- | ---------------------------------------- |
| Ctrl+a | 光标移动到开始位置 |
| Ctrl+e | 光标移动到最末尾 |
| Ctrl+k | 删除此处至末尾的所有内容 |
| Ctrl+u | 删除此处至开始的所有内容 |
| Ctrl+d | 删除当前字符 |
| Ctrl+h | 删除当前字符前一个字符 |
| Ctrl+w | 删除此处到左边的单词 |
| Ctrl+y | 粘贴由Ctrl+u Ctrl+d Ctrl+w删除的单词 |
| Ctrl+l | 相当于clear即清屏 |
| Ctrl+r | 查找历史命令 |
| Ctrl+b | 向回移动光标 |
| Ctrl+f | 向前移动光标 |
| Ctrl+Left-Arrow | 光标移动到上一个单词的词首 |
| Ctrl+Right-Arrow | 光标移动到下一个单词的词尾 |
| Ctrl+d | 退出终端 |

View File

@ -0,0 +1,236 @@
# Linux用户和组管理
## 一、用户与用户组
### 1.1、什么是用户
前面有提到Linux具有很好的安全性其安全性有一部分原因是有良好的用户和组管理方法。
Linux是多用户多任务的操作系统也就是说多个用户可以同时登陆执行不同任务。用户需要使用系统资源则需向系统管理员申请账户进入系统。不同的用户则拥有不同的权限。
用户又分*超级用户*和*普通用户*超级用户即系统管理员root。
### 1.2、什么是用户组
Linux除了用户还有一个用户组的概念。当我们需要让多个用户都拥有某一个权限就可以把他们放进同一个用户组里方便集中管理。
其中用户组也分两种一种是主用户组primary group一种是次用户组secondary group
主用户组的信息保存在/etc/passwd 文件中,次用户组的信息保存在/etc/group 中。
当用户被创建之后默认属于同名用户组,即主用户组,后来再将该用户加入其他用户组的话,加入的用户组为该用户的次用户组。
```shell
~ ➤ grep datawhale /etc/group
datawhale:x:1001:datawhale1
# datawhale1即为次用户组
```
### 1.3、用户与用户组的关系
每个用户在创建时都会自动属于一个用户组,此外用户与用户组之间的关系又可以分为以下四种:
1. 一对一:一个用户可以存在一个组中,是组中的唯一成员;
2. 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
3. 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
4. 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
*******
## 二、用户ID与组ID
在Linux系统中并不是通过用户名来识别用户的用户名只是方便用户记忆在系统里是通过用户ID来判断是哪个用户的。用户 datawhale 会被赋予一个名为Datawhale 的用户组且成为该新建用户组的唯一成员同时UID和GID会被分别写入`/etc/passwd`和`/etc/group`中。
```shell
~ ➤ sudo useradd datawhale
~ ➤ grep datawhale /etc/passwd
datawhale:x:1001:1001::/home/datawhale:/bin/sh
#用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
~ ➤ grep datawhale /etc/group
datawhale:x:1001:
```
**主目录**:用户的起始工作目录,用户登录后有操作权限的访问目录
**注释性描述**这个字段并没有什么实际的用途。在不同的Linux 系统中这个字段的格式并没有统一。在许多Linux系统中这个字段存放的是一段任意的注释性描述文字用做finger命令的输出。
**登陆shell**用户登录后要启动一个进程负责将用户的操作传给内核这个进程是用户登录到系统后运行的命令解释器或某个特定的程序即Shell。
通常情况下UID是递增的上一个是1000下一个则是1001。
```shell
~ ➤ sudo useradd datawhale1
~ ➤ grep datawhale1 /etc/passwd
datawhale1:x:1002:1002::/home/datawhale1:/bin/sh
```
系统管理员的UID为0
```shell
~ ➤ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
```
## 三、用户与用户组管理命令
Linux用户和组管理命令主要有如下几类
### 3.1 用户的增删修改
**添加用户**
```shell
useradd 选项 用户名
```
| 选项 | 作用 |
| ---- | ------------------------------------------------------------ |
| -u | 手工指定用户的 UID注意 UID 的范围(不要小于 500。 |
| -d | 手工指定用户的主目录。主目录必须写绝对路径,而且如果需要手工指定主目录,则一定要注意权限; |
| -c | 手工指定/etc/passwd文件中各用户信息中第 5 个字段的描述性内容,可随意配置; |
| -g | 手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。一旦手动指定,则系统将不会在创建此默认的初始组目录。 |
| -G | 指定用户的附加组。我们把用户加入其他组,一般都使用附加组; |
| -s | 手工指定用户的登录 Shell默认是 /bin/bash |
| -e | 指定用户的失效日期 |
| -o | 允许创建的用户的 UID 相同。例如,执行 "useradd -u 0 -o usertest" 命令建立用户 usertest它的 UID 和 root 用户的 UID 相同,都是 0 |
| -m | 创建用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的; |
| -r | 创建系统用户 |
**删除用户**
```
userdel 选项 用户名
```
-r 选项表示在删除用户的同时删除用户的家目录。
**修改用户**
```
usermod 选项 用户名
```
| 选项 | 说明 |
| ----------- | ------------------------------------------------------------ |
| -c 用户说明 | 修改用户的说明信息,即修改 /etc/passwd 文件目标用户信息的第 5 个字段; |
| -d 主目录 | 修改用户的主目录,即修改 /etc/passwd 文件中目标用户信息的第 6 个字段,需要注意的是,主目录必须写绝对路径; |
| -e 日期 | 修改用户的失效曰期,格式为 "YYYY-MM-DD",即修改 /etc/shadow 文件目标用户密码信息的第 8 个字段; |
| -g 组名 | 修改用户的初始组,即修改 /etc/passwd 文件目标用户信息的第 4 个字段GID |
| -u UID | 修改用户的UID即修改 /etc/passwd 文件目标用户信息的第 3 个字段UID |
| -G 组名 | 修改用户的附加组,其实就是把用户加入其他用户组,即修改 /etc/group 文件; |
| -l 用户名 | 修改用户名称; |
| -L | 临时锁定用户Lock |
| -U | 解锁用户Unlock和 -L 对应; |
| -s shell | 修改用户的登录 Shell默认是 /bin/bash。 |
**修改用户密码**
```
passwd 选项 用户名
```
| 选项 | 作用 |
| ------- | :----------------------------------------------------------- |
| -l | 暂时锁定用户,该选项会在 /etc/shadow 文件中指定用户的加密密码串前添加 "!",使密码失效。仅 root 用户可用; |
| -u | 解锁用户,和 -l 选项相对应,也是只能 root 用户使用; |
| -d | 使账号无口令,删除密码 |
| -f | 强迫用户下次登录时修改口令 |
| -S | 查询用户密码的状态,显示密码信息,也就是 /etc/shadow 文件中此用户密码的内容。仅 root 用户可用; |
| -g | 修改群组密码 |
| -n 天数 | 设置该用户修改密码后,多长时间不能再次修改密码,也就是修改 /etc/shadow 文件中各行密码的第 4 个字段; |
| -x 天数 | 设置该用户的密码有效期,对应 /etc/shadow 文件中各行密码的第 5 个字段; |
| -w 天数 | 设置用户密码过期前的警告天数,对于 /etc/shadow 文件中各行密码的第 6 个字段; |
| -i 日期 | 设置用户密码失效日期,口令过期后多少天停用账户,对应 /etc/shadow 文件中各行密码的第 7 个字段 |
### 3.2 用户组管理
**添加用户组**
```shell
groupadd 选项 用户组
```
| 选项 | 描述 |
| ------ | -------------- |
| -g GID | 指定组 ID |
| -r | 创建系统群组。 |
**删除用户组**
```
groupdel 组名
```
需要从系统上删除群组时可用groupdel(group delete)指令来完成这项工作。
**注意,不能使用 groupdel 命令随意删除群组**。此命令仅适用于删除那些 "不是任何用户初始组" 的群组,换句话说,如果有群组还是某用户的初始群组,则无法使用 groupdel 命令成功删除。倘若该群组中仍包括某些用户,则必须先删除这些用户后,方能删除群组。
**修改用户组属性**
```
groupmod 选项 用户组
```
| 选项 | 描述 |
| --------- | ------------------ |
| -g GID | 修改组 ID |
| -n 新组名 | 修改组名 |
| -o | 重复使用群组识别码 |
**切换用户组**
```
newgrp 目标用户组
```
newgrp 指令类似 login 指令,当它是以相同的帐号,另一个群组名称,再次登入系统。**newgrp 命令可以从用户的附加组中选择一个群组,作为用户新的初始组。**欲使用 newgrp 指令切换群组,您必须是该群组的用户,否则将无法登入指定的群组。单一用户要同时隶属多个群组,需利用交替用户的设置。若不指定群组名称,则 newgrp 指令会登入该用户名称的预设群组。
****
## 参考资料
[1] https://www.linuxprobe.com/linux-group.html
[2] https://www.linuxprobe.com/common-user-group.html
[3] https://www.runoob.com/linux/linux-user-manage.html
[4] https://www.cnblogs.com/ddz-linux/p/10467106.html
[5] http://c.biancheng.net/linux_tutorial/60/
[6] http://c.biancheng.net/view/848.html
[7] https://www.runoob.com/linux/linux-command-manual.html

View File

@ -1,490 +0,0 @@
# 4. Linux用户和组管理
## 4.1、用户与用户组
Linux是多用户多任务的操作系统需要使用系统资源则需向系统管理员申请账户进入系统。
用户又分*超级用户*和*普通用户*超级用户即系统管理员root.
每个用户都会属于一个用户组,例如某几个用户需要同样的权限的时候,我们可以把这几个用户归属于同一个用户组,对用户组进行集中管理。
用户与用户组之间的关系又可以分为以下四种:
1. 一对一:一个用户可以存在一个组中,是组中的唯一成员;
2. 一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
3. 多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
4. 多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
第一种较常见因为Linux添加用户的时候会自动创建同名的用户组。
#### 4.1.1、一个用户一个用户组?
Linux 系统中多数用户账户被设为用户名与用户组名相同。用户 jdoe 会被赋予一个名为jdoe 的用户组,且成为该新建用户组的唯一成员。如本例所示,该用户的登录名,用户 id(UID) 和用户组id(GID) 在新建账户时会被添加到` /etc/passwd` 和 `/etc/group` 文件中:
```
$ sudo useradd jdoe
$ grep jdoe /etc/passwd
jdoe:x:1066:1066:Jane Doe:/home/jdoe:/bin/sh
$ grep jdoe /etc/group
jdoe:x:1066:
```
这些文件中的配置使系统得以在文本jdoe和数字1066这两种用户id 形式之间互相转换—— jdoe 就是 1006且 1006 就是jdoe 。
分配给每个用户的 UID用户 id和 GID用户组 id通常是一样的并且顺序递增。若上例中 Jane Doe 是最近添加的用户,分配给下一个新用户的用户 id 和用户组 id 很可能都是 1067。
#### 4.1.2、GID = UID
UID 和 GID 可能不一致。例如,如果你用 `groupadd` [命令](https://www.linuxcool.com/)添加一个用户组而不指定用户组 id系统会分配下一个可用的用户组 id在本例中为 1067。下一个添加到系统中的用户其 UID 会是 1067 而 GID 则为 1068。
你可以避免这个问题,方法是添加用户组的时候指定一个较小的用户组 id 而不是接受默认值。在下面的[命令](https://www.linuxcool.com/)中我们添加一个用户组并提供一个 GID这个 GID 小于用于用户账户的 GID 取值范围。
```
$ sudo groupadd -g 500 devops
```
创建账户时你可以指定一个共享用户组,如果这样对你更合适的话。例如你可能想把新来的开发人员加入同一个 DevOps 用户组而不是一人一个用户组。
```
$ sudo useradd -g staff bennyg
$ grep bennyg /etc/passwd
bennyg:x:1064:50::/home/bennyg:/bin/sh
```
在Linux中操作系统**根据UID来判断用根据UID来判断用户** 而不是用户名!**只要id为0就是管理员哪怕有多个id为0 的账号**。
系统在新建账号时会根据账号类型自动分配递增账号的UID与GID (用户身份编号,组编号),也可自行分配。**通常情况下应当保证UID与GID唯一且不重复。**
#### 4.1.3、用户组
用户组实际上有两种:主要用户组*primary group*和次要用户组*secondary group*。
主要用户组是保存在 `/etc/passwd` 文件中的用户组,该用户组在账户创建时配置。当用户创建一个文件时,用户的主要用户组与此文件关联。
```
$ whoami
jdoe
$ grep jdoe /etc/passwd
jdoe:x:1066:1066:John Doe:/home/jdoe:/bin/bash
^
|
+-------- 主要用户组
$ touch newfile
$ ls -l newfile
-rw-rw-r-- 1 jdoe jdoe 0 Jul 16 15:22 newfile
^
|
+-------- 主要用户组
```
用户一旦拥有账户之后被加入的那些用户组是次要用户组。次要用户组成员关系在 `/etc/group` 文件中显示。
```
$ grep devops /etc/group
devops:x:500:shs,jadep
^
|
+-------- shs 和 jadep 的次要用户组
```
`/etc/group` 文件给用户组分配组名称(例如 500 = devops并记录次要用户组成员。
****
## 4.2 用户与组的配置文件
在Linux中**万物皆文件**,所以用户与组也以配置文件的形式保存在系统中,以下为用户和组的主要配置文件:
> - `/etc/passwd`用户及其属性信息名称、UID、主组ID等
> - `/etc/group`:组及其属性信息
> - `/etc/shadow`:用户密码及其相关属性
> - `/etc/gshadow`:组密码及其相关属性
1. passwd文件格式
```
Father:x:887:887:Father:/data/Father:/sbin/bash
```
含义:登录用户名:密码:UID:GID:全名或注释:用户主目录:用户默认使用shell
2. group文件格式
```
Father:x:887:
```
含义:群组名称:群组密码(通常不需要设定,密码被记录在`/etc/gshadow`):GID:附加组(以逗号","分割,该用户没有附加组,因此为空)
3. shadow文件格式
```
Father:$6$ZwGNKTt0$i31E8.EpmX6nIMR6R9k8kx3i/Zt8HpiUiiiuzx1.S1DJPHvrbiRV5DFI1APyU0WaGA4yfPiYi.d/M7eGQRAJ81:17902:0:99999:7:::
```
含义:登录用户名:密码(通常使用shad512加密):从1970年1月1日起计算到现在为止密码最近一次被更改的时间:密码再过几天就可以被修改(0表示随时可以修改):密码几天后必须变更(99999表示永不过期):密码过期前多久提示用户:密码过期多久后账户将被锁定:多少天后账户将失效(从1970-1-1算起)
4. gshadow文件格式
```
Father:!::
```
含义:群组名称:群组密码:组管理员列表:当前用户的附加组
#### 4.2.1、用户管理
想要知道, 系统中有哪些用户, 可以查看这个文件: `/etc/passwd`
```
root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh proxy:x:13:13:proxy:/bin:/bin/sh www-data:x:33:33:www-data:/var/www:/bin/sh
```
文件格式:
```
Name:password:ID:group ID:comment:home directory:login shell 用户名:密码:ID:用户组ID:注释:家目录:登录使用的shell
```
你会发现密码已经用'x'替换掉了, 基于安全考虑, 密码的密文是存储在文件`/etc/shadow`中, 而且一般只有超级用户可以访问。
##### 1. 查询账号
```
id [opentions] [User]
```
相关参数:
- `-u`显示UID
- `-g`显示GID
- `-G`显示用户所属的组ID
- `-n`:显示名称
##### 2. 用户口令的管理
用户管理中一项重要内容是**用户口令的管理**。用户账号刚创建时没有口令,但被系统锁定,无法使用(在passwd文件中密码显示为`!!`或`!`表示用户被锁定,是无法登陆的),必须为其指定口令后才能使用,即使是指定空口令。
指定和修改用户口令的Shell命令是`passwd`。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。
命令格式:
```
passwd 选项 用户名
```
可使用的选项:
- `-l`:锁定口令,即禁用账号
- `-u`:口令解锁
- `-d`:使账号无口令
- `-f`:强迫用户下次登录时修改口令
为账户指定空口令时,执行下列实行的命令:
```
# passwd -d sam
```
此命令将用户sam的口令删除这样用户sam下次登录时系统就不再询问口令。
`passwd`口令还可以用`-l`(lock)锁定某一用户,使其不能登录:
```
# passwd -l sam
```
#### 4.2.2 用户组管理
想要知道, 系统有哪些用户组, 可以查看`/etc/group`
```
root:x:0: daemon:x:1: fax:x:21: voice:x:22: cdrom:x:24:anthony floppy:x:25:anthony tape:x:26: dip:x:30:anthony www-data:x:33: sasl:x:45: plugdev:x:46:anthony staff:x:50: sambashare:x:107: anthony:x:1000: smmta:x:108: smmsp:x:109: dkim-filter:x:110:
```
文件格式:
```
Group name:password:group ID:user list 用户组名:密码:用户组ID:用户列表
```
用户组密码现在基本已经不用了, 'x'就是表示没有密码。
##### 1. 更改查看组成员
```
# groupmems [opentions] [action]
```
参数:
- `-g`:更改为指定组(只有root可以使用)
- `-a`:指定用户加入组
- `-d`:从组中删除该用户
- `-p`:从组中清楚所有成员
- `-l`:显示组成员列表
****
## 4.3、创建用户和用户组
### 4.3.1、用户
##### 1. 添加新用户账号
我们可以通过'useradd'命令添加新用户:
```
# useradd 选项 用户名
```
参数说明:
- 选项
- `-c comment` 指定一段注释性描述。
- `-d 目录` 指定用户主目录,如果此目录不存在,则同时使用-m选项可以创建主目录。
- `-g 用户组` 指定用户所属的用户组。
- `-G 用户组`,用户组 指定用户所属的附加组。
- `-s Shell文件` 指定用户的登录Shell。
- `-u 用户号` 指定用户的用户号,如果同时有-o选项则可以重复使用其他用户的标识号。
- 用户名:
指定新账号的登录名上方命名为username。
```
# useradd username
```
默认情况, 这个命令会为新用户在`/home`目录下创建一个与新用户同名(username)的目录, 作为新用户的根目录; 而且这个用户没有过期时间限制, 隶属于默认的用户组, 使用Bash作为登录shell。
**实例**
```
# useradd -d /home/sam -m -sam
```
此命令创建了一个用户sam其中`-d`和`-m`选项用来为登录名sam产生一个主目录`/home/sam`
> **哪里也不如自己的家目录**
>
> 添加新账户时一个重要的细节是 useradd 命令并不一定为新用户添加一个家目录`/home`家目录。若你只有某些时候想为用户添加家目录,你可以在 useradd 命令中加入 -m 选项(可以把它想象成“安家”选项)。
>
> ```
> $ sudo useradd -m -g devops -c "John Doe" jdoe2
> ```
>
> 此命令中的选项如下:
> -m 创建家目录并在其中生成初始文件
> -g 指定用户归属的用户组
> -c 添加账户描述信息(通常是用户的姓名)
> 若你希望总是创建家目录,你可以编辑`/etc/login.defs` 文件来更改默认工作方式。更改或添加 CREATE_HOME 变量并将其设置为 yes
>
> ```
> $ grep CREATE_HOME /etc/login.defs
> CREATE_HOME yes
> ```
>
> 另一种方法是用自己的账户设置别名从而让 useradd 一直带有 -m 选项。
>
> ```
> $ alias useradd=useradd -m
> ```
>
> 确保将该别名添加到你的`~/.bashrc` 文件或类似的启动文件中以使其永久生效。
##### 2. 修改用户账号
修改用户账号就是根据实际情况更改用户的有关属性如用户号、主目录、用户组、登录Shell等。
修改已有用户的信息使用`usermod`命令:
```
usermod 选项 用户名
```
常用的选项包括`-c, -d, -m, -g, -G, -s, -u`以及`-o`等,这些选项的意义与`useradd`命令中的选项一样,可以为用户指定新的资源值。
另外,有些系统可以使用选项:`-l` 新用户名。
```
# usermod --login old_login_name new_login_name
```
简单地说, usermod命令通过修改系统中, 与用户相关的配置文件`(/etc/password, /etc/shadow/ …)`, 改变用户信息, 如登陆名, 用户组, 登陆密码...
具体情况请查看`”man usermod”`
**实例**
```
# usermod -s /bin/ksh -d /home/z -g developer sam
```
此命令将用户sam的登录Shell修改为ksh主目录改为`/home/z`用户组改为developer。
##### 3. 添加用户至用户组
如果你想添加一个已有用户至别的用户组,你可以仿照下面的命令操作:
```
$ sudo usermod -a -G devops jdoe
```
你也可以指定逗号分隔的用户组列表来添加一个用户至多个用户组:
```
$ sudo usermod -a -G devops,mgrs jdoe
```
参数 `-a` 意思是“添加”,`-G` 指定用户组列表。
你可以编辑`/etc/group` 文件将用户名从用户组成员名单中删除,从而将用户从用户组中移除。`usermod` 命令或许也有个选项用于从用户组中删除某个成员。
```
fish:x:16:nemo,dory,shark
|
V
fish:x:16:nemo,dory
```
##### 3. 删除用户账号
如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将`/etc/passwd`等系统文件中的该用户记录删除,必要时还删除用户的主目录。
删除一个已有的用户账号使用`userdel`命令,其格式如下:
```
userdel 选项 用户名
```
常用的选项是 `-r`,它的作用是把用户的主目录一起删除。
例如:
```
# userdel -r sam
```
此命令删除用户sam在系统文件中主要是`/etc/passwd, /etc/shadow, /etc/group`等)的记录,同时删除用户的主目录。
### 4.3.2、用户组
##### 1. 添加新用户组
```
# groupadd 选项 用户组
```
可以使用的选项有:
- `-g GID` 指定新用户组的组标识号GID
- `-o` 一般与`-g`选项同时使用表示新用户组的GID可以与系统已有用户组的GID相同。
**实例**
```
# groupadd groupname
```
此命令向系统中增加了一个新组groupname新组的组标识号是在当前已有的最大组织标识号的基础上加1。通过命令`"groupadd"`添加用户组, 相当于在`/etc/group`文件中新增一条记录. `“groupadd groupname”` 是添加用户组最简单的方法, 该命令其他参数, 可以查看`"man groupadd"`
##### 2. 修改用户组
```
# groupmod 选项 用户组
```
常用的选项有:
- `-g GID` 为用户组指定新的组标识号。
- `-o` 与`-g`选项同时使用用户组的新GID可以与系统已有用户组的GID相同。
- `-n 新用户组` 将用户组的名字改为新名字
**实例1**
```
# groupmod --new-name old_groupname new_groupname
```
与`”usermod”`类似, 但操作对象是用户组(group). 具体使用方法可以查看`"man groupmod"`
**实例2**
```
# groupmod -g 102 group2
```
此命令将组group2的组标识号修改为102。
##### 3. 删除用户组
```
# groupdel groupname
```
此命令从系统中删除groupname删除用户组及相关文件。
##### 4. 用户在用户组间切换
用户可以在登录后,使用命令`newgrp`切换到其他用户组,这个命令的参数就是目的用户组。例如:
```
$ newgrp root
```
这条命令将当前用户切换到root用户组前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理用户组的管理也可以通过集成的系统管理工具来完成。
****
## 参考资料
[1] https://www.linuxprobe.com/linux-group.html
[2] https://www.linuxprobe.com/common-user-group.html
[3] https://www.runoob.com/linux/linux-user-manage.html
[4] https://www.cnblogs.com/ddz-linux/p/10467106.html
[5] http://c.biancheng.net/linux_tutorial/60/

View File

@ -40,7 +40,7 @@ unshareable:不可分享的
ls /
```
则可查看根目录下的目录结构
则可查看根目录下的目录0结构
![image-20210607010501046](img/image-20210607010501046.png)
@ -122,30 +122,35 @@ ls /
### 4.2.1、Linux文件类型
Linux文件类型
1普通文件(regular file):就是一般类型的文件,当用 ls -l 查看某个目录时,第一个属性为 - 的文件就是正规文件,或者叫普通文件。正规文件又可分成纯文字文件(ascii)和二进制文件(binary)。纯文本文件是可以通过cat, more, less等工具直接查看内容的而二进制文件并不能。例如我们用的命令/bin/ls 这就是一个二进制文件。
Linux中有六种文件类型分别是普通文件目录文件链接文件设备文件套接字文件管道文件。下面详细介绍各类文件。
2目录(directory) Linux 中的目录也是文件,目录文件中保存着该目录下其他文件的 inode 号 和文件名等信息,目录文件中的每个数据项都是指向某个文件 inode 号的链接,删除文件名就等于删除与之对应的链接。目录文件的字体颜色是蓝色,使用 ls -l 命令查看,第一个字符为"d"directory
* 普通文件:包括纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data)
这个很容易理解就是目录跟windows下的文件夹一个意思只不过在linux中我们不叫文件夹而是叫做目录。ls -l 查看第一个属性为 d.
* 目录文件Linux 中的目录也是文件,
3链接文件(link):链接文件一般指的是一个文件的软连接(或符号链接),使用 ls -l 命令查看,第一个符号为 "l",文件名为浅蓝色,如下:
* 链接文件符号链接是指向系统上其他文件的引用类似windows下的快捷方式。
ls -l 查看第一个属性为 l, 类似windows下的快捷方式。
* 设备文件Linux 中的硬件设备如硬盘、鼠标等也都被表示为文件,即为设备文件。设备文件一般存放在 /dev/ 目录下
* 块设备文件:存储数据以供系统存取的接口设备,如硬盘或软盘。
* 字符设备文件:即串行端口的接口设备,例如键盘、鼠标
4设备(device)  Linux 中的硬件设备如硬盘、鼠标等也都被表示为文件,即为设备文件。设备文件一般存放在 /dev/ 目录下
* 管道文件管道是一种最基本的IPC机制作用于有血缘关系的进程之间。一般的管道都是单向通信的无法实现双向通信的功能。
* 套接字文件:提供进程间通信方法的文件,套接字可以实现两端通信。
块设备文件块设备文件支持以块block为单位的访问方式。在 EXT4 文件系统中,一个 block 通常为 4KB 的大小,也就是说每次可以存取 4096或其整数倍 个字节的数据。应用程序可以随机访问块设备文件的数据,程序可以自行确定数据的位置,硬盘、软盘等都是块设备。使用 ls -l 命令查看,块设备文件的第一个字符是 "b"block
字符设备文件:字符设备文件以字节流的方式进行访问,由字符设备驱动程序来实现这种特性,这通常要用到 open、close、read、write 等系统调用。字符终端、串口和键盘等就是字符设备。另外,由于字符设备文件是以文件流的方式进行访问的,因此可以顺序读取,但通常不支持随机存取。使用 ls -l 命令查看,字符设备文件的第一个字符是 "c"char
占用存储空间的类型:文件、目录、符号链接。套接字、设备文件和管道是伪文件,不占用磁盘空间。
### 4.2.2、文件权限
**文件的权限:**
以普通文件为例,使用 ls -l 命令,可以看到结果的第一列是 **-rwxrwxrwx** 的形式,其中第一个字符 "-" 表示这个文件为普通文件,它也可以是其他的字符,不同的字符代表不同类型的文件。其后的一串字符表明了该文件的权限。
  以普通文件为例,使用 ls -l 命令,可以看到结果的第一列是 **-rwxrwxrwx** 的形式,其中第一个字符 "-" 表示这个文件为普通文件,它也可以是其他的字符,不同的字符代表不同类型的文件。其后的一串字符表明了该文件的权限,其中:
```shell
-rwxrwxrwx 1 datawhale datawhale 3533567 5月 20 13:14 文件名.pdf
```
1r 表明该文件具有可读权限,若该位置为 "-" ,则表明文件不可读;
@ -157,314 +162,134 @@ ls -l 查看第一个属性为 l, 类似windows下的快捷方式。
**目录文件的权限**
对于目录来说rwx的意思又不太一样了
1r 表明该目录文件具有可读权限,即可以使用 ls 命令查看该目录的存储情况;
r查看目录下的文件列表
2w 表明该目录文件具有写权限,即可以往该目录下添加、修改、删除文件;
w删除和创建目录下的文件
3x 表明该目录文件具有可执行文件,即可以使用 cd 命令进入到该目录下。
  可以使用 **chmod** 指令来改变文件的权限。
**创建一个目录:**
  可以使用 mkdir 命令来创建一个目录文件:
```
mkdir directory
```
**删除一个目录:**
  可以使用 rmdir 命令来删除一个空目录:
```
rmdir directory
```
  如果该目录下有其他文件,则可以使用 rm -r 命令来递归删除该目录下的所有文件。需要注意的是,使用该命令将会删除该目录及目录下的所有数据,过程不可逆,需要谨慎使用:
```
rm -r directory
```
x可以cd进入目录能查看目录中文件的详细属性能访问目录下文件内容
**1软链接**
  软链接(又称符号链接),使用 **ln -s file file_softlink** 命令可以创建一个文件的软链接文件:
```
ln -s test.txt test_softlink
```
  软链接相当于给原文件创建了一个快捷方式,如果删除原文件,则对应的软链接文件也会消失。
**2硬链接**
  硬链接,相当于给原文件取了个别名,其实两者是同一个文件,删除二者中任何一个,另一个不会消失;对其中任何一个进行更改,另一个的内容也会随之改变,因为这两个本质上是同一个文件,只是名字不同。使用 ls -i 命令查看,可以发现硬链接的两个文件的 inode 号是一样的:
![img](https://img2018.cnblogs.com/blog/765389/201902/765389-20190221163724064-292821250.png)
  同样的,使用 ln 命令可以创建一个文件的硬链接:
```
ln test.txt test_hardlink
```
## 4.3、命令集合
### ls (列出目录)
### ls
在Linux系统当中 ls 命令可能是最常被运行的。
语法:
```
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称
```shell
ls 选项 地址
```
选项与参数:
- -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -l :长数据串列出,包含文件的属性与权限等等数据;(常用)
| 选项 | 描述 |
| ---- | ----------------------------------------------------------- |
| -a | 全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用) |
| -d | 仅列出目录本身,而不是列出目录内的文件数据(常用) |
| -l | 长数据串列出,包含文件的属性与权限等等数据;(常用) |
将家目录下的所有文件列出来(含属性与隐藏档)
### cd
```
[root@www ~]# ls -al ~
cd 相对地址/绝对地址
```
### cd (切换目录)
cd是Change Directory的缩写这是用来变换工作目录的命令。
语法:
### pwd
```
cd [相对路径或绝对路径]
#使用 mkdir 命令创建 runoob 目录
[root@www ~]# mkdir runoob
#使用绝对路径切换到 runoob 目录
[root@www ~]# cd /root/runoob/
#使用相对路径切换到 runoob 目录
[root@www ~]# cd ./runoob/
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@www runoob]# cd ~
# 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
[root@www ~]# cd ..
```
接下来大家多操作几次应该就可以很好的理解 cd 命令的。
### pwd (显示目前所在的目录)
pwd 是 **Print Working Directory** 的缩写,也就是显示目前所在目录的命令。
```
[root@www ~]# pwd [-P]
```shell
pwd
```
选项与参数:
- **-P** :显示出确实的路径,而非使用连结 (link) 路径。
实例:单纯显示出目前的工作目录:
### mkdir
```
[root@www ~]# pwd
/root <== 显示出目录啦~
mkdir 选项 目录名称
```
实例显示出实际的工作目录,而非连结档本身的目录名而已。
```
[root@www ~]# cd /var/mail <==注意,/var/mail是一个连结档
[root@www mail]# pwd
/var/mail <==列出目前的工作目录
[root@www mail]# pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
```
### mkdir (创建新目录)
如果想要创建新的目录的话那么就使用mkdir (make directory)吧。
语法:
```
mkdir [-mp] 目录名称
```
选项与参数:
- -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
- -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
| 选项 | 描述 |
| ---- | ------------------------------------------------------------ |
| -m | 配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~ |
| -p | 帮助你直接将所需要的目录(包含上一级目录)递归创建起来! |
实例:请到/tmp底下尝试创建数个新目录看看
### rmdir
```
[root@www ~]# cd /tmp
[root@www tmp]# mkdir test <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory <== 没办法直接创建此目录啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4
```
加了这个 -p 的选项,可以自行帮你创建多层目录!
实例:创建权限为 **rwx--x--x** 的目录。
```
[root@www tmp]# mkdir -m 711 test2
[root@www tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
```
上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。
如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。
### rmdir (删除空的目录)
语法:
```
rmdir [-p] 目录名称
rmdir 选项 目录名称
```
选项与参数:
- **-p **连同上一级『空的』目录也一起删除
删除 runoob 目录
### cp
```
[root@www tmp]# rmdir runoob/
```
将 mkdir 实例中创建的目录(/tmp 底下)删除掉!
```
[root@www tmp]# ls -l <==看看有多少目录存在?
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@www tmp]# rmdir test <==可直接删除掉,没问题
[root@www tmp]# rmdir test1 <==因为尚有内容,所以无法删除!
rmdir: `test1': Directory not empty
[root@www tmp]# rmdir -p test1/test2/test3/test4
[root@www tmp]# ls -l <==您看看底下的输出中test与test1不见了
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
```
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。
不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。
### cp (复制文件或目录)
cp 即拷贝文件和目录。
语法:
```
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory
cp 选项 源文件 目标地址/文件
```
选项与参数:
- **-a**相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
- **-d**若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
- **-f**为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
- **-i**若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
- **-l**进行硬式连结(hard link)的连结档创建,而非复制文件本身;
- **-p**连同文件的属性一起复制过去,而非使用默认属性(备份常用)
- **-r**递归持续复制,用於目录的复制行为;(常用)
- **-s**复制成为符号连结档 (symbolic link),亦即『捷径』文件;
- **-u**若 destination 比 source 旧才升级 destination
| 选项 | 描述 |
| ---- | ------------------------------------------------------------ |
| -a | 相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用) |
| -d | 若来源档为连结档的属性(link file),则复制连结档属性而非文件本身; |
| -f | 为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次; |
| -i | 若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用) |
| -l | 进行硬式连结(hard link)的连结档创建,而非复制文件本身; |
| -p | 连同文件的属性一起复制过去,而非使用默认属性(备份常用) |
| -r | 递归持续复制,用於目录的复制行为;(常用) |
| -s | 复制成为符号连结档 (symbolic link),亦即『捷径』文件; |
| -u | 若 destination 比 source 旧才升级 destination |
用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
### rm
```
[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n <==n不覆盖y为覆盖
```
### rm (移除文件或目录)
语法:
```
rm [-fir] 文件或目录
rm 选项 文件或目录
```
选项与参数:
- -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
- -i :互动模式,在删除前会询问使用者是否动作
- -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!
-
| 选项 | 描述 |
| ---- | ----------------------------------------------------- |
| -f | 就是 force 的意思,忽略不存在的文件,不会出现警告信息 |
| -i | 互动模式,在删除前会询问使用者是否动作 |
| -r | 递归删除 |
将刚刚在 cp 的实例中创建的 bashrc 删除掉!
### mv
```
[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
mv 源地址/文件 目标地址/文件
```
如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!
### mv (移动文件与目录,或修改名称)
语法:
```
[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory
```
选项与参数:
- -f force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u :若目标文件已经存在,且 source 比较新,才会升级 (update)
复制一文件,创建一目录,将文件移动到目录中
```
[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest
```
将某个文件移动到某个目录去,就是这样做!
将刚刚的目录名称更名为 mvtest2
```
[root@www tmp]# mv mvtest mvtest2
```
| 选项 | 描述 |
| ---- | ---------------------------------------------------------- |
| -f | force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖 |
| -i | 若目标文件 (destination) 已经存在时,就会询问是否覆盖 |
| -u | 若目标文件已经存在,且 source 比较新,才会升级 (update) |
@ -475,27 +300,43 @@ rm: remove regular file `bashrc'? y
语法:
```
cat [-AbEnTv]
cat 选项 目标文件地址
```
选项与参数:
- -A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
- -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
- -E :将结尾的断行字节 $ 显示出来;
- -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
- -T :将 [tab] 按键以 ^I 显示出来;
- -v :列出一些看不出来的特殊字符
| 选项 | 描述 |
| ---- | ---------------------------------------------------------- |
| -A | 相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已; |
| -b | 列出行号,仅针对非空白行做行号显示,空白行不标行号! |
| -E | 将结尾的断行字节 $ 显示出来; |
| -n | 列印出行号,连同空白行也会有行号,与 -b 的选项不同; |
| -T | 将 [tab] 按键以 ^I 显示出来; |
| -v | 列出一些看不出来的特殊字符 |
检看 /etc/issue 这个文件的内容:
### ln
**1软链接**
  软链接(又称符号链接),可以理解为快捷方式,如果删除原文件,则对应的软链接文件也会消失。
```
[root@www ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
ln -s test.txt test_softlink
```
  软链接相当于给原文件创建了一个快捷方式,如果删除原文件,则对应的软链接文件也会消失。
**2硬链接**
  硬链接,相当于给原文件取了个别名,其实两者是同一个文件,删除二者中任何一个,另一个不会消失;对其中任何一个进行更改,另一个的内容也会随之改变,因为这两个本质上是同一个文件,只是名字不同。
```
ln test.txt test_hardlink
```
##
## 参考资料

View File

@ -1,4 +1,4 @@
- # Linux教程
- # Linux教程
## 贡献者信息
@ -6,7 +6,7 @@
| -------------- | ------------------------------- | ----------------------------- |
| 梁家晖 | 广州城市理工学院Datawhale成员 | https://github.com/leungkafai |
| 陈玉林 | 广州城市理工学院 | |
| 刘宇【领航员】 | 信息安全工程师DataWhale成员 | |
| 刘宇【领航员】 | 信息安全工程师 | |
@ -24,21 +24,23 @@
## 任务安排
### Task00熟悉规则1天
- 组队、修改群昵称
- 熟悉打卡规则。
- 熟悉打卡规则。
### Task01Linux简介1天
* 了解Linux的历史
* 了解Linux基本特性
* 了解Linux基本特性
### Task02Linux系统安装2天
* 安装好Linux系统
* 安装好Linux系统下常用开发工具
* 安装好Linux系统下常用开发工具
### Task03Linux用户和组管理3天
* 掌握Linux用户和组管理方法
@ -46,13 +48,13 @@
### Task04Linux文件和目录管理3天
* 理解Linux文件和目录管理的原理
* 掌握Linux文件和目录管理基本命令
* 掌握Linux文件和目录管理基本命令
### Task05Linux磁盘管理3天
* 理解Linux磁盘管理的原理
* 掌握磁盘管理基本命令
* 掌握磁盘管理基本命令