diff --git a/code/RabbitMQ/rabbitmq-basis/pom.xml b/code/RabbitMQ/rabbitmq-basis/pom.xml new file mode 100644 index 0000000..08e987b --- /dev/null +++ b/code/RabbitMQ/rabbitmq-basis/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.heibaiying + rabbitmq-basis + 1.0 + + + + com.rabbitmq + amqp-client + 5.6.0 + + + + \ No newline at end of file diff --git a/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Consumer.java b/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Consumer.java new file mode 100644 index 0000000..db55bda --- /dev/null +++ b/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Consumer.java @@ -0,0 +1,45 @@ +package com.heibaiying; + +import com.rabbitmq.client.*; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +/** + * 消费者 + */ +public class Consumer { + + private static final String QUEUE_NAME = "queue-hello"; + private static final String USER_NAME = "root"; + private static final String PASSWORD = "root"; + private static final String IP_ADDRESS = "192.168.200.229"; + /* RabbitMQ 服务默认的连接端口号 */ + private static final int PORT = 5672; + + public static void main(String[] args) throws Exception { + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(IP_ADDRESS); + factory.setPort(PORT); + factory.setUsername(USER_NAME); + factory.setPassword(PASSWORD); + Connection connection = factory.newConnection(); + final Channel channel = connection.createChannel(); + // 设置客户端最多接收多少个未被 Ack 的消息, 0 代表没有限制 + channel.basicQos(64); + DefaultConsumer consumer = new DefaultConsumer(channel) { + @Override + public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { + System.out.println("收到消息:" + new String(body)); + // 消息 Ack + channel.basicAck(envelope.getDeliveryTag(), false); + } + }; + channel.basicConsume(QUEUE_NAME, consumer); + // 等到回调函数执行后再关闭连接 + TimeUnit.SECONDS.sleep(5); + channel.close(); + connection.close(); + + } +} diff --git a/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Producer.java b/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Producer.java new file mode 100644 index 0000000..fa1b8cd --- /dev/null +++ b/code/RabbitMQ/rabbitmq-basis/src/main/java/com/heibaiying/Producer.java @@ -0,0 +1,45 @@ +package com.heibaiying; + +import com.rabbitmq.client.*; + +/** + * 生产者 + */ +public class Producer { + + private static final String EXCHANGE_NAME = "exchange-hello"; + private static final String ROUTING_KEY = "routingkey-hello"; + private static final String QUEUE_NAME = "queue-hello"; + private static final String USER_NAME = "root"; + private static final String PASSWORD = "root"; + private static final String IP_ADDRESS = "192.168.200.229"; + /* RabbitMQ 服务默认的连接端口号 */ + private static final int PORT = 5672; + + + public static void main(String[] args) throws Exception { + // 创建连接工厂 + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(IP_ADDRESS); + factory.setPort(PORT); + factory.setUsername(USER_NAME); + factory.setPassword(PASSWORD); + // 获取新的连接 + Connection connection = factory.newConnection(); + // 创建信道 + Channel channel = connection.createChannel(); + // 创建一个 type="direct"、持久化的、非自动删除的交换器 + channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null); + // 创建一个持久化、非排他的、非自动删除的队列 + channel.queueDeclare(QUEUE_NAME, true, false, false, null); + // 将交换器与队列通过路由键绑定 + channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY); + String message = "hello world"; + // 发送一条持久化的文本消息 + channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes()); + // 关闭信道 + channel.close(); + // 关闭连接 + connection.close(); + } +} diff --git a/notes/Java并发.md b/notes/Java并发.md new file mode 100644 index 0000000..1ce660c --- /dev/null +++ b/notes/Java并发.md @@ -0,0 +1,79 @@ +# Java 并发编程基础 + +## 一、线程基础 + +### 1.1 创建线程 + +创建线程通常以下两种方式: + +- 实现 Runnable 接口: + +```java +public class MyRunnable implements Runnable { + @Override + public void run() { + System.out.println("Runnable:" + Thread.currentThread().getId()); + } +} + +Thread thread = new Thread(new MyRunnable()); +thread.start(); +``` + +- 采用匿名内部类: + +```java +// 1.创建线程 +Thread thread = new Thread(new Runnable() { + @Override + public void run() { + System.out.println("Thread:" + Thread.currentThread().getId()); + } +}); +// 2.启动线程 +thread.start(); +``` + +```java +// 使用Java 8的lambda可以简写如下: +new Thread(() -> System.out.println("Thread:" + Thread.currentThread().getId())).start(); +``` + +由于 Thread类 实现了 Runnable 接口,所以两种方式本质上还是同一种。需要注意的是,当你使用 `new` 关键字创建了一个线程后,此时线程并没有开始执行,所以你还需要调用`start`方法启动线程。启动一个线程的实质是请求 Java 虚拟机运行相应的线程,而这个线程具体何时能够运行是由线程调度器(Scheduler)决定的,线程可能立即执行,也可能稍后运行,甚至有可能永远不会被执行。 + +### 1.2 线程属性 + +**编号(ID)** :用于标识线程的唯一编号,只读属性。 + +**名称(Name)**:用于区分不同线程的名称,可读可写。 + +**线程类别(Daemon)**:布尔类型,为 true 表示是守护线程,否则为用户线程,用户线程会阻止 Java 虚拟机正常停止,守护线程则不会。通常可以把一些不重要的线程设置为守护线程,比如监控其他线程工作的线程,当工作线程停止后,虚拟机就可以正常退出。在开发中我们可以使用`setDaemonn`方法设置线程为守护线程,该方法必须在`start`方法前调用,如果在其后调用,则会抛出`IllegalThreadStateException`异常。 + +**优先级(Priority)**:Java 线程支持 1~10 的 10个优先级,默认值为5,代表一般优先级。Java 线程的优先级本质上只是给线程调度器一个提示信息,它并不能保证线程一定按照优先级的高低顺序运行,所以它是不可靠的,需要谨慎使用。 + +需要说明的是在 Java 平台中,一个线程的线程类别,优先级都默认与其父线程相同。 + +### 1.3 线程状态 + +Java 线程的生命周期分为以下几个状态: + +**RUNABLE**:该状态包括两个子状态:READY 和 RUNING。处于 READY 状态的线程被称为活跃线程,被线程调度器选中后则开始运行,转化为 RUNING 状态。 + +**BLOCKED**:一个线程发起一个阻塞式 IO 操作后,或者申请一个由其他线程持有的独占资源(比如锁)时,相应的线程就会处于该状态。 + +**WAITING**:线程处于无时间限制的等待状态。 + +**TIMED_WAITING**:有时间限制的等待状态,如果在指定时间内并没有执行的特定的操作,则该线程自动转换为 RUNABLE。 + +**TERMINATED**:`Thread.run()`正常返回或者由于抛出异常而提前终止,则对应的线程都会处于终止状态。 + +各个状态之间的转换关系如下图: + +![线程完整生命周期](D:\Full-Stack-Notes\pictures\线程完整生命周期.jpg) + +## 二、线程同步机制 + + + + + diff --git a/notes/Linux常用Shell命令.md b/notes/Linux常用Shell命令.md new file mode 100644 index 0000000..8de6001 --- /dev/null +++ b/notes/Linux常用Shell命令.md @@ -0,0 +1,744 @@ +# Linux 常用Shell命令 + + + +## 一、Linux目录结构 + +| 目录名称 | 应放置文件的内容 | +| ----------- | --------------------------------------------------------- | +| /boot | 开机所需文件—内核、开机菜单以及所需配置文件等 | +| /dev | 以文件形式存放任何设备与接口 | +| /etc | 配置文件 | +| /home | 用户主目录 | +| /bin | 存放单用户模式下还可以操作的命令 | +| /lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 | +| /sbin | 开机过程中需要的命令 | +| /media | 用于挂载设备文件的目录 | +| /opt | 放置第三方的软件 | +| /root | 系统管理员的家目录 | +| /srv | 一些网络服务的数据文件目录 | +| /tmp | 任何人均可使用的“共享”临时目录 | +| /proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 | +| /usr/local | 用户自行安装的软件 | +| /usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 | +| /usr/share | 帮助与说明文件,也可放置共享文件 | +| /var | 主要存放经常变化的文件,如日志 | +| /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 | + +## 二、帮助命令 + +想要查看某个命令的帮助信息,可以使用 man 命令。执行 man 命令后,就进入到浏览页面,浏览页面常用按键及其用途如下: + +| 按键 | 用处 | +| --------- | ---------------------------------- | +| 空格键 | 向下翻一页 | +| PaGe down | 向下翻一页 | +| PaGe up | 向上翻一页 | +| home | 直接前往首页 | +| end | 直接前往尾页 | +| / | 从上至下搜索某个关键词,如“/linux” | +| ? | 从下至上搜索某个关键词,如“?linux” | +| n | 定位到下一个搜索到的关键词 | +| N | 定位到上一个搜索到的关键词 | +| q | 退出帮助文档 | + +## 三、Yum相关命令 + +| 命令 | 列出所有仓库 | +| ------------------------- | ---------------------------- | +| yum repolist all | 列出所有仓库 | +| yum list all | 列出仓库中所有软件包 | +| yum info 软件包名称 | 查看软件包信息 | +| yum install 软件包名称 | 安装软件包 | +| yum reinstall 软件包名称 | 重新安装软件包 | +| yum update 软件包名称 | 升级软件包 | +| yum remove 软件包名称 | 移除软件包 | +| yum clean all | 清除所有仓库缓存 | +| yum check-update | 检查可更新的软件包 | +| yum grouplist | 查看系统中已经安装的软件包组 | +| yum groupinstall 软件包组 | 安装指定的软件包组 | +| yum groupremove 软件包组 | 移除指定的软件包组 | +| yum groupinfo 软件包组 | 查询指定的软件包组信息 | + +## 四、服务相关命令 + +服务的启动、重启、停止、重载、查看状态等常用命令如下: + +| System V init 命令(RHEL 6系统) | systemctl命令(RHEL 7 系统) | 作用 | +| -------------------------------- | ----------------------------- | ------------------------------ | +| service foo start | systemctl start foo.service | 启动服务 | +| service foo restart | systemctl restart foo.service | 重启服务 | +| service foo stop | systemctl stop foo.service | 停止服务 | +| service foo reload | systemctl reload foo.service | 重新加载配置文件(不终止服务) | +| service foo status | systemctl status foo.service | 查看服务状态 | + +服务开机启动、不启动、查看各级别下服务启动状态等常用命令: + +| System V init 命令(RHEL 6系统) | systemctl命令(RHEL 7 系统) | 作用 | +| -------------------------------- | ---------------------------------------- | ---------------------------------- | +| chkconfig foo in | systemctl enable foo.service | 开机自动启动 | +| chkconfig foo off | systemctl disable foo.service | 开机不自动启动 | +| chkconfig foo | systemctl is-enable foo.service | 查看特定服务是否为开启自动启动 | +| chkconfig --list | systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 | + + +## 五、常用系统命令 + +### 1. echo + +echo 命令用于在终端输出字符串或变量提取后的值,格式为:echo [字符串 | $变量]。 + +```shell +[root@hadoop001 ~]# echo hello +hello +[root@hadoop001 ~]# echo $JAVA_HOME +/usr/java/jdk1.8.0_201 +``` + +### 2. date + +date 命令用于显示及设置系统的时间或日期。 + +**表: date命令中的参数以及作用** + +| 参数 | 作用 | +| ---- | -------------- | +| %t | 跳格[Tab键] | +| %H | 小时(00~23) | +| %I | 小时(00~12) | +| %M | 分钟(00~59) | +| %S | 秒(00~59) | +| %j | 今年中的第几天 | + +按照默认格式查看当前时间: + +```shell +[root@hadoop001 ~]# date +2019年 07月 02日 星期二 14:07:34 CST +``` + +按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示: + +```shell +[root@hadoop001 ~]# date "+%Y-%m-%d %H:%M:%S" +2019-07-02 14:07:52 +``` + +设置系统时间: + +```shell +[root@hadoop001 ~]# date -s "20190702 14:10:10" +2019年 07月 02日 星期二 14:10:10 CST +``` + +### 3. reboot + +reboot 命令用于重启系统,其格式为 reboot。 + +### 4. poweroff + +poweroff 命令用于关闭系统,其格式为 poweroff。 + +### 5. wget + +wget 命令用于在终端中下载网络文件,格式为: wget [参数] 下载地址。 + +**表:wget 命令的参数以及作用** + +| 参数 | 作用 | +| ---- | ------------------------------------ | +| -b | 后台下载模式 | +| -P | 下载到指定目录 | +| -t | 最大尝试次数 | +| -c | 断点续传 | +| -p | 下载页面内所有资源,包括图片、视频等 | +| -r | 递归下载 | + +示例:下载百度首页的内容到`/usr/baidu`目录下: + +```shell +[root@hadoop001 usr]# wget -r -p www.baidu.com -P /usr/baidu +``` + +### 6. ps + +ps 命令用于查看系统中的进程状态,格式为:ps [参数] ,常用参数如下: + +| 参数 | 作用 | +| ---- | ---------------------------------- | +| -a | 显示所有进程(包括其他用户的进程) | +| -u | 用户以及其他详细信息 | +| -x | 显示没有控制终端的进程 | + +在 Linux 系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。 + +- **R(运行)**:进程正在运行或在运行队列中等待。 +- **S(中断)**:进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。 +- **D(不可中断)**:进程不响应系统异步信号,即便用kill命令也不能将其中断。 +- **Z(僵死)**:进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。 +- **T(停止)**:进程收到停止信号后停止运行。 + +示例如下: + +```shell +[root@hadoop001 usr]# ps -u +USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND +root 2688 0.0 0.0 110092 856 tty1 Ss+ 13:45 0:00 /sbin/agetty -- +root 3679 0.0 0.1 115572 2216 pts/0 Ss 13:52 0:00 -bash +root 12471 0.0 0.1 155360 1888 pts/0 R+ 14:17 0:00 ps -u +``` + +各个参数的含义如下: + +| USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND | +| ------------ | -------- | ------------ | ---------- | ------------------------ | -------------------------- | -------- | -------- | ------------ | ----------------- | -------------- | +| 进程的所有者 | 进程ID号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是KB) | 占用的固定内存量(单位是KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 | + +### 7. top + +top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。 + +```shell +top - 14:21:25 up 35 min, 1 user, load average: 0.00, 0.02, 0.05 +Tasks: 104 total, 1 running, 103 sleeping, 0 stopped, 0 zombie +%Cpu(s): 0.5 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st +KiB Mem : 1882148 total, 1316728 free, 203592 used, 361828 buff/cache +KiB Swap: 2097148 total, 2097148 free, 0 used. 1497748 avail Mem + + PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND + 3680 root 20 0 113444 1776 1344 S 0.3 0.1 0:06.45 bash +13685 root 20 0 161880 2200 1560 R 0.3 0.1 0:00.09 top + 1 root 20 0 193696 6656 4180 S 0.0 0.4 0:03.10 systemd +``` + +top 命令执行结果的前5行为系统整体的统计信息,其所代表的含义如下: + +**第1行**:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。 + +**第2行**:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。 + +**第3行**:用户占用资源百分比(us)、系统内核占用资源百分比(sy)、改变过优先级的进程资源百分比(ni)、空闲的资源百分比(id)等。其中数据均为CPU数据并以百分比格式显示,例如`98.7 id`意味着有 98.7% 的 CPU 处理器资源处于空闲。 + +**第4行**:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。 + +**第5行**:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。 + +### 8. pidof + +pidof 命令用于查询某个指定服务进程的 PID 值,格式为:pidof \[参数][服务名称]。 + +### 9. kilL + +kill 命令用于终止某个指定 PID 的服务进程,格式为:kill \[参数][进程 PID]。 + +### 10. killall + +killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:killall \[参数][服务名称]。 + + + +## 六、状态检测命令 + +### 1. ifconfig + +ifconfig 命令用于获取网卡配置与网络状态等信息,格式为:ifconfig \[网络设备][参数]。 + +### 2. uname + +uname 命令用于查看系统内核与系统版本等信息,格式为:uname [-a]。-a 参数用来查看详细信息,主要有内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。 + +```shell +[root@hadoop001 ~]# uname -a +Linux hadoop001 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux +``` + +如果要查看当前系统版本的详细信息,可以使用如下命令: + +```shell +[root@hadoop001 ~]# cat /etc/redhat-release +CentOS Linux release 7.6.1810 (Core) +``` + +### 3. uptime + +uptime 用于查看系统的负载信息。显示**当前系统时间**、**系统已运行时间**、**启用终端数量**以及**平均负载值**等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况。 + +```shell +[root@hadoop001 ~]# uptime + 14:32:06 up 46 min, 1 user, load average: 0.00, 0.01, 0.05 +``` + +### 4. free + +free 用于显示当前系统中内存的使用量信息,格式为:free [-h]。 执行`free -h`命令后的输出信息如下: + +| | 内存总量 | 已用量 | 可用量 | 进程共享的内存量 | 磁盘缓存的内存量 | 缓存的内存量 | +| ----- | -------- | ------ | ------ | ---------------- | ---------------- | ------------ | +| | total | used | free | shared | buffers | cached | +| Mem: | 1.8G | 198M | 1.3G | 8.5M | 353M | 1.4G | +| Swap: | 2.0G | 0B | 2.0G | | | | + +swap 全称为 swap place,即交换区,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。 + +### 5. who + +who 用于查看当前登入主机的用户终端信息,格式为:who [参数]。 + +``` +[root@hadoop001 ~]# who +``` + +**表: 执行who命令的结果** + +| 登陆的用户名 | 终端设备 | 登陆到系统的时间 | +| ------------ | -------- | ---------------- | +| rootpts/0 | pts/0 | 2019-07-02 13:52 | + +### 6. last + +last 命令用于查看所有系统的登录记录,格式为:last [参数]。 + +### 7. history + +history 命令用于显示历史执行过的命令,格式为:history [-c],默认显示最近1000条命令记录。可以使用 `!序号` 的方式来重复执行某条命令。 + +### 8. sosreport + +sosreport 命令用于收集系统配置及架构信息并输出诊断文档。使用时如果找不到该命令,则需要先使用`yum install sos`命令来安装 sos 包。 + + + +## 七、目录相关命令 + +### 1. pwd + +显示当前所在的路径信息。 + +### 2. cd + +切换到指定目录,`cd -`命令返回到上一次所处的目录。 + +### 3. ls + +显示当前路径下的文件信息。想要查看文件的详细信息可以使用`ls -l `,也可以简写为`ll`。 + +## 八、文件编辑命令 + +### 1. cat + +cat 命令用于查看内容较少的纯文本文件,格式为:cat \[选项][文件]。常用参数为`-n`,代表带行号显示。 + +### 2. more + +more 命令用于查看内容较多的纯文本文件,格式为:more [选项]文件。可以使用空格键或回车键向下翻页。 + +### 3.head + +head 命令用于查看纯文本文档的前N行,格式为:head \[选项][文件]。 + +```shell +head -n 20 hdfs-site.xml +``` + +### 4. tail + +tail 命令用于查看纯文本文档的后N行或持续刷新内容,格式为:tail \[选项][文件]。 + +```shell +head -n 20 hdfs-site.xml +``` + +tail 命令可以持续观察一个文件新写入的内容,此时命令为:tail -f 文件名。 + +### 5. stat + +stat 命令用于查看文件的具体存储信息和时间等信息,示例如下: + +```shell +[root@hadoop001 hadoop]# stat hdfs-site.xml + 文件:"hdfs-site.xml" + 大小:1021 块:8 IO 块:4096 普通文件 +设备:fd00h/64768d Inode:3305180 硬链接:1 +权限:(0644/-rw-r--r--) Uid:( 1106/ UNKNOWN) Gid:( 4001/ UNKNOWN) +环境:unconfined_u:object_r:usr_t:s0 +最近访问:2019-07-02 14:50:22.700674460 +0800 +最近更改:2019-04-30 16:06:24.421716553 +0800 +最近改动:2019-04-30 16:06:24.423716557 +0800 +创建时间:- +``` + +### 6. diff + +diff 命令用于比较多个文本文件的差异,格式为:diff [参数] 文件。 常用参数如下: + +- 使用`-c`参数来详细比较出多个文件的差异之处 ; +- 使用`--brief`参数来确认两个文件是否不同。 + +```shell +diff -c diff_A.txt diff_B.txt +diff --brief diff_A.txt diff_B.txt +``` + +## 九、文件管理命令 + +### 1. touch + +touch 命令用于创建空白文件或设置文件的时间,格式为:touch \[选项][文件]。常用参数如下: + +| 参数 | 作用 | +| ---- | ----------------------- | +| -a | 仅修改读取时间(atime) | +| -m | 仅修改修改时间(mtime) | +| -d | 同时修改atime与mtime | + +```shell +[root@hadoop001 hadoop]# touch -d "2018-08-08 08:08" hdfs-site.xml +``` + +### 2. mkdir + +mkdir 命令用于创建空白的目录,格式为:mkdir [选项] 目录。常用参数为`-p`,代表递归创建: + +```shell +mkdir -p a/b/c/d/e +``` + +### 3. cp + +cp 命令用于复制文件或目录,格式为:`cp [选项] 源文件 目标文件`。 常用参数如下: + +| 参数 | 作用 | +| ---- | -------------------------------------------- | +| -p | 保留原始文件的属性 | +| -d | 若对象为“链接文件”,则保留该“链接文件”的属性 | +| -r | 递归持续复制(用于目录) | +| -i | 若目标文件存在则询问是否覆盖 | +| -a | 相当于 -pdr(p、d、r为上述参数) | + +### 4. mv + +mv 命令用于剪切文件或将文件重命名,格式为:`mv [选项] 源文件 [目标路径|目标文件名]`。 如果在同一个目录中对一个文件进行剪切操作,等价于对其进行重命名: + +```shell + mv yarn-site.xml hello.xml +``` + +### 5. rm + +rm 命令用于删除文件或目录,格式为:rm [选项] 文件。 常用参数如下: + +- `-f`:参数来强制删除; +- `-r` :参数递归删除文件夹。 + +### 6. file + +file 命令用于查看文件的类型,格式为:file 文件名。 + +```shell +[root@hadoop001 hadoop]# file yarn-site.xml +yarn-site.xml: XML 1.0 document, UTF-8 Unicode text +``` + + + +## 十、压缩与搜索命令 + +### 1. tar + +tar 命令用于对文件进行压缩或解压,格式为:tar \[选项] [文件]。 常用参数如下: + +| 参数 | 作用 | +| ---- | ---------------------- | +| -c | 创建压缩文件 | +| -x | 解开压缩文件 | +| -t | 查看压缩包内有哪些文件 | +| -z | 用Gzip压缩或解压 | +| -j | 用bzip2压缩或解压 | +| -v | 显示压缩或解压的过程 | +| -f | 目标文件名 | +| -p | 保留原始的权限与属性 | +| -P | 使用绝对路径来压缩 | +| -C | 指定解压到的目录 | + +常用打包命令:`tar -czvf 压缩包名称.tar.gz 要打包的目录`; + +常用解压命令:`tar -xzvf 压缩包名称.tar.gz`。 + +### 2. grep + +grep 命令用于执行关键词搜索,并显示匹配的结果,格式为:grep \[选项][文件]。 常用参数如下: + +| 参数 | 作用 | +| ---- | ------------------------------------------------ | +| -b | 将可执行文件(binary)当作文本文件(text)来搜索 | +| -c | 仅显示找到的行数 | +| -i | 忽略大小写 | +| -n | 显示行号 | +| -v | 反向选择——仅列出没有关键词的行。 | + +```shell +[root@hadoop001 hadoop]# cat core-site.xml | grep hadoop -n +22: hdfs://hadoop001:8020 +25: hadoop.proxyuser.root.hosts +29: hadoop.proxyuser.root.groups +``` + +### 3. find + +find 命令用于按照指定条件来查找文件,格式为:`find [查找路径] 寻找条件 操作`。 常用命令如下: + +| 参数 | 作用 | +| ------------------ | ------------------------------------------------------------ | +| -name | 匹配名称 | +| -perm | 匹配权限(mode为完全匹配,-mode为包含即可) | +| -user | 匹配所有者 | +| -group | 匹配所有组 | +| -mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) | +| -atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) | +| -ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) | +| -nouser | 匹配无所有者的文件 | +| -nogroup | 匹配无所有组的文件 | +| -newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 | +| --type b/d/c/p/l/f | 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) | +| -size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) | +| -prune | 忽略某个目录 | +| -exec …… {}\; | 后面可跟用于进一步处理搜索结果的命令 | + +获取到指定目录中所有以 host 开头的文件列表,可以执行如下命令: + +```shell +find /etc -name "host*" -print +``` + + + +## 十一、用户管理相关命令 + +### 1. useradd + +useradd 命令用于创建新的用户,格式为:useradd [选项] 用户名。使用该命令创建用户账户时,默认的用户家目录会被存放在`/home`目录中,默认的 Shell 解释器为`/bin/bash`,默认会创建一个与该用户同名的基本用户组。常用配置如下: + +| 参数 | 作用 | +| ---- | ---------------------------------------- | +| -d | 指定用户的家目录(默认为/home/username) | +| -e | 账户的到期时间,格式为YYYY-MM-DD. | +| -u | 指定该用户的默认UID | +| -g | 指定一个初始的用户基本组(必须已存在) | +| -G | 指定一个或多个扩展用户组 | +| -N | 不创建与用户同名的基本用户组 | +| -s | 指定该用户的默认 Shell 解释器 | + +```shell +[root@hadoop001 ~]# useradd heibaiying +[root@hadoop001 ~]# id heibaiying +uid=1000(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying) +``` + +UID就相当是用户的唯一标识,其赋值规则如下: + +- 管理员UID为0:系统的管理员用户。 +- 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。 +- 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。 + +### 2. groupadd + +groupadd 命令用于创建用户组,格式为:groupadd [选项] 群组名。 + +### 3. usermod + +创建后用户的信息保存在`/etc/passwd`文件中,可以直接对其进行编辑来修改用户参数,或使用 usermod 命令。常用参数如下: + +| 参数 | 作用 | +| ----- | ------------------------------------------------------------ | +| -c | 填写用户账户的备注信息 | +| -d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 | +| -e | 账户的到期时间,格式为YYYY-MM-DD | +| -g | 变更所属用户组 | +| -G | 变更扩展用户组 | +| -L | 锁定用户禁止其登录系统 | +| -U | 解锁用户,允许其登录系统 | +| -s | 变更默认终端 | +| -u | 修改用户的UID | + +```shell +[root@hadoop001 ~]# id heibaiying +uid=9999(heibaiying) gid=1000(heibaiying) 组=1000(heibaiying) +``` + +### 4. passwd + +passwd 命令用于设置或修改用户密码、过期时间、认证信息等,格式为:passwd \[选项][用户名]。常用参数如下: + +| 参数 | 作用 | +| ------- | ------------------------------------------------------------ | +| -l | 锁定用户,禁止其登录 | +| -u | 解除锁定,允许用户登录 | +| --stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" \| passwd --stdin Username | +| -d | 使该用户可用空密码登录系统 | +| -e | 强制用户在下次登录时修改密码 | +| -S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 | + +```shell +[root@hadoop001 ~]# passwd +更改用户 root 的密码 。 +新的 密码: +重新输入新的 密码: +passwd:所有的身份验证令牌已经成功更新。 +``` + +### 5. userdel + +userdel 命令用于删除用户,格式为:userdel [选项] 用户名。常用参数如下: + +| 参数 | 作用 | +| ---- | ------------------------ | +| -f | 强制删除用户 | +| -r | 同时删除用户及用户家目录 | + +## 十二、文件权限相关命令 + +使用 `ll` 命令可以查看到文件的详细属性,各个属性的含义如下: + +
+- -:普通文件。 +- d:目录文件。 +- l:链接文件。 +- b:块设备文件。 +- c:字符设备文件。 +- p:管道文件。 + +### 1. chmod + +chmod 用于设置文件或目录的权限,格式为:chmod [参数] 权限 文件或目录名称。 权限支持字符表示和数字表示两种形式,其对应关系如下: + +
+示例如下: + +``` +[root@hadoop001 ~]# ll test.txt +-rw-r--r--. 1 root root 0 7月 3 14:49 test.txt +[root@hadoop001 ~]# chmod 760 test.txt +[root@hadoop001 ~]# ll test.txt +-rwxrw----. 1 root root 0 7月 3 14:49 test.txt +``` + +### 2. chown + +chown 设置文件或目录的所有者和所属组,格式为:chown [参数] 所有者:所属组 文件或目录名称。 + +```shell +[root@hadoop001 ~]# stat test.txt +...... +权限:(0760/-rwxrw----) Uid:( 0/ root) Gid:( 0/ root) +...... +[root@hadoop001 ~]# chown heibaiying:heibaiying test.txt +[root@hadoop001 ~]# stat test.txt +...... +权限:(0760/-rwxrw----) Uid:( 9999/heibaiying) Gid:( 1000/heibaiying) +...... +``` + + +### 3. 软硬链接 + +**硬链接(hard link)**:可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。 + +**软链接(也称为符号链接[symbolic link])**:仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,与Windows系统中的快捷方式类似。 + +ln命令用于创建链接文件,格式为:ln [选项] 目标。常用参数如下: + +| 参数 | 作用 | +| ---- | ------------------------------------------------ | +| -s | 创建符号链接(如果不带-s参数,则默认创建硬链接) | +| -f | 强制创建文件或目录的链接 | +| -i | 覆盖前先询问 | +| -v | 显示创建链接的过程 | + +## 十三、Vim编辑器常用命令 + +Vim编辑器有三种状态模式: + +- 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。 +- 输入模式:正常的文本录入。 +- 末行模式:保存或退出文档,以及设置编辑环境。 + +
+命令模式中常用的命令如下: + +| 命令 | 作用 | +| ---- | -------------------------------------------------- | +| dd | 删除(剪切)光标所在整行 | +| 5dd | 删除(剪切)从光标处开始的5行 | +| yy | 复制光标所在整行 | +| 5yy | 复制从光标处开始的5行 | +| n | 显示搜索命令定位到的下一个字符串 | +| N | 显示搜索命令定位到的上一个字符串 | +| u | 撤销上一步的操作 | +| p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 | + +末行模式中可用的命令如下: + +| 命令 | 作用 | +| ------------- | --------------------------------------- | +| :w | 保存 | +| :q | 退出 | +| :q! | 强制退出(放弃对文档的修改内容) | +| :wq! | 强制保存退出 | +| :set nu | 显示行号 | +| :set nonu | 不显示行号 | +| :命令 | 执行该命令 | +| :整数 | 跳转到该行 | +| :s/one/two | 将当前光标所在行的第一个 one 替换成 two | +| :s/one/two/g | 将当前光标所在行的所有 one 替换成 two | +| :%s/one/two/g | 将全文中的所有 one 替换成 two | +| ?字符串 | 在文本中从下至上搜索该字符串 | +| /字符串 | 在文本中从上至下搜索该字符串 | + +使用 a、 i、 o 三个键从命令模式切换到输入模式。其中, a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 **o 键则是在光标的下面再创建一个空行**,此时可敲击 a 键进入到编辑器的输入模式。 + +## 十四、输入输出重定向 + +输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。同时输出重定向又分为标准输出重定向和错误输出重定向。 + +- 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。 +- 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。 +- 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。 + +输入重定向中用到的符号及其作用如下: + +| 符号 | 作用 | +| -------------------- | -------------------------------------------- | +| 命令 < 文件 | 将文件作为命令的标准输入 | +| 命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 | +| 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 | + +输出重定向中用到的符号及其作用如下: + +| 符号 | 作用 | +| ------------------------------------- | ------------------------------------------------------------ | +| 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) | +| 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) | +| 命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) | +| 命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) | +| 命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) | + + + +## 参考资料 + +[《Linux 就该这么学》刘遄](https://www.linuxprobe.com/chapter-00.html) \ No newline at end of file diff --git a/notes/RabbitMQ简介.md b/notes/RabbitMQ简介.md new file mode 100644 index 0000000..fef54a7 --- /dev/null +++ b/notes/RabbitMQ简介.md @@ -0,0 +1,112 @@ +# RabbitMQ 简介 + +## 一、简介 + +RabbitMQ 是目前最为广泛使用的开源消息中间件,它具备以下的特点: + +支持多种消息传递协议,拥有丰富的交换器类型,能够将消息灵活路由到各个队列; + +轻量级,支持多种部署方式,易于部署在公共云和私有云中; + +支持跨语言开发,如:Java,.NET,PHP,Python,JavaScript,Ruby,Go; + +可以通过集群来实现高可用性和高吞吐,还可以通过 Federation 插件来连接不同的服务; + +插拔式的身份验证和授权,支持TLS和LDAP; + +支持持续集成,能够使用各种工具和插件进行灵活地扩展; + +能够使用多种方式进行监控和管理,如 HTTP-API,命令行工具和 UI 界面。 + +## 二、模型架构 + +![rabbitmq-架构](D:\Full-Stack-Notes\pictures\rabbitmq-架构.jpg) + +### 2.1 核心概念 + +**1. Exchange(交换器)** + +负责将消息路由到一个或者多个队列中。 + +**2. Queue(消息队列)** + +用于存储消息。多个消费者可以订阅同一个消息队列,此时候队列中的消息会被平均分配给多个消费者进行处理。 + +**3. BindingKey (绑定键)** + +交换器与队列通过 BindingKey 进行绑定。 + +**4. Routingkey (路由键)** + +生产者将消息发给交换器的时候,一般会指定一个 RountingKey,用来指定这个消息的路由规则。当 RountingKey 与 BindingKey 在规则上相符合时,消息被路由到对应的队列中。 + +### 2.2 运转流程 + +**生产者发送消息过程**: + +1. 生产者连接到RabbitMQ Broker , 建立一个连接(Connection), 开启一个信道(Channel); +2. 生产者声明一个交换器,并设置相关属性; +3. 生产者声明一个队列并设置相关属性; +4. 生产者通过路由键将交换器与队列绑定起来; +5. 生产者发送消息至 RabbitMQ Broker ,其中包含路由键、交换器等信息; +6. 相应的交换器根据接收到的路由键查找相应的匹配队列; +7. 如果找到,则将从生产者发送过来的消息存入相应的队列中; +8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者; +9. 关闭信道; +10. 关闭连接。 + +**消费者接收消息的过程**: + +1. 消费者连接到 RabbitMQ Broker, 建立一个连接(Connection), 开启一个信道(Channel); +2. 消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数; +3. 等待 RabbitMQ Broker 回应并投递相应对列中的消息,消费者接收消息; +4. 消费者确认(ack)接收到的消息; +5. RabbitMQ 从队列中删除相应已经被确认的消息; +6. 关闭信道; +7. 关闭连接。 + +### 2.3 连接与信道 + +生产者和消费者都需要与 Broker 建立 TCP 连接,但由于创建和销毁 TCP 的操作非常昂贵,所以 RabbitMQ 采用了连接复用的方式,在同一个 TCP 连接上建立多个互相独立的信道。 + +## 三、交换器类型 + +### 3.1 fanout + +把消息路由到与该交换器绑定的所有队列中。 + +### 3.2 direct + +把消息路由到 BindingKey 和 RountingKey 完全一样的队列中。 + +### 3.3 topic + +将消息路由到 BindingKey 和 RountingKey 相匹配的队列中,匹配规则如下: + +- RountingKey 和 BindingKey 由多个单词使用`.`号进行连接; +- BindingKey 支持两个特殊符号:`#`和`*` 。其中`*`用于匹配一个单词,`#`用于匹配零个或者多个单词。 + +以下是官方文档中的示例,交换器与队列的 BindingKey 如图所示: + +![topic-exchange](D:\Full-Stack-Notes\pictures\topic-exchange.png) + ++ 路由键为`lazy.orange.elephant`的消息会发送给所有队列; ++ 路由键为`quick.orange.fox`的消息只会发送给第一个队列; ++ 路由键为`lazy.brown.fox`的消息只会发送给第二个队列; ++ 路由键为`lazy.pink.rabbit`的消息只会发送给第二个队列; ++ 路由键为`quick.brown.fox`的消息与任何绑定都不匹配; ++ 路由键为`orange`或`quick.orange.male.rabbit`的消息也与任何绑定都不匹配。 + +### 3.4 headers + +在 Queue 与 Exchange 进行绑定时可以指定一组键值对作为 BindingKey;在发送消息的 headers 中的可以指定一组键值对属性,当这些属性与 BindingKey 相匹配时,则将消息路由到该队列。同时还可以使用 `x-match`指定匹配模式: + +- **x-match = all** :所有的键值对都相同才算匹配成功; +- **x-match = any**:只要有一个键值对相同就算匹配成功。 + +## 四、死信队列 + + + + + diff --git a/notes/installation/RabbitMQ单机环境搭建.md b/notes/installation/RabbitMQ单机环境搭建.md new file mode 100644 index 0000000..a166910 --- /dev/null +++ b/notes/installation/RabbitMQ单机环境搭建.md @@ -0,0 +1,169 @@ +# RabbitMQ 单机环境搭建 + +## 一、前置条件 + +RabbitMQ 由 Erlang 语言所编写,所以在安装 RabbitMQ 前需要安装 Erlang 。两者的版本兼容关系如下。本篇文章选用的 RabbitMQ 版本为 3.7.15 , Erlang 版本为 22.0 。 + +| RabbitMQ version | Minimum required Erlang/OTP | Maximum supported Erlang/OTP | +| :----------------------------------------------------------- | :-------------------------- | :--------------------------- | +| 3.7.15 | 20.3.x | 22.0.x | +| 3.7.7 ~ 3.7.14 | 20.3.x | 21.3.x | +| 3.7.0 ~ 3.7.6 | 19.3 | 20.3.x | + +> 表格来源:https://www.rabbitmq.com/which-erlang.html + + + +## 二、Erlang 安装 + +### 2.1 下载并解压 + +Erlang 源码包下载地址:http://erlang.org/download/ ,下载后进行解压: + +```shell +# 下载 +wget http://erlang.org/download/otp_src_22.0.tar.gz +# 解压 +tar -zxvf otp_src_22.0.tar.gz +``` + +### 2.2 编译和安装 + +Erlang 的编译过程中使用到了 `ncurses-devel` 库,需要预先安装: + +``` +yum install ncurses-devel +``` + +进入解压后的根目录: + +```shell +# 配置安装目录 +./configure --prefix=/usr/app/erlang +# 编译 +make +# 安装 +make install +``` + +### 2.3 验证安装结果 + +进入安装目录的 bin 目录下,执行 `erl`命令,出现对应的版本号信息则代表安装成功: + +```shell +[root@hadoop001 bin]# ./erl +Erlang/OTP 22 [erts-10.4] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] +Eshell V10.4 (abort with ^G) +``` + +### 2.4 配置环境变量 + +```she +vim /etc/profile +``` + +配置环境变量: + +```shell +export ERLANG_HOME=/usr/app/erlang +export PATH=$PATH:$ERLANG_HOME/bin +``` + +使得配置的环境变量立即生效: + +```shell +source /etc/profile +``` + + + +## 三、RabbitMQ 安装 + +### 3.1 下载并解压 + +从 RabbitMQ 的 GitHub 仓库进行下载,地址为:https://github.com/rabbitmq/rabbitmq-server/releases/ : + +```shell +# 下载 +wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz +# 解压 +tar -Jxf rabbitmq-server-generic-unix-3.7.15.tar.xz + +``` + +### 3.2 配置环境变量 + +```she +vim /etc/profile +``` + +配置环境变量: + +```shell +export RABBITMQ_HOME=/usr/app/rabbitmq_server-3.7.15 +export PATH=$PATH:$RABBITMQ_HOME/sbin +``` + +使得配置的环境变量立即生效: + +```shell +source /etc/profile +``` + +### 3.3 启动 RabbitMQ 服务 + +以后台守护进程的方式启动 RabbitMQ ,命令如下: + +```shell +rabbitmq-server start -detached +``` + +### 3.4 查看服务状态 + +```shell +rabbitmqctl status +``` + + + +## 四、Web UI界面 + +### 4.1 启动 Web UI + +想要使用 RabbitMQ 的 Web UI 界面,需要启动管理插件,命令如下: + +```shell +rabbitmq-plugins enable rabbitmq_management +``` + +访问端口为 `15672`。默认的用户名和密码都是 `guest` 。如果你所用浏览器和 RabbitMQ 服务不在同一台主机上,此时应该无法登录,并出现下面的提示 : + +![RabbitMQ-访问限制](D:\Full-Stack-Notes\pictures\RabbitMQ-访问限制.png) + +之所以会出现这个提示,是因为出于安全考虑,RabbitMQ 只允许在本机使用默认的`guest`用户名登录。想要在其他主机上登录,可以使用自定义的账户。 + +### 4.2 新增账户 + +新增用户,用户名和密码都是 root : + +```sh +rabbitmqctl add_user root root +``` + +赋予用户在默认的名为 `/` 的 Virtual Host 上的所有权限: + +```shell +rabbitmqctl set_permissions -p / root '.*' '.*' '.*' +``` + +设置用户的角色为管理员: + +``` +rabbitmqctl set_user_tags root administrator +``` + +### 4.3 使用新账户登录 + +登录后可以查看到RabbitMQ 和 Erlang 的版本号,以及对应的账户信息: + +![rabbitmq-管控台](D:\Full-Stack-Notes\pictures\rabbitmq-管控台.png) \ No newline at end of file diff --git a/notes/installation/Redis单机环境搭建.md b/notes/installation/Redis单机环境搭建.md new file mode 100644 index 0000000..7e2589d --- /dev/null +++ b/notes/installation/Redis单机环境搭建.md @@ -0,0 +1,58 @@ +# Redis 单机环境搭建 + +### 一、下载并解压 + +下载地址:http://download.redis.io/releases/ ,下载后进行解压: + +```shell +# 下载 +http://download.redis.io/releases/redis-5.0.5.tar.gz +# 解压 +tar -zxvf redis-5.0.5.tar.gz +``` + +### 二、编译 + +进入解压后的根目录,执行下面的命令: + +```shell +make +``` + +### 三、启动服务 + +进入`src`目录,执行下面的命令,启动 Redis 服务: + +```shell +redis-server +``` + +### 四、启动客户端 + +在`src`目录下,执行以下命令启动客户端: + +```shell +# 不加任何参数默认连接的也是 127.0.0.1:6379 +redis-cli -h 127.0.0.1 -p 6379 +``` + +### 五、修改访问配置 + +默认情况下,不能从其他主机访问 Redis 服务。如果想要从其他主机访问 Redis 服务,需要修改根目录下的` redis.conf`: + +```shell +bind 127.0.0.1 +``` + +默认绑定的是本机地址,可以改成其他地址。如果想要所有主机都能访问,需要注释掉上面一行,同时将保护模式关闭: + +```shell +protected-mode no +``` + +修改完成后,以指定配置的方式启动: + +```shell +./redis-server ../redis.conf +``` + diff --git a/notes/《Linux就该这么学》读书笔记.md b/notes/《Linux就该这么学》读书笔记.md deleted file mode 100644 index cd6937d..0000000 --- a/notes/《Linux就该这么学》读书笔记.md +++ /dev/null @@ -1,1672 +0,0 @@ - - -# 《linux就该这么学》读书笔记 - -## 目录
-第一章 部署虚拟环境安装Linux系统
-    1.6 Yum 软件仓库
-    1.7 systemd 初始化进程
-第二章 新手必须掌握的Linux命令
-    2.2 执行查看帮助命令
-    2.3 常用系统工作命令
-        1. echo命令
-        2. date命令
-        3. reboot 命令
-        4. poweroff命令
-        5. wget命令
-        6. ps 命令
-        7. top 命令
-        8. pidof 命令
-        9. kill命令
-        10. killall 命令
-    2.4 系统状态检测命令
-        1. ifconfig 命令
-        2. uname 命令
-        3. uptime 命令
-        4. free 命令
-        5. who 命令
-        6. last 命令
-        7. history 命令
-        8. sosreport 命令
-        1. pwd 命令
-        2. cd 命令
-        3. ls命令
-    2.6 文本文件编辑命令
-        1. cat 命令
-        2. more 命令
-        3.head 命令
-        4. tail 命令
-        5. tr 命令
-        6. wc 命令
-        7. stat 命令
-        8. cut命令
-        9. diff 命令
-        1. touch 命令
-        2. mkdir 命令
-        3. cp 命令
-        4. mv 命令
-        5. rm 命令
-        6. dd 命令
-        7. file命令
-    2.8 打包压缩与搜索命令
-        1. tar 命令
-        2. grep 命令
-        3. find命令
-第三章 管道符、重定向与环境变量
-    3.1 输入输出重定向
-    3.2 管道运算符
-    3.3 命令通配符
-    3.4 常用的转义字符
-    3.5 重要的环境变量
-第四章 Vim 编辑器与 shell 脚本命令
-    4.1 vim编辑器
-    4.2 编写的脚本
-        4.2.1 编写简单的脚本
-        4.2.2 接受用户参数
-4.3 流程控制语句
-4.4 计划任务服务程序
-第五章 用户身份与文件权限
-    5.1 用户身份与能力
-        1. useradd 命令
-        2. groupadd 命令
-        3. usermod 命令
-        4. passwd 命令
-        5. userdel 命令
-    5.2 文件权限与归属
-    5.3 文件的特殊权限
-        5.3.1 SUID
-        5.3.2 SGID
-            1.chmod命令
-            2.chown命令
-        5.3.3 SBIT
-    5.4 文件的隐藏属性
-        1. chattr命令
-        2. lsattr 命令
-    5.5 文件访问控制列表
-        5.5.1 setfacl 命令
-        5.5.2 getfacl 命令
-    5.6 su命令与sudo服务
-第六章 存储结构与磁盘划分
-    6.1 一切从“/”开始
-    6.2 物理设备的命名规则
-    6.4 挂载硬件设备
-        1.挂载
-        2.永久挂载
-        3.撤消挂载
-    6.8 软硬链接连接方式
-        1. ln 命令
-第八章 Iptables与Firewalld防火墙
-    8.2 iptables
-        8.2.1 策略与规则链
-        8.2.2 基本的命令参数
-    8.3 Firewalld
-        8.3.1 终端管理工具
-## 正文
- - -## 第一章 部署虚拟环境安装Linux系统 - -### 1.6 Yum 软件仓库 - -**表:常见的yum命令** - -| 命令 | 列出所有仓库 | -| ------------------------- | ---------------------------- | -| yum repolist all | 列出所有仓库 | -| yum list all | 列出仓库中所有软件包 | -| yum info 软件包名称 | 查看软件包信息 | -| yum install 软件包名称 | 安装软件包 | -| yum reinstall 软件包名称 | 重新安装软件包 | -| yum update 软件包名称 | 升级软件包 | -| yum remove 软件包名称 | 移除软件包 | -| yum clean all | 清除所有仓库缓存 | -| yum check-update | 检查可更新的软件包 | -| yum grouplist | 查看系统中已经安装的软件包组 | -| yum groupinstall 软件包组 | 安装指定的软件包组 | -| yum groupremove 软件包组 | 移除指定的软件包组 | -| yum groupinfo 软件包组 | 查询指定的软件包组信息 | - - - -### 1.7 systemd 初始化进程 - -**表:systemctl 管理服务的启动、重启、停止、重载、查看状态等常用命令** - -| System V init 命令(RHE6系统) | systemctl命令(RHEL 7 系统) | 作用 | -| ------------------------------ | ----------------------------- | ------------------------------ | -| service foo start | systemctl start foo.service | 启动服务 | -| service foo restart | systemctl restart foo.service | 重启服务 | -| service foo stop | systemctl stop foo.service | 停止服务 | -| service foo reload | systemctl reload foo.service | 重新加载配置文件(不终止服务) | -| service foo status | systemctl status foo.service | 查看服务状态 | - - - -**表:systemctl 设置服务开机启动、不启动、查看各级别下服务启动状态等常用命令** - -| System V init 命令(RHE6系统) | systemctl命令(RHEL 7 系统) | 作用 | -| ------------------------------ | ---------------------------------------- | ---------------------------------- | -| chkconfig foo in | systemctl enable foo.service | 开机自动启动 | -| chkconfig foo off | systemctl disable foo.service | 开机不自动启动 | -| chkconfig foo | systemctl is-enable foo.service | 查看特定服务是否为开启自动启动 | -| chkconfig --list | systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 | - - - -```shell -[root@localhost ~]# chkconfig docker -注意:正在将请求转发到“systemctl is-enabled docker.service”。 -enabled -``` - - - -## 第二章 新手必须掌握的Linux命令 - -### 2.2 执行查看帮助命令 - -**表:man命令中常用按键以及用途** - -| 按键 | 用处 | -| --------- | ---------------------------------- | -| 空格键 | 向下翻一页 | -| PaGe down | 向下翻一页 | -| PaGe up | 向上翻一页 | -| home | 直接前往首页 | -| end | 直接前往尾页 | -| / | 从上至下搜索某个关键词,如“/linux” | -| ? | 从下至上搜索某个关键词,如“?linux” | -| n | 定位到下一个搜索到的关键词 | -| N | 定位到上一个搜索到的关键词 | -| q | 退出帮助文档 | - -### 2.3 常用系统工作命令 - -#### 1. echo命令 - -echo 命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]”。 - -```shell -[root@localhost ~]# echo hello -hello -[root@localhost ~]# echo $SHELL -/bin/bash -``` - -#### 2. date命令 - -date命令用于显示及设置系统的时间或日期。 - -**表: date命令中的参数以及作用** - -| 参数 | 作用 | -| ---- | -------------- | -| %t | 跳格[Tab键] | -| %H | 小时(00~23) | -| %I | 小时(00~12) | -| %M | 分钟(00~59) | -| %S | 秒(00~59) | -| %j | 今年中的第几天 | - -按照默认格式查看当前系统时间的date命令如下所示: - -```shell -[root@linuxprobe ~]# date -Mon Aug 24 16:11:23 CST 2017 -``` - -按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示: - -```shell -[root@linuxprobe ~]# date "+%Y-%m-%d %H:%M:%S" -2017-08-24 16:29:12 -``` - -将系统的当前时间设置为2017年9月1日8点30分的date命令如下所示: - -```shell -[root@linuxprobe ~]# date -s "20170901 8:30:00" -Fri Sep 1 08:30:00 CST 2017 -``` - -再次使用date命令并按照默认的格式查看当前的系统时间,如下所示: - -```shell -[root@linuxprobe ~]# date -Fri Sep 1 08:30:01 CST 2017 -``` - -date命令中的参数%j可用来查看今天是当年中的第几天。 - -```shell -[root@linuxprobe ~]# date "+%j" -244 -``` - -#### 3. reboot 命令 - -reboot 命令用于重启系统,其格式为 reboot。 - -#### 4. poweroff命令 - -poweroff 命令用于关闭系统,其格式为 poweroff。 - -#### 5. wget命令 - -wget 命令用于在终端中下载网络文件,格式为“wget [参数] 下载地址”。 - -**表:wget 命令的参数以及作用** - -| 参数 | 作用 | -| ---- | ------------------------------------ | -| -b | 后台下载模式 | -| -P | 下载到指定目录 | -| -t | 最大尝试次数 | -| -c | 断点续传 | -| -p | 下载页面内所有资源,包括图片、视频等 | -| -r | 递归下载 | - -wget 命令递归下载 www.linuxprobe.com 网站内的所有页面数据以及文件,下载完后会自动保存到当前路径下一个名为 www.linuxprobe.com 的目录中。 - -```shell -[root@localhost ~]# wget -r -p http://www.linuxprobe.com -``` - -#### 6. ps 命令 - -ps 命令用于查看系统中的进程状态,格式为“ps [参数]”。 - -**表:ps 命令的参数以及作用** - -| 参数 | 作用 | -| ---- | ---------------------------------- | -| -a | 显示所有进程(包括其他用户的进程) | -| -u | 用户以及其他详细信息 | -| -x | 显示没有控制终端的进程 | - -在Linux系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止,其各自含义如下所示。 - -> **R(运行)**:进程正在运行或在运行队列中等待。 -> -> **S(中断)**:进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。 -> -> **D(不可中断)**:进程不响应系统异步信号,即便用kill命令也不能将其中断。 -> -> **Z(僵死)**:进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。 -> -> **T(停止)**:进程收到停止信号后停止运行。 - -| USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND | -| ------------ | -------- | ------------ | ---------- | ------------------------ | -------------------------- | -------- | -------- | ------------ | ----------------- | -------------- | -| 进程的所有者 | 进程ID号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是KB) | 占用的固定内存量(单位是KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 | - -```shell -USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND -root 1 0.0 0.6 128148 6736 ? Ss 09:41 0:03 /usr/lib/systemd -root 2 0.0 0.0 0 0 ? S 09:41 0:00 [kthreadd] -root 3 0.0 0.0 0 0 ? S 09:41 0:00 [ksoftirqd/0] -root 5 0.0 0.0 0 0 ? S< 09:41 0:00 [kworker/0:0H] -root 7 0.0 0.0 0 0 ? S 09:41 0:00 [migration/0] -root 8 0.0 0.0 0 0 ? S 09:41 0:00 [rcu_bh] -root 9 0.0 0.0 0 0 ? R 09:41 0:01 [rcu_sched] -root 10 0.0 0.0 0 0 ? S< 09:41 0:00 [lru-add-drain] -root 11 0.0 0.0 0 0 ? S 09:41 0:00 [watchdog/0] -root 13 0.0 0.0 0 0 ? S 09:41 0:00 [kdevtmpfs] -``` - -#### 7. top 命令 - -top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。 - -```shell -top - 10:59:52 up 1:18, 2 users, load average: 0.00, 0.01, 0.05 -Tasks: 90 total, 2 running, 88 sleeping, 0 stopped, 0 zombie -%Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st -KiB Mem : 1015508 total, 586988 free, 116684 used, 311836 buff/cache -KiB Swap: 1048572 total, 1048572 free, 0 used. 730224 avail Mem - - PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND - 1890 root 20 0 161840 2164 1552 R 0.7 0.2 0:00.18 top - 1000 root 20 0 573816 19080 6060 S 0.3 1.9 0:01.53 tuned - 1812 root 20 0 0 0 0 S 0.3 0.0 0:01.92 kworker/0:0 - 1 root 20 0 128148 6736 4216 S 0.0 0.7 0:03.38 systemd - 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd - 3 root 20 0 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/0 - 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H - 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 - 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh - 9 root 20 0 0 0 0 R 0.0 0.0 0:01.09 rcu_sched - 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-dr -``` - -top命令执行结果的前5行为系统整体的统计信息,其所代表的含义如下。 - -> 第1行:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。 -> -> 第2行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。 -> -> 第3行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。其中数据均为CPU数据并以百分比格式显示,例如“97.1 id”意味着有97.1%的CPU处理器资源处于空闲。 -> -> 第4行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。 -> -> 第5行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。 - -#### 8. pidof 命令 - -pidof 命令用于查询某个指定服务进程的 PID 值,格式为“pidof \[参数][服务名称]”。 - -#### 9. kill命令 - -kill 命令用于终止某个指定 PID 的服务进程,格式为“kill \[参数][进程 PID]”。 - -#### 10. killall 命令 - -killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:“killall \[参数][服务名称]”。 - - - -### 2.4 系统状态检测命令 - -#### 1. ifconfig 命令 - -ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig \[网络设备][参数]”。 - -#### 2. uname 命令 - -uname命令用于查看系统内核与系统版本等信息,格式为“uname [-a]”。 - -在使用uname命令时,一般会固定搭配上-a参数来完整地查看当前系统的内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。 - -```shell -[root@linuxprobe ~]# uname -a -Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux -``` - -顺带一提,如果要查看当前系统版本的详细信息,则需要查看redhat-release文件,其命令以及相应的结果如下: - -```shell -[root@linuxprobe ~]# cat /etc/redhat-release -Red Hat Enterprise Linux Server release 7.0 (Maipo) -``` - -#### 3. uptime 命令 - -uptime用于查看系统的负载信息。 - -显示**当前系统时间**、**系统已运行时间**、**启用终端数量**以及**平均负载值**等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况(下面加粗的信息部分);负载值越低越好,尽量不要长期超过1,在生产环境中不要超过5。 - -```shell -[root@linuxprobe ~]# uptime -22:49:55 up 10 min, 2 users, load average: 0.01, 0.19, 0.18 -``` - -#### 4. free 命令 - -free 用于显示当前系统中内存的使用量信息,格式为“free [-h]”。 - -**swap**全称为swap place,即交换区,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。 - -**表:执行free -h命令后的输出信息** - -| | 内存总量 | 已用量 | 可用量 | 进程共享的内存量 | 磁盘缓存的内存量 | 缓存的内存量 | -| ------------------ | -------- | ------ | ------ | ---------------- | ---------------- | ------------ | -| | total | used | free | shared | buffers | cached | -| Mem: | 1.8G | 1.3G | 542M | 9.8M | 1.6M | 413M | -| -/+ buffers/cache: | | 869M | 957M | | | | -| Swap: | 2.0G | 0B | 2.0G | | | | - -#### 5. who 命令 - -who用于查看当前登入主机的用户终端信息,格式为“who [参数]”。 - -``` -[root@linuxprobe ~]# who -``` - -**表: 执行who命令的结果** - -| 登陆的用户名 | 终端设备 | 登陆到系统的时间 | -| ------------ | -------- | --------------------- | -| root | :0 | 2017-08-24 17:52 (:0) | -| root | pts/0 | 2017-08-24 17:52 (:0) | - -#### 6. last 命令 - -last 命令用于查看所有系统的登录记录,格式为“last [参数]”。 - -#### 7. history 命令 - -history命令用于显示历史执行过的命令,格式为“history [-c]”。 - -执行history命令能显示出当前用户在本地计算机中执行过的最近1000条命令记录。如果觉得1000不够用,还可以自义/etc/profile文件中的HISTSIZE变量值。在使用history命令时,如果使用-c参数则会清空所有的命令历史记录。还可以使用“!编码数字”的方式来重复执行某一次的命令。 - -#### 8. sosreport 命令 - -sosreport命令用于收集系统配置及架构信息并输出诊断文档,格式为sosreport。 - - - -### 2.5 工作目录切换命令 - -#### 1. pwd 命令 - -#### 2. cd 命令 - -“cd -”命令返回到上一次所处的目录 - -#### 3. ls命令 - - - -### 2.6 文本文件编辑命令 - -#### 1. cat 命令 - -cat 命令用于查看纯文本文件(内容较少的),格式为“cat \[选项][文件]”。 - -- -n 带行号显示。 - -#### 2. more 命令 - -more 命令用于查看纯文本文件(内容较多的),格式为“more [选项]文件”。 可以使用空格键或回车 -键向下翻页。 - -#### 3.head 命令 - -head 命令用于查看纯文本文档的前 N 行,格式为“head \[选项][文件]”。 - -```shell -head -n 20 initial-setup-ks.cfg -``` - -#### 4. tail 命令 - -tail 命令用于查看纯文本文档的后 N 行或持续刷新内容,格式为“tail \[选项][文件]”。 - -```shell -head -n 20 initial-setup-ks.cfg -``` - -tail 命令最强悍的功能是可以持续刷新一个文件的内容,当想要实时查看最新日志文件时,这特别有用,此时的命令格式为“tail -f 文件名”。 - -#### 5. tr 命令 - -tr 命令用于替换文本文件中的字符,格式为“tr \[原始字符][目标字符]”。 - -```shell -cat anaconda-ks.cfg | tr [a-z] [A-Z] -``` - -#### 6. wc 命令 - -wc 命令用于统计指定文本的行数、字数、字节数,格式为“wc [参数] 文本”。 - -| 参数 | 作用 | -| ---- | ------------ | -| -l | 只显示行数 | -| -w | 只显示单词数 | -| -c | 只显示字节数 | - -#### 7. stat 命令 - -stat 命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名称”。 - -```shell -stat anaconda-ks.cfg -``` - -#### 8. cut命令 - -cut 命令用于按“列”提取文本字符,格式为“cut [参数] 文本”。 - -- -f 参数来设置需要看的列数, -- -d 参数来设置**间隔符号** - -```shell -cut -d: -f1 /etc/passwd -``` - -#### 9. diff 命令 - -diff 命令用于比较多个文本文件的差异,格式为“diff [参数] 文件”。 - -- 使用-c 参数来详细比较出多个文件的差异之处 -- 使用--brief 参数来确认两个文件是否不同 - -```shell -diff --brief diff_A.txt diff_B.txt -diff -c diff_A.txt diff_B.txt -``` - -### 2.7 文件目录管理命令 - -#### 1. touch 命令 - -touch 命令用于创建空白文件或**设置文件的时间**,格式为“touch \[选项][文件]”。 - - **表: touch命令的参数及其作用** - -| 参数 | 作用 | -| ---- | ------------------------- | -| -a | 仅修改“读取时间”(atime) | -| -m | 仅修改“修改时间”(mtime) | -| -d | 同时修改atime与mtime | - -```shell -touch -d "2017-05-04 15:44" anaconda-ks.cfg -``` - -#### 2. mkdir 命令 - -mkdir 命令用于创建空白的目录,格式为“mkdir [选项] 目录”。 - -- -p 参数来递归创建出具有嵌套叠层关系的文件目录 - -```shell -mkdir -p a/b/c/d/e -``` - -#### 3. cp 命令 - -cp 命令用于复制文件或目录,格式为“cp [选项] 源文件 目标文件”。 - -**表: cp命令的参数及其作用** - -| 参数 | 作用 | -| ---- | -------------------------------------------- | -| -p | 保留原始文件的属性 | -| -d | 若对象为“链接文件”,则保留该“链接文件”的属性 | -| -r | 递归持续复制(用于目录) | -| -i | 若目标文件存在则询问是否覆盖 | -| -a | 相当于-pdr(p、d、r为上述参数) | - -#### 4. mv 命令 - -mv 命令用于剪切文件或将文件重命名,格式为“mv [选项] 源文件 [目标路径|目标文件名]”。 如果在同一个目录中对一个文件进行剪切操作,其实也就是对其进行重命名: - -```shell -mv x.log linux.log -``` - -#### 5. rm 命令 - -rm 命令用于删除文件或目录,格式为“rm [选项] 文件”。 - -- -f 参数来强制删除 -- -r 参数递归删除文件夹 - -#### 6. dd 命令 - -dd 命令用于按照指定大小和个数的数据块来复制文件或转换文件,格式为“dd [参数]”。 - -**表: dd命令的参数及其作用** - -| 参数 | 作用 | -| ----- | -------------------- | -| if | 输入的文件名称 | -| of | 输出的文件名称 | -| bs | 设置每个“块”的大小 | -| count | 设置要复制“块”的个数 | - -用 dd 命令从/dev/zero 设备文件中取出一个大小为 560MB 的数据块,然后保存成名为 560_file 的文件 - -```shell -dd if=/dev/zero of=560_file count=1 bs=560M -``` - -在 Linux 系统中可以直接使用 dd 命令来压制出光盘镜像文件,将它变成一个可立即使用的 iso 镜像 - -```shell -dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso -``` - -#### 7. file命令 - -file 命令用于查看文件的类型,格式为“file 文件名”。 - -```shell -file anaconda-ks.cfg -``` - - - -### 2.8 打包压缩与搜索命令 - -#### 1. tar 命令 - -tar 命令用于对文件进行打包压缩或解压,格式为“tar \[选项][文件]”。 - -**表:tar命令的参数及其作用** - -| 参数 | 作用 | -| ---- | ---------------------- | -| -c | 创建压缩文件 | -| -x | 解开压缩文件 | -| -t | 查看压缩包内有哪些文件 | -| -z | 用Gzip压缩或解压 | -| -j | 用bzip2压缩或解压 | -| -v | 显示压缩或解压的过程 | -| -f | 目标文件名 | -| -p | 保留原始的权限与属性 | -| -P | 使用绝对路径来压缩 | -| -C | 指定解压到的目录 | - -常用打包命令 : “**tar -czvf 压缩包名称.tar.gz 要打包的目录**”; - -常用解压命令 :“**tar -xzvf 压缩包名称.tar.gz**”。 - - - -#### 2. grep 命令 - -grep 命令用于在文本中执行关键词搜索,并显示匹配的结果,格式为“grep \[选项][文件]”。 - -**表: grep命令的参数及其作用** - -| 参数 | 作用 | -| ---- | ---------------------------------------------- | -| -b | 将可执行文件(binary)当作文本文件(text)来搜索 | -| -c | 仅显示找到的行数 | -| -i | 忽略大小写 | -| -n | 显示行号 | -| -v | 反向选择——仅列出没有“关键词”的行。 | - -```shell -[root@localhost dic]# cat index.html |grep html -n -1: -3: -75: -``` - -#### 3. find命令 - -find 命令用于按照指定条件来查找文件,格式为“find [查找路径] 寻找条件 操作”。 - -**表:find命令中的参数以及作用** - -| 参数 | 作用 | -| ------------------ | ------------------------------------------------------------ | -| -name | 匹配名称 | -| -perm | 匹配权限(mode为完全匹配,-mode为包含即可) | -| -user | 匹配所有者 | -| -group | 匹配所有组 | -| -mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) | -| -atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) | -| -ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) | -| -nouser | 匹配无所有者的文件 | -| -nogroup | 匹配无所有组的文件 | -| -newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 | -| --type b/d/c/p/l/f | 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) | -| -size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) | -| -prune | 忽略某个目录 | -| -exec …… {}\; | 后面可跟用于进一步处理搜索结果的命令(下文会有演示) | - -获取到指定目录中所有以 host 开头的文件列表,可以执行如下命令: - -```shell -find /etc -name "host*" -print -``` - -如果要在整个系统中搜索权限中包括 SUID 权限的所有文件,只需使用-4000 即可: - -```shell -find / -perm -4000 -print -``` - - - -## 第三章 管道符、重定向与环境变量 - -### 3.1 输入输出重定向 - -> 标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。 -> -> 标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。 -> -> 错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。 - -**对于输入重定向来讲,用到的符号及其作用如表3-1所示。** - -表3-1 输入重定向中用到的符号及其作用 - -| 符号 | 作用 | -| -------------------- | -------------------------------------------- | -| 命令 < 文件 | 将文件作为命令的标准输入 | -| 命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 | -| 命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 | - -**对于输出重定向来讲,用到的符号及其作用如表3-2所示。** - -表3-2 输出重定向中用到的符号及其作用 - -| 符号 | 作用 | -| ------------------------------------- | ------------------------------------------------------------ | -| 命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) | -| 命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) | -| 命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) | -| 命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) | -| 命令 >> 文件 2>&1 或 命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) | - -```shell -man bash > readme.txt -``` - -### 3.2 管道运算符 - -管道命令符的作用也可以用一句话来概括“**把前一个命令原本要输出到屏幕的标准正常数据当作是后一个命令的标准输入**”。 - -### 3.3 命令通配符 - -- 星号(*)代表匹配零个或多个字符; -- 问号(?)代表匹配单个字符; -- 中括号内加上数字[0-9]代表匹配 0~9 之间的单个数字的字符; -- 而中括号内加上字母[abc]则是代表匹配 a、 b、 c 三个字符中的任意一个字符 - -```shell - ls -l /dev/sda* - ls -l /dev/sda? - ls -l /dev/sda[0-9] - ls -l /dev/sda[135] -``` - -### 3.4 常用的转义字符 - -> 反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。 -> -> 单引号(''):转义其中所有的变量为单纯的字符串。 -> -> 双引号(""):保留其中的变量属性,不进行转义处理。 -> -> 反引号(``):把其中的命令执行后返回结果。 - -```shell -[root@linuxprobe ~]# PRICE=5 -[root@linuxprobe ~]# echo "Price is $PRICE" -Price is 5 - -[root@linuxprobe ~]# echo "Price is \$$PRICE" -Price is $5 - -[root@linuxprobe ~]# echo `uname -a` -Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2017 -x86_64 x86_64 x86_64 GNU/Linux -``` - -### 3.5 重要的环境变量 - -表3-3 Linux系统中最重要的10个环境变量 - -| 变量名称 | 作用 | -| ------------ | -------------------------------- | -| HOME | 用户的主目录(即家目录) | -| SHELL | 用户在使用的Shell解释器名称 | -| HISTSIZE | 输出的历史命令记录条数 | -| HISTFILESIZE | 保存的历史命令记录条数 | -| MAIL | 邮件保存路径 | -| LANG | 系统语言、语系名称 | -| RANDOM | 生成一个随机数字 | -| PS1 | Bash解释器的提示符 | -| PATH | 定义解释器搜索用户执行命令的路径 | -| EDITOR | 用户默认的文本编辑器 | - -```shell - echo $HOME -``` - -设置一个名称为 WORKDIR 的变量 : - -```shell -[root@linuxprobe ~]# mkdir /home/workdir -[root@linuxprobe ~]# WORKDIR=/home/workdir -[root@linuxprobe ~]# cd $WORKDIR -[root@linuxprobe workdir]# pwd -/home/workdir -``` - -但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用 **export 命令**将其提升为全局变量 。 - - - -## 第四章 Vim 编辑器与 shell 脚本命令 - -### 4.1 vim编辑器 - -> 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。 -> -> 输入模式:正常的文本录入。 -> -> 末行模式:保存或退出文档,以及设置编辑环境。 - -表4-1 Vim中常用的命令 - -| 命令 | 作用 | -| ---- | -------------------------------------------------- | -| dd | 删除(剪切)光标所在整行 | -| 5dd | 删除(剪切)从光标处开始的5行 | -| yy | 复制光标所在整行 | -| 5yy | 复制从光标处开始的5行 | -| n | 显示搜索命令定位到的下一个字符串 | -| N | 显示搜索命令定位到的上一个字符串 | -| u | 撤销上一步的操作 | -| p | 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面 | - -表4-2 末行模式中可用的命令 - -| 命令 | 作用 | -| ------------- | ------------------------------------ | -| :w | 保存 | -| :q | 退出 | -| :q! | 强制退出(放弃对文档的修改内容) | -| :wq! | 强制保存退出 | -| :set nu | 显示行号 | -| :set nonu | 不显示行号 | -| :命令 | 执行该命令 | -| :整数 | 跳转到该行 | -| :s/one/two | 将当前光标所在行的第一个one替换成two | -| :s/one/two/g | 将当前光标所在行的所有one替换成two | -| :%s/one/two/g | 将全文中的所有one替换成two | -| ?字符串 | 在文本中从下至上搜索该字符串 | -| /字符串 | 在文本中从上至下搜索该字符串 | - -使用 a、 i、 o 三个键从命令模式切换到输入模式。其中, a 键与 i 键分别是在光标后面一位和光标当前位置切换到输入模式,而 **o 键则是在光标的下面再创建一个空行**,此时可敲击 a 键进入到编辑器的输入模式。 - -### 4.2 编写的脚本 - -#### 4.2.1 编写简单的脚本 - -```shell -[root@linuxprobe ~]# vim example.sh -#!/bin/bash -pwd -ls -al -``` - -#### 4.2.2 接受用户参数 - -- $0 对应的是当前 Shell 脚本程序的名称, -- $# 对应的是总共有几个参数, -- $* 对应的是所有位置的参数值, -- $? 对应的是显示上一次命令的执行返回值, -- 而$1、$2、 $3……则分别对应着第 N 个位置的参数值 - -```shell -[root@linuxprobe ~]# vim example.sh -#!/bin/bash -echo "当前脚本名称为$0" -echo "总共有$#个参数,分别是$*。" -echo "第1个参数为$1,第5个为$5。" -[root@linuxprobe ~]# sh example.sh one two three four five six -当前脚本名称为example.sh -总共有6个参数,分别是one two three four five six。 -第1个参数为one,第5个为five。 -``` - -**按照测试对象来划分,条件测试语句可以分为4种**: - -> 文件测试语句; -> -> 逻辑测试语句; -> -> 整数值比较语句; -> -> 字符串比较语句。 - -表4-3 文件测试所用的参数 - -| 操作符 | 作用 | -| ------ | -------------------------- | -| -d | 测试文件是否为目录类型 | -| -e | 测试文件是否存在 | -| -f | 判断是否为一般文件 | -| -r | 测试当前用户是否有权限读取 | -| -w | 测试当前用户是否有权限写入 | -| -x | 测试当前用户是否有权限执行 | - -表4-4 可用的整数比较运算符 - -| 操作符 | 作用 | -| ------ | -------------- | -| -eq | 是否等于 | -| -ne | 是否不等于 | -| -gt | 是否大于 | -| -lt | 是否小于 | -| -le | 是否等于或小于 | -| -ge | 是否大于或等于 | - -表4-5 常见的字符串比较运算符 - -| 操作符 | 作用 | -| ------ | ---------------------- | -| = | 比较字符串内容是否相同 | -| != | 比较字符串内容是否不同 | -| -z | 判断字符串内容是否为空 | - -下面使用文件测试语句来判断/etc/fstab是否为一个目录类型的文件,然后通过Shell解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在: - -```shell -[root@linuxprobe ~]# [ -d /etc/fstab ] -[root@linuxprobe ~]# echo $? -1 -``` - -## 4.3 流程控制语句 - -**结构**: - -```shell -# if单分支结构 -if 条件测试操作 - then 命令序列 -fi - - -# if双分支结构 -if 条件测试操作 - then 命令序列1 - else 命令序列2 -fi - - -# if多分支结构 -if 条件测试操作1 ; - then 命令序列1 -elif 条件测试操作2 ; - then 命令序列2 -else - 命令序列3 -fi - - -# for 条件循环语句 -for 变量名 in 取值列表 -do - 命令序列 -done - - -# while 条件循环语句 -while 条件测试操作 -do - 命令序列 -done - - -# case 条件测试语句 -case 变量值 in -模式1) - 命令序列1 - ;; -模式2) - 命令序列2 - ;; - ..... -*) - 默认命令序列 -esac -``` - -**示例**: - -```shell -# if单分支结构 -#!/bin/bash -DIR="/media/cdrom" -if [ ! -e $DIR ] -then -mkdir -p $DIR -fi - - -# if双分支结构 -#!/bin/bash -ping -c 3 -i 0.2 -W 3 $1 &> /dev/null -if [ $? -eq 0 ] -then -echo "Host $1 is On-line." -else -echo "Host $1 is Off-line." -fi - - -# if多分支结构 -#!/bin/bash -read -p "Enter your score(0-100):" GRADE -if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then -echo "$GRADE is Excellent" -elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then -echo "$GRADE is Pass" -else -echo "$GRADE is Fail" -fi - - -# for 条件循环语句 -#!/bin/bash -read -p "Enter The Users Password : " PASSWD -for UNAME in `cat users.txt` -do -id $UNAME &> /dev/null -if [ $? -eq 0 ] -then -echo "Already exists" -else -useradd $UNAME &> /dev/null -echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null -if [ $? -eq 0 ] -then -echo "$UNAME , Create success" -else -echo "$UNAME , Create failure" -fi -fi -done - - -# while 条件循环语句 -#!/bin/bash -PRICE=$(expr $RANDOM % 1000) -TIMES=0 -echo "商品实际价格为0-999之间,猜猜看是多少?" -while true -do -read -p "请输入您猜测的价格数目:" INT -let TIMES++ -if [ $INT -eq $PRICE ] ; then -echo "恭喜您答对了,实际价格是 $PRICE" -echo "您总共猜测了 $TIMES 次" -exit 0 -elif [ $INT -gt $PRICE ] ; then -echo "太高了!" -else -echo "太低了!" -fi -done - - -# case 条件测试语句 -#!/bin/bash -read -p "请输入一个字符,并按Enter键确认:" KEY -case "$KEY" in -[a-z]|[A-Z]) -echo "您输入的是 字母。" -;; -[0-9]) -echo "您输入的是 数字。" -;; -*) -echo "您输入的是 空格、功能键或其他控制字符。" -esac -``` - - - -## 4.4 计划任务服务程序 - -> 一次性计划任务:今晚11点30分开启网站服务。 -> -> 长期性计划任务:每周一的凌晨3点25分把/home/wwwroot目录打包备份为backup.tar.gz。 - -**一次性计划任务:** - -- 设置一次性计划任务 “at 时间” -- 查看已设置好但还未执行的一次性计划任务,可以使用“at -l”命令 -- 删除用“atrm 任务序号” - -```shell -[root@linuxprobe ~]# at 23:30 -at > systemctl restart httpd -at > 此处请同时按下Ctrl+d来结束编写计划任务 -job 3 at Mon Apr 27 23:30:00 2015 -[root@linuxprobe ~]# at -l -3 Mon Apr 27 23:30:00 2016 a root -[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30 -job 4 at Mon Apr 27 23:30:00 2015 -[root@linuxprobe ~]# at -l -3 Mon Apr 27 23:30:00 2016 a root -4 Mon Apr 27 23:30:00 2016 a root -[root@linuxprobe ~]# atrm 3 -[root@linuxprobe ~]# at -l -4 Mon Apr 27 23:30:00 2016 a root -``` - -**周期性任务**: - -- 创建、编辑计划任务的命令为“crontab -e” -- 查看当前计划任务的命令为“crontab -l” -- 删除某条计划任务的命令为“crontab -r” -- 另外,如果您是以管理员的身份登录的系统,还可以在 crontab 命令中加上-u 参数来编辑他人的计划任务 - -表4-6 使用crond设置任务的参数字段说明 - -| 字段 | 说明 | -| ---- | ---------------------------------------- | -| 分钟 | 取值为0~59的整数 | -| 小时 | 取值为0~23的任意整数 | -| 日期 | 取值为1~31的任意整数 | -| 月份 | 取值为1~12的任意整数 | -| 星期 | 取值为0~7的任意整数,其中0与7均为星期日 | -| 命令 | 要执行的命令或程序脚本 | - -**在crond服务的计划任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道绝对路径,请用whereis命令进行查询** - -```shell -[root@linuxprobe ~]# crontab -e -no crontab for root - using an empty one -crontab: installing new crontab -[root@linuxprobe ~]# crontab -l -#假设在每周一、三、五的凌晨3点25分,都需要使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。 -25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot - - -[root@linuxprobe ~]# whereis rm -rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz -[root@linuxprobe ~]# crontab -e -crontab: installing new crontab -[root@linuxprobe ~]# crontab -l -#每周一至周五的凌晨1点钟自动清空/tmp目录内的所有文件 -25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot -0 1 * * 1-5 /usr/bin/rm -rf /tmp/* -``` - -**计划任务中的“分”字段必须有数值,绝对不能为空或是*号,而“日”和“星期”字段不能同时使用,否则就会发生冲突。** - - - -## 第五章 用户身份与文件权限 - -### 5.1 用户身份与能力 - -> 管理员UID为0:系统的管理员用户。 -> -> 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。 -> -> 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。 - -#### 1. useradd 命令 - -useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。 - -可以使用useradd命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。这些默认设置可以根据表5-1中的useradd命令参数自行修改。 - -表5-1 useradd命令中的用户参数以及作用 - -| 参数 | 作用 | -| ---- | ---------------------------------------- | -| -d | 指定用户的家目录(默认为/home/username) | -| -e | 账户的到期时间,格式为YYYY-MM-DD. | -| -u | 指定该用户的默认UID | -| -g | 指定一个初始的用户基本组(必须已存在) | -| -G | 指定一个或多个扩展用户组 | -| -N | 不创建与用户同名的基本用户组 | -| -s | 指定该用户的默认Shell解释器 | - -```shell -[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe -[root@linuxprobe ~]# id linuxprobe -uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe) -``` - -#### 2. groupadd 命令 - -groupadd 命令用于创建用户组,格式为“groupadd [选项] 群组名”。 - -#### 3. usermod 命令 - -usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。 - -前文曾反复强调,Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息。 - -表5-2 usermod命令中的参数及作用 - -| 参数 | 作用 | -| ----- | ------------------------------------------------------------ | -| -c | 填写用户账户的备注信息 | -| -d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 | -| -e | 账户的到期时间,格式为YYYY-MM-DD | -| -g | 变更所属用户组 | -| -G | 变更扩展用户组 | -| -L | 锁定用户禁止其登录系统 | -| -U | 解锁用户,允许其登录系统 | -| -s | 变更默认终端 | -| -u | 修改用户的UID | - -```shell -[root@linuxprobe ~]# usermod -u 8888 linuxprobe -[root@linuxprobe ~]# id linuxprobe -uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root) -``` - -#### 4. passwd 命令 - -passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd \[选项][用户名]”。 - -表5-3 passwd命令中的参数以及作用 - -| 参数 | 作用 | -| ------- | ------------------------------------------------------------ | -| -l | 锁定用户,禁止其登录 | -| -u | 解除锁定,允许用户登录 | -| --stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" \| passwd --stdin Username | -| -d | 使该用户可用空密码登录系统 | -| -e | 强制用户在下次登录时修改密码 | -| -S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 | - -```shell -[root@linuxprobe ~]# passwd -l linuxprobe -Locking password for user linuxprobe. -passwd: Success -[root@linuxprobe ~]# passwd -S linuxprobe -linuxprobe LK 2017-12-26 0 99999 7 -1 (Password locked.) -[root@linuxprobe ~]# passwd -u linuxprobe -Unlocking password for user linuxprobe. -passwd: Success -[root@linuxprobe ~]# passwd -S linuxprobe -linuxprobe PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.) -``` - -#### 5. userdel 命令 - -userdel命令用于删除用户,格式为“userdel [选项] 用户名”。 - -表5-4 userdel命令的参数以及作用 - -| 参数 | 作用 | -| ---- | ------------------------ | -| -f | 强制删除用户 | -| -r | 同时删除用户及用户家目录 | - -### 5.2 文件权限与归属 - -> -:普通文件。 -> -> d:目录文件。 -> -> l:链接文件。 -> -> b:块设备文件。 -> -> c:字符设备文件。 -> -> p:管道文件。 - -

- -

- -### 5.3 文件的特殊权限 - -#### 5.3.1 SUID - -SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效) - -#### 5.3.2 SGID - -SGID主要实现如下两种功能: - -> 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置); -> -> 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。 - -##### 1.chmod命令 - -chmod是一个非常实用的命令,能够用来设置文件或目录的**权限**,格式为“chmod [参数] 权限 文件或目录名称”。 - -##### 2.chown命令 - -chown设置文件或目录的**所有者和所属组**,其格式为“chown [参数] 所有者:所属组 文件或目录名称”。 - -```shell -[root@linuxprobe ~]# chmod 760 test -[root@linuxprobe ~]# ls -l test --rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test -[root@linuxprobe ~]# chown root:bin test -[root@linuxprobe ~]# ls -l test --rwxrw----. 1 root bin 15 Feb 11 11:50 test -``` - -#### 5.3.3 SBIT - -SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。 - -### 5.4 文件的隐藏属性 - -#### 1. chattr命令 - -chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。 - -表5-6 chattr命令中用于隐藏权限的参数及其作用 - -| 参数 | 作用 | -| ---- | ------------------------------------------------------------ | -| i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 | -| a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) | -| S | 文件内容在变更后立即同步到硬盘(sync) | -| s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) | -| A | 不再修改这个文件或目录的最后访问时间(atime) | -| b | 不再修改文件或目录的存取时间 | -| D | 检查压缩文件中的错误 | -| d | 使用dump命令备份时忽略本文件/目录 | -| c | 默认将文件或目录进行压缩 | -| u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 | -| t | 让文件系统支持尾部合并(tail-merging) | -| x | 可以直接访问压缩文件中的内容 | - -```shell -[root@linuxprobe ~]# echo "for Test" > linuxprobe -[root@linuxprobe ~]# chattr +a linuxprobe -[root@linuxprobe ~]# rm linuxprobe -rm: remove regular file ‘linuxprobe’? y -rm: cannot remove ‘linuxprobe’: Operation not permitted -``` - -#### 2. lsattr 命令 - -lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。 - -```shell -[root@linuxprobe ~]# lsattr linuxprobe ------a---------- linuxprobe -[root@linuxprobe ~]# chattr -a linuxprobe -[root@linuxprobe ~]# lsattr linuxprobe ----------------- linuxprobe -[root@linuxprobe ~]# rm linuxprobe -rm: remove regular file ‘linuxprobe’? y -``` - -### 5.5 文件访问控制列表 - -#### 5.5.1 setfacl 命令 - -setfacl 命令用于管理文件的 ACL 规则,格式为“setfacl [参数] 文件名称”。文件的 ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以**针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制**。其中: - -- 针对目录文件需要使用-R 递归参数; -- 针对普通文件则使用-m 参数; -- 如果想要删除某个文件的 ACL,则可以使用-b 参数。 - -下面来设置用户在/root 目录上的权限: - -```shell -[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root -``` - -#### 5.5.2 getfacl 命令 - -getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。 - -### 5.6 su命令与sudo服务 - -su 命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,**即把环境变量信息也变更为新用户的相应信息**,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。 - -sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”。 - -表5-7 sudo服务中的可用参数以及作用 - -| 参数 | 作用 | -| ---------------- | ------------------------------------------------------ | -| -h | 列出帮助信息 | -| -l | 列出当前用户可执行的命令 | -| -u 用户名或UID值 | 以指定的用户身份执行命令 | -| -k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 | -| -b | 在后台执行指定的命令 | -| -p | 更改询问密码的提示语 | - -## 第六章 存储结构与磁盘划分 - -### 6.1 一切从“/”开始 - -表6-1 Linux系统中常见的目录名称以及相应内容 - -| 目录名称 | 应放置文件的内容 | -| ----------- | --------------------------------------------------------- | -| /boot | 开机所需文件—内核、开机菜单以及所需配置文件等 | -| /dev | 以文件形式存放任何设备与接口 | -| /etc | 配置文件 | -| /home | 用户主目录 | -| /bin | 存放单用户模式下还可以操作的命令 | -| /lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 | -| /sbin | 开机过程中需要的命令 | -| /media | 用于挂载设备文件的目录 | -| /opt | 放置第三方的软件 | -| /root | 系统管理员的家目录 | -| /srv | 一些网络服务的数据文件目录 | -| /tmp | 任何人均可使用的“共享”临时目录 | -| /proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 | -| /usr/local | 用户自行安装的软件 | -| /usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 | -| /usr/share | 帮助与说明文件,也可放置共享文件 | -| /var | 主要存放经常变化的文件,如日志 | -| /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 | - -### 6.2 物理设备的命名规则 - -表6-2 常见的硬件设备及其文件名称 - -| 硬件设备 | 文件名称 | -| ------------- | ------------------ | -| IDE设备 | /dev/hd[a-d] | -| SCSI/SATA/U盘 | /dev/sd[a-p] | -| 软驱 | /dev/fd[0-1] | -| 打印机 | /dev/lp[0-15] | -| 光驱 | /dev/cdrom | -| 鼠标 | /dev/mouse | -| 磁带机 | /dev/st0或/dev/ht0 | - -由于现在的IDE设备已经很少见了,所以一般的硬盘设备都会是以“/dev/sd”开头的。而一台主机上可以有多块硬盘,因此系统采用a~p来代表16块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也很有讲究: - -> 主分区或扩展分区的编号从1开始,到4结束; -> -> 逻辑分区从编号5开始。 - -

- -### 6.4 挂载硬件设备 - -当用户需要使用硬盘设备或分区中的数据时,需要先将其与一个已存在的目录文件进行关联,而这个关联动作就是“挂载”。 - -#### 1.挂载 - -mount命令用于挂载文件系统,格式为“mount 文件系统 挂载目录”。 - -表6-3 mount命令中的参数以及作用 - -| 参数 | 作用 | -| ---- | ------------------------------------------------------------ | -| -a | 挂载所有在/etc/fstab中定义的文件系统,会在执行后自动检查/etc/fstab文件中有无疏漏被挂载的设备文件,如果有,则进行自动挂载操作。 | -| -t | 指定文件系统的类型。 对于比较新的Linux系统来讲,一般不需要使用-t参数来指定文件系统的类型 | - -```shell -[root@linuxprobe ~]# mount /dev/sdb2 /backup -``` - -#### 2.永久挂载 - -如果想让硬件设备和目录永久地进行自动关联,就必须把挂载信息按照指定的填写格式“设备文件 挂载目录 格式类型 权限选项 是否备份 是否自检”(各字段的意义见表6-4)写入到**/etc/fstab**文件中。 - -表6-4 用于挂载信息的指定填写格式中,各字段所表示的意义 - -| 字段 | 意义 | -| -------- | ------------------------------------------------------------ | -| 设备文件 | 一般为设备的路径+设备名称,也可以写唯一识别码(UUID,Universally Unique Identifier) | -| 挂载目录 | 指定要挂载到的目录,需在挂载前创建好 | -| 格式类型 | 指定文件系统的格式,比如Ext3、Ext4、XFS、SWAP、iso9660(此为光盘设备)等 | -| 权限选项 | 若设置为defaults,则默认权限为:rw, suid, dev, exec, auto, nouser, async | -| 是否备份 | 若为1则开机后使用dump进行磁盘备份,为0则不备份 | -| 是否自检 | 若为1则开机后自动进行磁盘自检,为0则不自检 | - -如果想将文件系统为ext4的硬件设备/dev/sdb2在开机后自动挂载到/backup目录上,并保持默认权限且无需开机自检,就需要在/etc/fstab文件中写入下面的信息,这样在系统重启后也会成功挂载。 - -```shell -[root@linuxprobe ~]# vim /etc/fstab -# -# /etc/fstab -# Created by anaconda on Wed May 4 19:26:23 2017 -# -# Accessible filesystems, by reference, are maintained under '/dev/disk' -# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info -# -/dev/mapper/rhel-root / xfs defaults 1 1 -UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2 -/dev/mapper/rhel-swap swap swap defaults 0 0 -/dev/cdrom /media/cdrom iso9660 defaults 0 0 -# 永久挂载 -/dev/sdb2 /backup ext4 defaults 0 0 -``` - -#### 3.撤消挂载 - -umount命令用于撤销已经挂载的设备文件,格式为“umount [挂载点/设备文件]”。 - -```shell -[root@linuxprobe ~]# umount /dev/sdb2 -``` - -### 6.8 软硬链接连接方式 - -**硬链接(hard link)**:可以将它理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode和文件。所以,硬链接文件与原始文件其实是同一个文件,只是名字不同。我们每添加一个硬链接,该文件的inode连接数就会增加1;而且只有当该文件的inode连接数为0时,才算彻底将它删除。换言之,由于硬链接实际上是指向原文件inode的指针,因此即便原始文件被删除,依然可以通过硬链接文件来访问。需要注意的是,由于技术的局限性,我们不能跨分区对目录文件进行链接。 - -**软链接(也称为符号链接[symbolic link])**:仅仅包含所链接文件的路径名,因此能链接目录文件,也可以跨越文件系统进行链接。但是,当原始文件被删除后,链接文件也将失效,从这一点上来说与Windows系统中的“快捷方式”具有一样的性质。 - -#### 1. ln 命令 - -ln命令用于创建链接文件,格式为“ln [选项] 目标”。 - -表6-6 ln命令中可用的参数以及作用 - -| 参数 | 作用 | -| ---- | -------------------------------------------------- | -| -s | 创建“符号链接”(如果不带-s参数,则默认创建硬链接) | -| -f | 强制创建文件或目录的链接 | -| -i | 覆盖前先询问 | -| -v | 显示创建链接的过程 | - -```shell -# 软连接 -[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt -[root@linuxprobe ~]# ln -s readme.txt readit.txt -[root@linuxprobe ~]# cat readme.txt -Welcome to linuxprobe.com -[root@linuxprobe ~]# cat readit.txt -Welcome to linuxprobe.com -[root@linuxprobe ~]# ls -l readme.txt --rw-r--r-- 1 root root 26 Jan 11 00:08 readme.txt -[root@linuxprobe ~]# rm -f readme.txt -[root@linuxprobe ~]# cat readit.txt -cat: readit.txt: No such file or directory - -# 硬连接 删除原文件后 链接文件任然有效 -[root@linuxprobe ~]# echo "Welcome to linuxprobe.com" > readme.txt -[root@linuxprobe ~]# ln readme.txt readit.txt -[root@linuxprobe ~]# cat readme.txt -Welcome to linuxprobe.com -[root@linuxprobe ~]# cat readit.txt -Welcome to linuxprobe.com -[root@linuxprobe ~]# ls -l readme.txt --rw-r--r-- 2 root root 26 Jan 11 00:13 readme.txt -[root@linuxprobe ~]# rm -f readme.txt -[root@linuxprobe ~]# cat readit.txt -Welcome to linuxprobe.com -``` - -## 第八章 Iptables与Firewalld防火墙 - -### 8.2 iptables - -#### 8.2.1 策略与规则链 - -iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下: - -> 在进行路由选择前处理数据包(PREROUTING); -> -> 处理流入的数据包(INPUT); -> -> 处理流出的数据包(OUTPUT); -> -> 处理转发的数据包(FORWARD); -> -> 在进行路由选择后处理数据包(POSTROUTING)。 - -#### 8.2.2 基本的命令参数 - -表8-1 iptables中常用的参数以及作用 - -| 参数 | 作用 | -| ----------- | -------------------------------------------- | -| -P | 设置默认策略 | -| -F | 清空规则链 | -| -L | 查看规则链 | -| -A | 在规则链的末尾加入新规则 | -| -I num | 在规则链的头部加入新规则 | -| -D num | 删除某一条规则 | -| -s | 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外 | -| -d | 匹配目标地址 | -| -i 网卡名称 | 匹配从这块网卡流入的数据 | -| -o 网卡名称 | 匹配从这块网卡流出的数据 | -| -p | 匹配协议,如TCP、UDP、ICMP | -| --dport num | 匹配目标端口号 | -| --sport num | 匹配来源端口号 | - -```shell -# 在iptables命令后添加-L参数查看已有的防火墙规则链: -iptables -L -# 在iptables命令后添加-F参数清空已有的防火墙规则链: -iptables -F -# 把INPUT规则链的默认策略设置为拒绝: -iptables -P INPUT DROP -# 向INPUT链中添加允许ICMP流量进入的策略规则: -iptables -I INPUT -p icmp -j ACCEPT -# 删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许: -iptables -D INPUT 1 -iptables -P INPUT ACCEPT -# 将INPUT规则链设置为只允许指定网段的主机访问本机的22端口,拒绝来自其他所有主机的流量: -iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT -iptables -A INPUT -p tcp --dport 22 -j REJECT -# 向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则: -iptables -I INPUT -p tcp --dport 12345 -j REJECT -iptables -I INPUT -p udp --dport 12345 -j REJECT -# 向INPUT规则链中添加拒绝192.168.10.5主机访问本机80端口(Web服务)的策略规则: -ptables -I INPUT -p tcp -s 192.168.10.5 --dport 80 -j REJECT -# 向INPUT规则链中添加拒绝所有主机访问本机1000~1024端口的策略规则: -iptables -A INPUT -p tcp --dport 1000:1024 -j REJECT -iptables -A INPUT -p udp --dport 1000:1024 -j REJECT -``` - -### 8.3 Firewalld - -表8-2 firewalld中常用的区域名称及策略规则 - -| 区域 | 默认规则策略 | -| -------- | ------------------------------------------------------------ | -| trusted | 允许所有的数据包 | -| home | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量 | -| internal | 等同于home区域 | -| work | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许流量 | -| public | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量 | -| external | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 | -| dmz | 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量 | -| block | 拒绝流入的流量,除非与流出的流量相关 | -| drop | 拒绝流入的流量,除非与流出的流量相关 | - -#### 8.3.1 终端管理工具 - -表8-3 firewall-cmd命令中使用的参数以及作用 - -| 参数 | 作用 | -| ----------------------------- | ---------------------------------------------------- | -| --get-default-zone | 查询默认的区域名称 | -| --set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 | -| --get-zones | 显示可用的区域 | -| --get-services | 显示预先定义的服务 | -| --get-active-zones | 显示当前正在使用的区域与网卡名称 | -| --add-source= | 将源自此IP或子网的流量导向指定的区域 | -| --remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 | -| --add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 | -| --change-interface=<网卡名称> | 将某个网卡与区域进行关联 | -| --list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 | -| --list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 | -| --add-service=<服务名> | 设置默认区域允许该服务的流量 | -| --add-port=<端口号/协议> | 设置默认区域允许该端口的流量 | -| --remove-service=<服务名> | 设置默认区域不再允许该服务的流量 | -| --remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 | -| --reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 | -| --panic-on | 开启应急状况模式 | -| --panic-off | 关闭应急状况模式 | diff --git a/pictures/RabbitMQ-访问限制.png b/pictures/RabbitMQ-访问限制.png new file mode 100644 index 0000000..784b057 Binary files /dev/null and b/pictures/RabbitMQ-访问限制.png differ diff --git a/pictures/rabbitmq-架构.jpg b/pictures/rabbitmq-架构.jpg new file mode 100644 index 0000000..a26cd51 Binary files /dev/null and b/pictures/rabbitmq-架构.jpg differ diff --git a/pictures/rabbitmq-管控台.png b/pictures/rabbitmq-管控台.png new file mode 100644 index 0000000..c864ad7 Binary files /dev/null and b/pictures/rabbitmq-管控台.png differ diff --git a/pictures/vim不同模式间的切换.png b/pictures/vim不同模式间的切换.png new file mode 100644 index 0000000..0df9362 Binary files /dev/null and b/pictures/vim不同模式间的切换.png differ diff --git a/pictures/大数据技术栈.xmind b/pictures/大数据技术栈.xmind deleted file mode 100644 index 3f28a17..0000000 Binary files a/pictures/大数据技术栈.xmind and /dev/null differ diff --git a/pictures/线程完整生命周期.jpg b/pictures/线程完整生命周期.jpg new file mode 100644 index 0000000..74383f7 Binary files /dev/null and b/pictures/线程完整生命周期.jpg differ