一、树1、树的定义树是N（N >= 0）个结点的有限集合。当N=0 时，称为空树；当N>0 时，应满足：1）有且仅有一个特定的称为根的结点，它没有直接前驱，但有零个或多个后继。 2）其余n-1个结点可分为m（m>=0)个互不相交的有限集T1,T2,....,Tm, 其中Ti又是一棵树，并且称为根的子树2、相关术语结点的度：结点的子树个数树的度（阶）：树的所有结点中最大的度数N，同时这棵可称为N叉树叶结点：度为0的结点父结点：有子树的结点是其子树的根节点的父结点子结点：若A结点是B结点的父结点，则称B结点是A结点的子结点兄弟结点：具有同一个父结点的各结点彼此是兄弟结点祖先结点：沿树根到某一结点路径上的所有结点都是这个结点的祖先结点子孙结点：某一结点的子树中的所有结点是这个结点的子孙结点的层次：规定根结点在1层，其他任一结点的层数是其父结点的层数加1树的深度：树中所有结点中的最大层次是这棵树的深度有序树：树中任意节点的子结点之间有顺序关系；反之称为无序树森林：由 m（m >= 0）个互不相交的树组成的集合被称为森林路径：从一个结点往下可以达到的孩子或孙子结点之间的通路路径长度：通路中分支的数目。若规定根结点的层数为1，则从根结点到第L层结点的路径长度为L-1结点的权：若将树中结点赋给一个有着某种含义的数值，则这个数值称为该结点的权结点的带权路径长度：从根结点到该结点之间的路径长度与该结点的权的乘积树的带权路径长度：所有叶子结点的带权路径长度之和，记为WPL结点的平衡因子：某节点的左子树与右子树的高度(深度)差二、二叉树1、二叉树定义每个结点至多拥有两棵子树的树结构。并且，二叉树的子树有左右之分，其次序不能任意颠倒。2、类型满二叉树：除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层完全二叉树：叶结点只能出现在最底层的两层，且最底层叶结点均处于次底层叶结点的左侧3、遍历按一定的规则和顺序走遍二叉树的所有结点，使每一个结点都被访问一次，而且只被访问一次。由于二叉树是非线性结构，因此，树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。先序遍历：首先访问根，再先序遍历左子树，最后先序遍历右子树中序遍历：首先中序遍历左子树，再访问根，最后中序遍历右子树后序遍历：首先后序遍历左子树，再后序遍历右子树，最后访问根层序遍历：首先访问第一层的根节点，然后从左到右访问第2层上的节点，以此类推，自上而下，自左至右逐层访问4、树的转换树转换为二叉树1）加线。在所有兄弟结点之间加一条连线。 2）去线。树中的每个结点，只保留它与第一个孩子结点的连线，删除它与其它孩子结点之间的连线。 3）层次调整。以树的根节点为轴心，将整棵树顺时针旋转一定角度（第一个孩子是左孩子，其余结点是右孩子）二叉树转换为树1）加线。若某结点X的左孩子结点存在，则将这个左孩子的右孩子结点、右孩子的右孩子结点…，都作为结点X的孩子。 2）去线。删除原二叉树中所有结点与其右孩子结点的连线。 3）层次调整。孩子靠左排列三、线索二叉树（二叉树变种）对于n个结点的二叉树，在二叉链存储结构中有n+1个空链域，利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针，这些指针称为线索，加上线索的二叉树称为线索二叉树。根据线索性质的不同，线索二叉树可分为前序线索二叉树、中序线索二叉树和后序线索二叉树三种。同时为了区别线索指针和孩子指针，在每个结点中添加两个标志ltag和rtag。lchildltagdatartagrchild线索化规则：若结点的左子树为空，则该结点的左孩子指针指向其前驱结点。 若结点的右子树为空，则该结点的右孩子指针指向其后继结点。建立线索二叉树，或者说对二叉树线索化，实质上就是遍历一棵二叉树。在遍历过程中，访问结点的操作是检查当前的左，右指针域是否为空，将它们改为指向前驱结点或后续结点的线索，以中序二叉树为例：线索二叉树充分利用了指针空间，同时又便于寻找结点的前驱结点和后继结点。线索二叉树适用于经常需要遍历寻找结点前驱或者后继结点的二叉树。四、最优二叉树（又：哈夫曼树）1、定义给定n个权值作为n个叶子结点，构造一棵二叉树，若该树的带权路径长度达到最小，称这样的二叉树为最优二叉树，也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树，权值较大的结点离根较近。2、构造哈夫曼树假设有n个权值，则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn，则哈夫曼树的构造规则为：1) 将w1、w2、…，wn看成是有n 棵树的森林(每棵树仅有一个结点)； 2) 在森林中选出两个带权路径长度最小的树合并，作为一棵新树的左、右子树； 3)从森林中删除选取的两棵树，并将新树加入森林； 4)重复(2)、(3)步，直到森林中只剩一棵树为止，该树即为所求得的哈夫曼树。3、哈夫曼编码哈夫曼编码是一种基于最小冗余编码的压缩算法。最小冗余编码是指，如果知道一组数据中符号出现的频率，就可以用一种特殊的方式来表示符号从而减少数据需要的存储空间。例如，需传送的报文为“A A C B C A A D D B B A D D A A B B”，这里用到的字符集为“A，B，C，D”。现要求为这些字母设计编码。要区别4个字母，最简单的二进制编码方式是等长编码，固定采用2位二进制，可分别用00、01、10、11对“A，B，C，D”进行编码发送。然而，传送报文时总是希望总长度尽可能短。在实际应用中，各个字符的出现频度或使用次数是不相同的，如A、B、C的使用频率远远高于X、Y、Z，自然会想到设计编码时，让使用频率高的用短码，使用频率低的用长码，以优化整个报文编码。基本步骤： 1）统计各个字符出现的次数 2）以次数作为权值构建哈夫曼树。 3）左子树路径标0，右子树路径标1（或者相反） 4）则从根到叶结点的路径标记即为该结点的编码字符频率等长编码哈夫曼编码A7000B50110C210111D411110原始字符串：A A C B C A A D D B B A D D A A B B哈夫曼编码：0 0 111 10 111 0 0 110 110 10 10 0 110 110 0 0 10 10，编码长度为35等长编码：00 00 10 01 10 00 00 11 11 01 01 00 11 11 00 00 01 01，编码长度为36可以看出使用霍夫曼编码可以缩短数据编码长度，达到数据压缩的效果。当字符数目较少时不能体现霍夫曼编码带来的压缩效果，但是当字符数目较多时，霍夫曼编码的压缩效率将显著提高。五、二叉查找树（又：二叉搜索树，二叉排序树，有序二叉树）1、定义是一棵空树，或者是具有下列性质的二叉树：1）若它的左子树不空，则左子树上所有结点的值均小于它的根结点的值 2）若它的右子树不空，则右子树上所有结点的值均大于它的根结点的值 3）它的左、右子树也分别为二叉查找树2、查找算法与插入算法类似，在二叉查找树b中查找x的过程为：1）若b是空树，则搜索失败 2）若x等于b的根结点的数据域之值，则查找成功 3）若x小于b的根结点的数据域之值，则搜索左子树；否则：查找右子树 3、插入算法（对空树进行不断插入数据即为：创建二叉查找树）向一个二叉查找树b中插入一个结点s的算法是一个递归算法，过程为：1）若b是空树，则将s所指结点作为根结点插入并返回 2）若s->data等于b的根结点的数据域之值，不插入并返回 3）若s->data小于b的根结点的数据域之值，则把s所指结点插入到左子树中，否则：把s所指结点插入到右子树中。 4、删除算法在二叉查找树删去一个结点p（假设已经找到要删除结点的位置）删除过程为：1）若结点p的左右子树都为空，直接删除此子结点即可 2）若结点p只有左子树PL或右子树PR，此时只要令PL或PR直接成为其父结点的左子树或右子树即可 3）若结点p的左子树和右子树均不空，可以有两种做法： 其一是令p的左子树代替父节点f，p的右子树为新f的最右结点的右子树（或者相反）； 其二是令p的直接前驱（或直接后继）替代p，然后再从二叉排序树中删去它的直接前驱（或直接后继） 六、平衡二叉树（又：AVL树）1、定义是一棵空树或左右两个子树的高度差（记为平衡因子）的绝对值不超过1，并且左右两个子树都是一棵平衡二叉树。2、左旋与右旋调整平衡二叉树要用到的基本算法，左旋升高左子树，右旋和左旋互逆，左旋方法：根结点替换左结点的右结点，原左结点的右结点成为原根结点的右孩子（截右左替补左右），右旋同理3、失衡调整平衡二叉树也是一棵二叉搜索树，所以它的增加删除结点也是建立在二叉搜索树之上的，只是，我们需要在不平衡的时候进行调整。无论是插入还是删除结点，总是最多存在一个失去平衡的最小子树。首先要找失去平衡的最小子树根结点的指针，然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树。七、红黑树1、定义红黑树是每个结点都带有颜色属性的二叉查找树 ，颜色为红色或黑色，同时还要满足如下的额外要求:1）结点是红色或黑色 2）根结点是黑色 3）每个叶子结点都带有两个空的黑色节点（称之为NIL节点，它又被称为黑哨兵） 4）每个红色节点的两个子节点都是黑色 5）从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点红黑树的5条特性确保了从根到叶子的最长的可能路径不多于最短的可能路径的两倍长，使得整棵树大致上是平衡的。树上的增删改查操作的最坏情况时间都与树的高度成正比，所以红黑树在最坏情况下也是高效的。在红黑树中一般用黑的NIL节点表示叶节点，不包含值，只是标志该分支结束，有时候绘图中会直接省略。2、和2-3-4树的等价关系如果一棵树满足红黑树，把红色节点收缩到其父节点，就变成了2-3-4树，所有红色节点都与其父节点构成3或4节点，其它节点为2节点。一颗红黑树对应唯一形态的2-3-4树，但是一颗2-3-4树可以对应多种形态的红黑树（主要是3节点可以对应两种不同的红黑树形态：左树和右树）。3、调整操作红黑树的插入删除方式与二叉查找树是一样的，只不过插入删除后可能需要做调整，以满足红黑树的5条特性。新插入的结点总是设为红色，如果插入的父结点为黑色，就不需要调整，因为没有任何性质被改变，所以只有在父结点为红色结点时需要做调整，这时，以插入结点的祖父节点为根的子树不平衡，需要调整；删除时如果是叶子节点就直接删除，如果是非叶子节点，就会用中序遍历的后继（或前驱）节点来顶替要删除的节点。删除修复操作在遇到被删除的节点是红色节点或者到达root节点时，调整操作完毕。调整操作为：若左子树的红色更多，右旋，反之左旋，同时改变这棵子树每个结点的颜色（化多补少，交换颜色）。八、B树（或B-树、B_树）1、定义一棵m阶B树是一棵m路查找树。它或者是空树，或者是满足下列性质的树：1、每个结点最多有m-1个关键字2、根结点最少可以只有1个关键字3、非根结点至少有m/2个关键字4、结点中的关键字按照从小到大排列，每个关键字的左子树中的所有关键字都小于它，而右子树中的所有关键字都大于它4、所有的叶子结点都位于同一层。九、堆1、定义堆通常是一个可以被看做一棵树的数组对象，需满足下列性质：1）堆中某个节点的值总是不大于或不小于其父节点的值； 2）堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆，根节点最小的堆叫做最小堆或小根堆,由于堆是完全二叉树，故直接使用数组存储。
swap交换空间可以增加一定量的内存使用，但增加swap的最重要的作用是防止网站流量突然增大而导致系统分配内存不够用而死机。如果你的VPS长期处理使用swap的状态下，建议你检查下程序或VPS，或者升级更大的内存的VPS，因为使用swap交换分区，会使服务器的性能降低很多，导致访问速度变慢。Linux可以使用一个分区或者一个常规文件作为交换空间。单独的分区速度要快一些，但是交换文件大小可以改变，更加灵活些。一、创建swap交换空间语法：mkswap [参数] 设备名 [块数]设备名，这里的设备通常是一个磁盘分区，如：/dev/sda6，或者是一个文件/swapfile例： 1、设置分区/dev/sdb1为新交换空间 mkswap /dev/sdb1 2、设置文件swapfile为新交换空间 首先创建swapfile文件 dd if=/dev/zero of=swapfile count=2000 bs=1024k if 表示输入文件 /dev/zero表示一个空文件，即以null字符写入文件中。 of 表示输出文件 bs 每个块多少个字节,可以带单位 count 表示多少个块 mkswap -f swapfile 二、启用swap交换空间手动开启交换空间语法：swapon [参数] 交换空间 例： 1、开启交换文件/swapfile swapon /swapfile 2、开启交换分区/dev/sdb1 swapon /dev/sdb1 自动开启交换空间编辑 /etc/fstab文件，并增加如下代码。 /swapfile swap swap defaults 0 0 自动开启交换空间在重启系统后，swap还是有效的。三、关闭swap交换空间1、停止swap交换空间 swapoff /swapfile 2、删除swap文件 rm -rf /swapfile 3、修改/etc/fstab文件 把/swapfile swap swap default 0 0 这行删除。
基本格式命令名称 选项 参数例：rm -r hello.c有些命令不写选项和参数也能执行，有些命令在必要的时候可以附带选项和参数选项格式Linux的选项可分为：短格式选项:是长格式选项的简写，用一个减号-和一个字母表示，例如ls -l长格式选项:是完整的英文单词，用两个减号--和一个单词表示，例如ls --all一般情况下，短格式选项是长格式选项的缩写，也就是一个短格式选项会有对应的长格式选项。当然也有例外，比如 ls 命令的短格式选项-l就没有对应的长格式选项，所以具体的命令选项还需要通过帮助手册来查询。使用参数参数是命令的操作对象，一般情况下，文件、目录、用户和进程等都可以作为参数被命令操作，命令一般都需要加入参数，用于指定命令操作的对象是谁。如果可以省略参数，则一般都有默认参数。例：ls /home，如果没有参数，则其默认参数为当前目录换行如果命令不能在一行内写完，可以在末尾加反斜杠’\’来在下一行继续写。管道单竖线”|”是命令管道符，将前一个命令的结果作为后一个命令的输入。例：dpkg -l | wc -l 显示当前系统安装的软件总数输入输出重定向command >file： 标准输出重定向到一个文件,错误仍然输出屏幕command >>file： 标准输出重定向到一个文件(追加)command <file： 以file做为文件标准输入command < file1 >file2：以file1做为标准输入，file2做为标准输出命令置换将一个命令的输出作为另一个命令的参数，使用键盘esc下方的“`“引号例：ls \`pwd\`。基本命令ls，cat，less|more，rm，cp，mv，mkdir，cd，echo，pwd，clear，man，freegrep：查找字符串head|tail：显示文件开头|结尾diff：比较两个文件du：显示磁盘空间的使用情况free：查看内存使用情况
一、Http与Https简介HTTP：HTTP协议是基于C/S架构进行通信的简单的请求-响应协议，而HTTP协议的服务器端实现程序有nginx等，其客户端的实现程序主要是Web浏览器，例如IE、chrome。HTTPS：是以安全为目标的HTTP通道，简单讲是HTTP的安全版，即HTTP下加入SSL层。作用有两个：一是建立一个信息安全通道，来保证数据传输的安全；二是确认网站的真实性。主要区别：https协议需要到ca申请证书，一般免费证书较少，因而需要一定费用。http是超文本传输协议，信息是明文传输，https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式，用的端口也不一样，前者是80，后者是443。http的连接很简单，是无状态的；HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，比http协议安全。Https优缺点优点：相比于http，https可以提供更加优质保密的信息，保证了用户数据的安全性，此外https同时也一定程度上保护了服务端，使用恶意攻击和伪装数据的成本大大提高。缺点：第一CA机构颁发的证书可能需要年费；其二，https加重了服务端的负担（相比http在传递信息过程中多了加密解密），会产生一些性能损耗。二、获取数字证书配置支持https的网站需要数字证书，通常是在可信任的证书授权机构申请，如果对安全性要求不高或测试可以使用自签证书。以自签证书为例，使用openssl一键生成hello.com的自签证书。执行openssl req -x509 -days 365 -newkey rsa:4096 -nodes -keyout hello.key -out hello.crt\ -subj "/C=CN/ST=BJ/L=BJ/O=HD/OU=dev/CN=hello.com/emailAddress=hello@world.com"将会在本目录下生成数字证书hello.crt和证书密钥hello.key，同样的在CA机构申请的证书也会得到这两个文件，数字证书可以任意传播，而证书密钥要私密保存。三、配置nginx这里以debian9为例，修改/etc/nginx/sites-available/default文件，关键配置如下：# listen 80 default_server; # listen [::]:80 default_server; # SSL configuration # listen 443 ssl default_server; listen [::]:443 ssl default_server; ssl_certificate_key /etc/nginx/ssl/hello.key; ssl_certificate /etc/nginx/ssl/hello.crt;主要关闭http端口80的访问和开启https端口443的支持（当然端口可以任意指定），并且指定数字证书和证书密钥的路径（绝对路径）。四、重定向可以关闭http的访问，也可以配置http重定向到https。server { listen 80; server_name hello.com; rewrite ^(.*)$ https://${server_name}$1 permanent; }
数字证书是指CA（即证书授权中心，或称证书授权机构）发行的一种电子文档，是一串能够表明网络用户身份信息的数字，提供了一种在计算机网络上验证网络用户身份的方式，因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。验证网站是否可信（针对HTTPS）验证某文件是否可信（是否被篡改）签发新的数字证书，自签的数字证书为根证书数字证书常见格式PEM--openssl默认采用的信息存放格式，以"-BEGIN"开头，"-END"结尾，内容是BASE64编码。KEY--一般指PEM格式的私钥文件。CSR--证书请求文件。生成数字证书前,一般先由用户提交证书申请文件,然后由CA来签发证书。CRT--证书文件，一般是指使用PEM格式的证书，Apache和Nginx服务器偏向于使用这种编码格式。CER--证书文件，一般是指使用DER格式的证书，Java和Windows服务器偏向于使用这种编码格式。证书主题表达证书的内容，例如：-subj "/C=CN/O=CA/CN=www.ca.com"所在国家 (Country) 简称：C字段，只能是国家字母缩写所在省份 (State/Provice) 简称：ST字段所在城市 (Locality) 简称：L字段单位名称 (Organization Name) ：简称：O字段，对于SSL证书，一般为网站域名公用名称 (Common Name) 简称：CN字段，对于SSL证书，一般为网站域名或IP地址数字证书的签名有两种方式，一种是自签，一种是CA签自签的数字证书自签需要一个密钥和组织（或网站）信息，使用 -newkey直接随机生成一个，使用-subj指定组织信息，还可以指定证书过期时间。// 先生成密钥，再自签 openssl genrsa -out ca.key 4096 openssl req -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=CN/O=CA/CN=www.ca.com" // 一步生成 openssl req -x509 -days 3650 -newkey rsa:4096 -noenc -keyout ca.key -out ca.crt -subj "/C=CN/O=CA/CN=www.ca.com"CA签发的数字证书1、生成证书私钥openssl genrsa -out my.key 40962、根据私钥生成证书签名请求openssl req -new -key my.key -out my.csr -subj "/CN=www.my.com"3、CA中心签发证书这里使用上一节自签的CA证书来签发openssl x509 -req -days 3650 -in my.csr -CA ca.crt -CAkey ca.key -out my.crt4、签发带SAN扩展的证书SAN拓展可以指定多个域名，先创建配置san.ext文件[v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1=www.my.com然后使用配置文件来签发证书openssl x509 -req -days 3650 -in my.csr -CA ca.crt -CAkey ca.key -out my.crt -extensions v3_req -extfile san.ext查看证书// 查看证书详情 openssl x509 -text -in my.crt // 查看证书申请信息 openssl req -text -in my.csr数字证书格式转换// crt转ceropenssl x509 -in my.crt -outform der -out my.cer// cer转crtopenssl x509 -in my.cer -inform der -out my.crt
jenkins是一个开源可扩展自动化服务器，可用作简单的CI服务器（持续集成）或CD集线器（持续交付）。配置jenkins源由于debian的官方库中没有此软件，需要单独配置。1.安装基本工具wget和gnupg# apt install wget gnupg2.安装密钥和添加源# wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | apt-key add - # echo 'deb http://pkg.jenkins.io/debian-stable binary/' > /etc/apt/sources.list.d/jenkins.list安装jenkinsjenkins需要java运行环境，这里选择openjdk-11，由于更改源配置，所以要先更新软件包索引。# apt update # apt install openjdk-11-jre jenkins启动# service jenkins start访问jenkins其配置文件在/etc/default/jenkins，可以修改绑定的端口（默认8080）等信息，在启动jenkins之后，可以使用浏览器访问它，地址是:localhost:8080。在第一次使用时需要按照引导安装推荐的插件，此时可能遇到jenkins实例离线问题，需要修改/var/lib/jenkins/hudson.model.UpdateCenter.xml文件，将插件下载地址由https改为http并重启jenkins服务# sed -i "s/https/http/g" /var/lib/jenkins/hudson.model.UpdateCenter.xml在安装完插件进入到主界面可能会白屏，再一次重启jenkins服务即可。# service jenkins restart
GitLab 是一个用于仓库管理系统的开源项目，使用Git作为代码管理工具，并在此基础上搭建起来的web服务。配置gitlab-ce源由于debian的官方库中没有此软件，需要单独配置，这里使用社区提供的脚本一键配置，其他linux发行版也可使用此脚本。1.安装wget# apt install wget2.下载安装脚本并执行# wget -O - https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh |bash安装gitlab-ce在前面我们已经配置好gitlab-ce的源，可以使用命令直接安装了,软件包比较大速度也慢，请耐心等待。# apt update # apt install gitlab-ce配置修改配置文件/etc/gitlab/gitlab.rb# gitlab-ctl reconfigure启动# gitlab-ctl start
简介Markdown是一种纯文本格式的标记语言。通过简单的标记语法，它可以使普通文本内容具有一定的格式。在 2004 由约翰·格鲁伯（英语：John Gruber）创建。编写的文档后缀为 .md, .markdown。一、标题在想要设置为标题的文字前面加#来表示，一个#是一级标题，二个#是二级标题，以此类推。支持六级标题。注：标准语法一般在#后跟个空格再写文字。示例：# 这是一级标题 ## 这是二级标题 ### 这是三级标题效果：这是一级标题这是二级标题这是三级标题二、段落Markdown 段落没有特殊的格式，直接编写文字就好，段落的换行是使用两个以上空格加上回车。使用空行来换行。示例：段落1 段落2 效果：段落1 段落2三、字体加粗：要加粗的文字左右分别用两个*号包起来斜体：要倾斜的文字左右分别用一个*号包起来斜体加粗：要倾斜和加粗的文字左右分别用三个*号包起来删除线：要加删除线的文字左右分别用两个~~号包起来示例：**这是加粗的文字** *这是倾斜的文字*` ***这是斜体加粗的文字*** ~~这是加删除线的文字~~效果：这是加粗的文字这是倾斜的文字`这是斜体加粗的文字这是加删除线的文字四、引用在引用的文字前加>即可。引用也可以嵌套，如加两个>>三个>>>可以一直加下去示例：>这是引用的内容 >>这是引用的内容 >>>>>这是引用的内容效果：这是引用的内容这是引用的内容这是引用的内容五、分割线三个或者三个以上的-或者*都可以。示例：--- *****效果如下：可以看到，显示效果是一样的。六、图片语法：![图片alt](图片地址 ''图片title'')图片alt就是显示在图片下面的文字，相当于对图片内容的解释。图片title是图片的标题，当鼠标移到图片上时显示的内容，title可加可不加。示例：![flower](/usr/uploads/2019/07/2749366889.jpeg "蔷薇花")效果：七、超链接语法：[超链接名](超链接地址 "超链接title")，title可加可不加。示例：[百度](http://baidu.com)效果：百度八、列表无序列表语法：无序列表用 - + * 任何一种都可以，注意：- + * 跟内容之间都要有一个空格- 列表内容 + 列表内容效果：列表内容列表内容有序列表语法：数字加点，1. 列表内容2. 列表内容注意：序号跟内容之间要有空格，数字任填，会自动重新排序示例：1. 列表内容 1. 列表内容效果：列表内容列表内容列表嵌套上一级和下一级之间敲三个空格即可示例：1. 列表内容 - 列表内容效果：列表内容列表内容九、表格语法：表头|表头|表头 ---|:--:|---: 内容|内容|内容 内容|内容|内容第二行分割表头和内容。有一个就行，为了对齐，多加了几个。文字默认居左，两边加：表示文字居中，右边加：表示文字居右。注：原生的语法两边都要用 | 包起来。此处省略示例：姓名|技能|排行 --|:--:|--: 刘备|哭|大哥 关羽|打|二哥 张飞|骂|三弟效果：姓名技能排行刘备哭大哥关羽打二哥张飞骂三弟十、代码单行代码：代码之间分别用一个反引号包起来\`create database hero;\`代码块：代码之间分别用三个反引号包起来，且两边的反引号单独占一行;或使用4个空格或者一个制表符（Tab 键）。\`\`\`function fun(){ echo "这是一句非常牛逼的代码";}fun();\`\`\`效果：单行代码create database hero;代码块function fun(){ echo "这是一句非常牛逼的代码"; } fun();十一、转义显示markdown的专有字符可能需要转义，代码块内的内容不会转义。示例：\\ 反斜杠 \` 反引号 \* 星号 \_ 下划线 \{\} 大括号 \[\] 中括号 \(\) 小括号 \# 井号 \+ 加号 \- 减号 \. 英文句号 \! 感叹号效果：\ 反斜杠\` 反引号* 星号\_ 下划线{} 大括号[] 中括号() 小括号\# 井号+ 加号- 减号. 英文句号\! 感叹号
安装ssh服务端和客户端$ sudo apt install ssh #两个都安装 $ sudo apt install openssh-server #安装服务端 $ sudo apt install openssh-client #安装客户端密钥登录配置客户端生成SSH秘钥对，在用户主目录.ssh下id-rsa和id-rsa.pub，记住公钥id-rsa.pub内容$ ssh-keygen -t rsa -b 4096 #(生成的rsa秘钥对的长度是4096个bit) 在服务器要登录的用户目录下创建.ssh/authorized_keys文件，将自己的公钥写入其中$ echo <公钥> >> .ssh/authorized_keys配置服务器的/etc/ssh/sshd_config文件，把PubkeyAuthentication配置为yes允许使用基于密钥认证的方式登录$ sudo nano /etc/ssh/sshd_config启动sshd服务和客户端登录$ sudo service ssh start $ ssh yi@127.0.0.1