mobaijun 发表于 2022-4-2 15:48

Linux从基础到实用总结-原创非首发

我希望技术成为潮流,代码改变世界,开源和分享成为下意识。就从我开始吧,我叫墨白,一名Java开发工程师,热爱开源,喜欢分享,期待讨论,欢迎你加入开发者的大家庭
下文摘自很早的学习笔记,首发公众号,这里算是二次创作,添加了不少后续记录的内容,如有其他问题,欢迎留言讨论,谢谢:lol :lol :lol


## Linux介绍

* Windows的不足
* Windows是收费的
* 系统长时间运行,安装多了,系统越来越慢,越来越不稳定。
* 病毒和流氓软件很多
* Linux的优势
* Linux系统是免费,很多还是开源的。
* 长时间运行,很稳定的
* 几乎没有病毒和流氓软件

## 学习Linux的好处

日常在Windows中开发完程序后,需要部署到一个相对比较安全,稳定的服务器中运行,这台服务器上安装的往往不是Windows操作系统,而是Linux操作系统。

windows默认安装完成软件就可以连外网,linux默认安装完软件是不可以连外网,必须防火墙放过才可以

### linux的概述

Linux(linux is not unix)是基于Unix的开源、免费、多用户、多任务的操作系统,由于系统的稳定性和安全性。几乎成为程序代码运行的最佳系统环境。

### linux的分类

* 按照市场的需求不同

* 图形界面
* 字符界面(推荐),特点:性能最优

* 按照原生程度不同

* 内核版,linux之父(托瓦兹)团队开发

    * 特点:免费

      ​      功能:主要解决操作系统底层,操作内存,cpu,硬盘,网卡。。。

* 发行版(推荐使用)

    * 是第三方个人或组织在内核基础上进行二次开发(包装)
    * ​      特点:功能应用更多,偏向应用,大多数发行版都是免费的

### Linux安装

两种安装方式

* 在PC电脑上进行安装
* 使用虚拟机安装

常见虚拟机软件

* VMWare 软件,威睿公司,收费的(推荐使用,可以试用)
* VirtualBox软件,免费的,最开始是sun公司,由于被oracle收购了,所以目前属于oracle

### windows主机连接linux虚拟机与虚拟机网卡介绍

| 命令   | 含义                        |
| -------- | --------------------------- |
| ifconfig | linux系统用于查看ip地址信息 |
| ip addr| linux系统用于查看ip地址信息 |

在windows主机上使用dos命令ping进行拼通linux系统

~~~bash
ping www.mobaijun.com
~~~

### 使用客户端工具连接linux系统

#### 常见的客户端软件

​      SecureCRT(操作客户端命令),SecureFx(用于传输文件)

​      XShell(操作客户端命令),XFtp(用于传输文件)

## Linux目录学习

### 目录操作1—目录结构

> linux系统没有盘符,一切从根目录/开始,如下图

![](https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200525150813.png)

> 根目录下所有子目录

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200525150918.png)

### 常见的目录配置

~~~bash
# bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。

# boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

# dev : dev是Device(设备)的缩写, 存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

# etc: 这个目录用来存放所有的系统管理所需要的配置文件和子目录。

# home:用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

# lib:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。

# lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

# media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

# mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

# opt:这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

# proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。

# root:该目录为系统管理员,也称作超级权限者的用户主目录。

# sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

# srv:该目录存放一些服务启动之后需要提取的数据。

# sys:这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。

# tmp:这个目录是用来存放一些临时文件的。

# usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

# usr/bin: 系统用户使用的应用程序。

# usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。

# usr/src: 内核源代码默认的放置目录。

# var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

# run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
~~~

* 特殊目录,非必要情况不建议修改或删除

|   目录   | 含义                                                         |
| :------: | ------------------------------------------------------------ |
| bin目录| 存放着所有linux系统的命令                                    |
| root目录 | 超级管理员root用户的主目录                                 |
| home目录 | 存放所有普通用户主目录的位置                                 |
| usr目录| (unix shared resources)资源共享目录,所有用户都可以操作的目录,以后我们安装软件就安装到这里usr/local,这样所有用户都可以使用软件 |
| etc目录| 存储配置文件的目录,以后网卡配置文件,权限配置文件都在这里   |

### 目录操作—切换—创建—查看

| 作用 | 改变目录/CD和目录名直接需要空格 |
| ---- | ------------------------------- |
| /    | 切换到根目录                  |
| .    | 当前目录                        |
| ..   | 上一级目录                      |
| ~    | 返回当前用户主目录            |
| -    | 返回上一次目录                  |

### 创建目录

| mkdir 目录名称 | 创建一个目录 |
| -------------- | ------------ |
| mkdir -p       | 创建多级目录 |

~~~bash
mkdir -p /父目录名称/子目录名称
~~~

> -p,如果父目录不存在会先创建父目录再创建子目录

### 查看目录内容

| ls参数 | 显示当前目录下的文件和目录                                 |
| ------ | ------------------------------------------------------------ |
| -l   | 以详细的方式显示当前目录下的文件和目录                     |
| -a   | 显示当前目录下的所有文件和目录,包含隐藏目录,.XXX开头的文件和目录是隐藏的 |

### 目录操作搜索—重命名—复制—删除—帮助

| find               | [目录名称] [-name'查询字符串']             |
| ------------------ | ------------------------------------------ |
| 无参数             | 搜索当前目录和它的子目录所有文件和目录   |
| 目录名称         | 搜索指定目录下和他的子目录所有的文件和目录 |
| -name '查询字符串' | 指定具体查询字符串                         |
|                  | *匹配多个字符串                            |
|                  | ?匹配一个字符                              |

## 文件操作

### 重命名与移动

* 重命名

| move=mv                  |      |
| -------------------------- | ---- |
| mv 旧名称 新名称         |      |
| mv既可以改文件也可以改目录 |      |

* 移动

| mv 源目录 目标目录         |      |
| -------------------------- | ---- |
| mv将源目录移动到目标目录下 |      |

* 复制

| cp [参数] 源文件或目录 目标目录 将源文件或整个目录复制到目标目录下 |      |
| ------------------------------------------------------------ | ---- |
| -r recursion连同子目录下所有文件全部复制                     |      |

* 删除

| rm   | 参数 文件或目录1                        文件或目录2可以同时指定多个文件或目录 |
| ---- | ------------------------------------------------------------ |
| -r   | recursion 连同子目录一起删除,只用来删除目录                  |
| -f   | 强制删除,删除之前会确认,需要回答yes/no                     |

> 注意:千万不要rm -rf /*会导致删除所有的文件或目录,导致系统崩溃了

* 查看帮助文档
* 命令--help查看英文文档手册,使用q退出
* man 命令   查看中文文档手册【推荐方式】,使用q退出

### 创建文件与查看文件内容

| touch 文件1 文件2   | 创建一个或多个文件0字节大小                                  |
| ------------------- | ------------------------------------------------------------ |
| cat 文件名          | 查看文件所有内容                                             |
| more 文件名         | 查看文件所有的内容,可以分屏显示                              |
| head 文件名         | 查看文件前10行                                             |
| had -n 行数 文件名| 查看前面指定的行数                                           |
| tail 文件名         | 查看文件后10行                                             |
| tail -n 行数 文件名 | 查看文件后指定的行数                                       |
| less 文件名         | 查看文件所有内容<br />-n 显示行号<br />PageUp 向前翻页<br />PageDown 向后翻页<br />q:退出 |

### 编辑文件内容

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200525154147.png)

* 命令模式下命令

| 命令                           | 描述                                       |
| ------------------------------ | -------------------------------------------- |
| i                              | 在当前光标的前面插入字符                     |
| a                              | 在当前光标的后面插入字符                     |
| o                              | 在当前光标的下一行插入字符                   |
| 命令或底行模式下常用的编辑命令 |                                              |
| yy                           | 复制当前行                                 |
| p                              | 如果前面已经复制了,在当前下面复制            |
| dd                           | 删除当前行                                 |
| u                              | 撤销                                       |
| /字符串                        | 搜索文本内容<br />n:向后搜索<br />N:向前搜索 |
| wp                           | 保存并退出                                 |
| q!                           | 不保存强制退出                               |
| wp!                            | 强制保存退出(只读文件使用)                   |

### 压缩与解压

| 拓展名称| 分类                  |
| --------- | ----------------------- |
| .zip/.rar | Windows系统压缩包       |
| .tar      | 在Linux下的打包文件   |
| .gz       | 在Linux下的压缩文件   |
| .tar.gz   | 在Linux下的打包压缩文件 |

* 压缩文件

| tar            | 参数 压缩包名 一个或多个文件{对一个或多个文件进行打包并压缩} |
| ---------------- | ------------------------------------------------------------ |
| -c               | 创建一个打包的文件                                           |
| -v               | 显示打包的详细过程                                           |
| -z               | 压缩文件                                                   |
| -f<压缩文件名称> | 只当压缩包的文件名称,f后面跟着压缩的文件名,一般放在参数最后面 |

* 解压文件

| tar 参数 压缩文件名称 | 解压文件到当前目录 |
| --------------------- | ------------------ |
| -x                  | 解压指定的文件   |
| -v                  | 显示解压的详细过程 |
| -f<压缩文件>          | 指定要解压的文件   |
| -C                  | 解压到指定的目录下 |

### 查看工作目录位置—查看进程—内存耗用—杀死进程

* 查看进程

| pwd| 查看当前工作目录                     |
| ---- | -------------------------------------- |
| ps   | 显示当前用户通过终端启动的进程         |
| -a   | 显示所有用户通过终端启动的进程         |
| -u   | 显示所有用户通过终端启动的进程详细信息 |
| -x   | 显示所有用户的所有进程               |

* 杀死进程

| kill 参数 进程号 | 通过ps可以查看到进程号 |
| ---------------- | ---------------------- |
| -9               | 强制终止进程         |

* 查看系统内存整体耗用

| top                  |
| -------------------- |
| 查看系统内存整体耗用 |

### 搜索文件内容

> grep是一种强大的文本搜索工具,它能使用字符串搜索文本,并把匹配的行和行号打印出来。

* 搜索

| grep 参数 字符串 文件名 | 搜索指定文件中字符串内容 |
| ----------------------- | ------------------------ |
| -n                      | 搜索结果中显示行号       |
| -v                      | 显示不匹配的行         |
| -i                      | 忽略大小写搜索         |

### 管道

> 管道就是“|”

* 命令

| 语法 | 命令1 \| 命令2                            |
| ---- | ----------------------------------------- |
| 解释 | 管道命令\|,必须要有两条以上的命令参与运算 |

## 系统命令

### 关机与重启

* Linux/Windows

| Linux               | 释义             |
| ------------------- | ---------------- |
| shutdown now      | 关闭服务器       |
| -h+参数         | 指定**时间后关机 |
| shutdown -n 16:05   | 指定时间关机   |
| shutdown -c         | 清除定时命令   |
| reboot            | 重启Linux      |
| **Windows命令**   | **释义**         |
| shutdown -s         | 立刻关机         |
| shutdown -s-t秒 | 指定多少秒后关机 |
| shutdown -a         | 清除定时计划   |
| shutdown -r         | 系统重启         |

~~~bash
# 重启
$ reboot
# 将数据同步到硬盘中
$ sync
# 关闭系统,等同与shutdown -h now 和 poweroff
$ halt
~~~

### 文件权限

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200525160555.png)

* 每一类用户都有3个权限
* r:读取权限, 只读
* w: 写入权限 , 可以编辑文件
* x:执行权限, 由于某些文件是可以执行的,如有有执行权限才可以执行
* 操作权限
* 添加权限:chmod 用户或组+权限资源文件或目录
* 删除权限:chmod 用户或组-权限资源文件或目录
* 修改权限:chmod 用户或组=权限资源文件或目录

### 文件上传

~~~bash
# 安装rz插件
$ yum -y install lrzsz
# 上传文件
$ rz
~~~

### crontab定时任务

| 命令         | 含义                           |
| -------------- | ------------------------------ |
| crontab -l   | 查看当前用户的定时任务列表   |
| crontab -e   | 进入编辑当前用户定时任务编辑器 |
| crontab -r   | 删除当前用户的定时任务         |
| * * * * * 命令 | 每分钟执行一次命令             |

## 服务管理

### 服务管理—自启动服务管理

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200525161022.png)

* 服务管理的命令:systemctl start/stop/restart/status 服务名操作服务启动/停止/重启/查看状态
* 设置服务开机启动:systemctl enable 服务名.service
* 设置服务开机不启动:systemctl disable 服务名.service

## 网络管理

### 网络管理1-主机名管理

* 主机名称命令

~~~bash
# 查看主机名
$ hostname
# 修改主机名称 永久修改计算机名字,需要重启或使用bash刷新
$ hostnamectl set-hostname
# 刷新
$ bash
~~~

### 网络管理2-网络服务管理

~~~bash
# 启动网络
$ systemctl start network
# 停止
$ systemctl stop network
# 重启
$ systemctl restart network
# 查看状态
$ systemctl status network
~~~

> 如果linux系统不能上网(内网和外网),需要检查网络服务

### 网络管理3-网卡激活管理

* 关闭网卡激活实现步骤

~~~bash
# 找到网卡配置文件ens32
$ cd /etc/sysconfig/network-scripts/ # 网卡配置文件目录
# 查看目录文件
$ ls
# 修改配置文件
$ vim ifcfg-ens32
# 修改配置,关闭网卡
ONBOOT=no
# 重启网络服务
$ systemctl restart network
# 测试是否可以联网
$ ping www.mobaijun.com
# 修改配置/激活网卡 修片配置文件ifcfg-ens33,开启网卡
$ ONBOOT=yes
# 重启网络服务
$ systemctl restart network
~~~

### 网络管理4-配置静态ip

* IP配置类型
* **dhcp:动态IP**
* **static:静态IP**
* 配置静态IP步骤
* 给linux系统设置ip必须确定ip的地址、子网掩码、网关
* **IP地址(互联网协议地址):**
    * IP地址由网络号和主机号组成
* **子网掩码**
    * 用于标识ip地址的网络号是多少位
* **网关**
    * 用于区别不同的网络,网关可以解决不同的网络通信,需要硬件支持路由器
* **DNS**
    * 域名服务器,根据域名获取对应的服务器ip地址,这样才可以访问外网
* 修改网卡配置

~~~bash
# 找到网卡配置文件ens33
$ cd /etc/sysconfig/network-scripts/ # 网卡配置文件目录
# 查看目录文件
$ ls
# 修改配置文件
$ vim ifcfg-ens33
# 修改配置,切换成静态模式
BOOTPROTO=static
# 最下方添加相关内容
IPADDR=192.168.56.135
GATEWAY=192.168.123.83
NETMASK=255.255.255.0
DNS1=114.114.114.114
# 重启网络服务
$ systemctl restart network
# 测试是否可以联网
$ ping www.mobaijun.com
~~~

* 网卡配置说明

~~~bash
TYPE=Ethernet                # 网卡类型:为以太网
PROXY_METHOD=none            # 代理方式:关闭状态
BROWSER_ONLY=no                # 只是浏览器:否
BOOTPROTO=dhcp                # 网卡的引导协议:DHCP[中文名称: 动态主机配置协议]
DEFROUTE=yes                # 默认路由:是, 不明白的可以百度关键词 `默认路由`
IPV4_FAILURE_FATAL=no      # 是不开启IPV4致命错误检测:否
IPV6INIT=yes                # IPV6是否自动初始化: 是[不会有任何影响, 现在还没用到IPV6]
IPV6_AUTOCONF=yes            # IPV6是否自动配置:是[不会有任何影响, 现在还没用到IPV6]
IPV6_DEFROUTE=yes            # IPV6是否可以为默认路由:是[不会有任何影响, 现在还没用到IPV6]
IPV6_FAILURE_FATAL=no      # 是不开启IPV6致命错误检测:否
IPV6_ADDR_GEN_MODE=stable-privacy            # IPV6地址生成模型:stable-privacy [这只一种生成IPV6的策略]
NAME=ens33                  # 网卡物理设备名称
UUID=f47bde51-fa78-4f79-b68f-d5dd90cfc698    # 通用唯一识别码, 每一个网卡都会有, 不能重复, 否两台linux只有一台网卡可用
DEVICE=ens33                  # 网卡设备名称, 必须和 `NAME` 值一样
ONBOOT=no                        # 是否开机启动, 要想网卡开机就启动或通过 `systemctl restart network`控制网卡,必须设置为 `yes`
~~~

### 网络管理5-克隆虚拟电脑

* **克隆步骤**
* **关闭当前虚拟机linux系统**
* **选择当前虚拟机/管理/克隆/**
* **修改克隆出来的静态ip**
* **修改计算机的名字**

### 网络管理6-域名映射

* ##### url域名访问服务器通信原理


!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200528161739.png)

* 本地域名映射文件位置
* Windows系统本地域名映射位置:
* `c:\windows\System32\drivers\etc\hosts`
* Linux系统本地域名映射位置:
* `/etc/hosts`
* 修改本地域名映射实现步骤

~~~bash
# 编辑本地etc/hosts域名映射文件
$ vim /etc/hosts
# 添加域名映射IP的配置
192.168.123.83 www.mobaijun.com
# 保存退出
$ wq
# 测试效果
$ ping www.mobaijun.com
~~~

### 网络管理7-查询网络进程使用端口号

* 常用命令

| netstat | null   | 显示网络状态             |
| -------------- | -------- | ------------------------ |
| -n             | number   | 显示程序的IP地址和端口号 |
| -t             | TCP      | 只显示TCP协议链接的程序|
| -l             | listener | 显示监听中的Socket       |
| -p             | Programs | 显示程序的名称         |
| -u             | UDP      | 查询udp协议通信的程序    |

~~~bash
# 查看端口、udp、tcp、正在监听、显示程序名的所有程序
$ netstat -nutlp
~~~

### DNS测试命令

> **dig命令**是常用的域名查询工具,可以用来测试域名系统工作是否正常

~~~bash
# 语法格式
$ dig(选项)(参数)
~~~

| 命令          | 简介                                                         |
| ------------- | ------------------------------------------------------------ |
| @<服务器地址> | 指定进行域名解析的域名服务器                                 |
| -b<ip地址>    | 当主机具有多个IP地址,指定使用本机的哪个IP地址向域名服务器发送域名查询请求 |
| -f<文件名称>| 指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息 |
| -P            | 指定域名服务器所使用端口号                                 |
| -t<类型>      | 指定要查询的DNS数据类型                                    |
| -x<IP地址>    | 执行逆向域名查询                                             |
| -4            | 使用IPv4                                                   |
| -6            | 使用IPv6                                                   |
| -h            | 显示指令帮助信息                                             |

## 防火墙

### 防火墙管理

>* 防火墙作用
>
>是防止外界访问系统内部的程序,防火墙允许哪个软件访问外网,这个软件才可以进行网络通信

| 命令                        | 简介               |
| --------------------------- | ------------------ |
| systemctl status firewalld| 查看状态         |
| systemctl start firewalld   | 启动防火墙         |
| systemctl stop firewalld    | 关闭防火墙         |
| systemctl enable firewalld| 开机自启         |
| systemctl disable firewalld | 让防火墙开机不自启 |

~~~bash
# 开启防火墙
$ servicefirewalld restart
# 关闭防火墙
$ service firewalld stop
# 开启防火墙
$ service firewalld start
# Ubuntu下载防火墙
$ sudo apt install firewalld
# 查看防火墙状态
$ systemctl status firewalld.service
~~~

### SSH有密登录和免密登录

* **SSH实现免密登录步骤**

~~~bash
# 在本地生成一对公钥和私钥
$ ssh-keygen
# 将公钥发送给远程服务器,必须给出远程服务器的密码本地才接收公钥
$ ssh-copy-id address
# 查看公钥
$ cat authorized_keys
# 发送登录请求,实现免密登录
$ ssh address
~~~

## 项目安装和部署

### 部署项目1-本地软件安装命令rpm

> RedHat Package Manager(RPM), 擅长安装本地的软件
>
> * rpm的作用
>   * 查询已安装的软件
>   * 安装软件
>   * 卸载软件

* 常用命令

| rpm [包名] | 类似软件管家{添加,卸载,查询}                     |
| ----------------- | ------------------------------------------------ |
| -v                | 显示安装的详细过程                               |
| -q                | 查询某个软件是否安装                           |
| -a                | 查询所有软件                                     |
| -h                | 列出软件安装时的标记                           |
| -i <args>         | install 安装指定的软件                           |
| --nodeps          | 不验证软件相关关联性,常于-e一起使用,表示强制卸载 |

* 测试

~~~bash
# 查询所有已安装软件
$ rpm -qa
# 安装指定的软件包
$ rpm -ivh <包名>
# 强制卸载指定软件包
$ rpm -e --nodeps <包名>
~~~

### 开启VIM编辑器高亮

> 如果系统没有安装VIM,需要先安装

1. 安装VIM,并设置VIM的命令别名为VI

~~~bash
# 1.下载vim
$ yum install vim -y
# 2.编辑配置文件
$ vi/etc/bashrc   或者 vi ~/.bashrc
>>>>>>>>>>在最后新加一行>>>>>>>>>>>>>
aliasvi=vim
# 3.保存推出
$ :x
# 4.刷新配置
$ source /etc/bashrc 或者 source ~/.bashrc
~~~

* 开启vim语法高亮

~~~shell
# 1.编辑文件
vi /etc/vimrc 或者 vi ~/.vimrc
》》》》》》》》》》》在最后新加一行》》》》》》》》》》》
syntax on
:x保存退出后,reboot重启机器即可。
~~~

### RPM_jdk安装

~~~bash
# 查询本地是否有JDK
$ rpm -qa | grep java
# 查询是否安装JDK
$ rpm -qR jdk
# 下载jdk
$ wget https://download.oracle.com/otn/java/jdk/8u291-b10/d7fc238d0cbf4b0dac67be84580cfb4b/jdk-8u291-linux-x64.tar.gz?AuthParam=1625038235_ffa5f5649358bb628a09b26cad483c7f
# 新建soft包存放未解压的安装包
$ mkdir soft
# 将jdk软件上传到linux系统/soft目录下并解压到指定目录
$ tar -xvf jdk-8u251-linux-x64.tar.gz -C /usr/local
# 配置linux的jdk环境变量,操作一个/etc/profile环境变量配置文件
$ vim /etc/profile
# 配置环境变量
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_251
CLASSPATH=.:$JAVA_HOME/lib
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
# 重载环境变量配置文件
$ source /etc/profile
# 查看jdk环境变量是否配置成功
$ java -version
~~~

* 阿里云服务器安装JDK出现的bug

> 问题描述:在解压完成安装JDK以后,配置环境变量重载了以后发现`Java -version`无法获取JDK版本信息
>
> > **-bash: java: command not found**
> >
> > * 解决步骤
> >
> > > Linux版本位数和JAVA jdk版本位数,64位Linux只能安装64位jdk
> > >
> > > ~~~bash
> > > # 查看Linux命令:
> > > $ getconf LONG_BIT
> > > ~~~
> >
> > 突然想起来好像是解压JDK出现bug了,但是当时没在意,这会准备重新上传解压,再试试
> >
> > .........重新解压完成,没有报错,应该就是解压出错导致JDK异常,一定要注意,出现/error就要解决,不要不管

### 更换YUM源

~~~bash
# 安装wget
$ yum install -y wget
# 下载CentOS 7的repo文件
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
$ yum clean all
# 生成缓存
$ yum makecache
# 备份CentOS 7系统自带yum源配置文件
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 打开CentOS-Base.repo文件,将文件中的所有http开头的地址更改为https
$ vim /etc/yum.repos.d/CentOS-Base.repo
# 更新YUM
$ yum update
~~~

### 部署项目3-mysql安装-启动-远程授权

* MySQL安装

~~~bash
# 查看CentOS是否自带的MySQL,如果已经安装需要卸载。如果没有找到,则表示没有安装
$ rpm -qa | grep mysql
# 在线获取CentOS7的mysql的rpm安装文件,直接执行如下命令:
$ wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
# 执行安装命令
$ rpm -ivh mysql80-community-release-el7-1.noarch.rpm
# 得到两个配置文件,进入/etc/yum.repos.d目录下查询
$ cd /etc/yum.repos.d
# 编辑mysql-community.repo文件,配置资源库下载版本选择
$ vim mysql-community.repo
# 编辑需要下载的MySQL版本将`enable=0`改为`enable=1`
{

name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
}
# 下载安装客户端、服务器端、工具包
$ yum -y install mysql-community-client mysql-community-server mysql-community-devel
~~~

* 启动

~~~bash
# 启动MySQL
$ systemctl start mysqld
# 将mysql加到系统服务中并设置开机启动
$ systemctl enable mysqld
# 登录mysql,root用户默认没有密码
$ mysql -uroot -p
# 如果需要密码,复制/var/log/mysqld.log下password后面的参数
$ cat /var/log/mysqld.log
# 在mysql中修改自己的密码
$ set password = password('root');
# MySQL8.0修改密码如下
$ alter user '用户名'@'登录主机' identified by '密码(自定义)';
# 或者alter
$ alter user 'root'@'localhost' identified by 'www.mobaijun.com'
# 退出
$ exit
# 重新登录
$ mysql -uroot -proot
~~~

* MySQL5.X设置远程连接权限、开放端口号

> 开启mysql的远程登录权限,默认情况下mysql为安全起见,不支持远程登录mysql,所以需要设置开启,并且刷新权限缓存。远程登录mysql的权限登录mysql后输入如下命令


~~~bash
# 开启mysql的远程登录权限
$ grant all privileges on *.* to 'root'@'%' identified by 'root';
# 开放主机远程登录权限%表示所有
$ update user set host='%' where user='root';
# 刷新权限缓存
$ flush privileges;
~~~

* MySQL8.0开启远程登录以及授权

~~~bash
# 登录数据库
$ mysql -u root -p"password"
# 查看数据库
$ show databases;
# 选择使用user数据库
$ use mysql;
# 使用以下命令开启root用户远程访问权限:
# 创建用户(root:用户名;%:任意ip,也可以指定,root默认就是localhost;:登录密码)
$ CREATE USER 'root'@'%' IDENTIFIED BY '你的密码';
# 授权,默认创建的用户权限是usage,就是无权限,只能登录而已,(all:所有权限,这里有select,update等等权限,可以去搜一下;后面的*.*:指定数据库.指定表,这里是所有;to后面就是你刚才创建的用户)
$ GRANT ALL ON *.* TO 'root'@'%';
# 修改密码
$ ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
# 刷新权限
$ FLUSH PRIVILEGES;
~~~

* 开放Linux的对外访问的端口3306

~~~bash
# 开放的端口永久保存到防火墙
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 查看防火墙已开放端口
$ firewall-cmd --list-ports
~~~

* Navicat测试

### 部署项目4-tomcat安装-启动

* [下载Tomcat](https://tomcat.apache.org/download-80.cgi)

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200529105937.png)

~~~bash
# 将软件上传到linux系统/soft目录下并解压
$ tar -xvf apache-tomcat-8.5.55-src.tar.gz-C /usr/local/
# 改名
$ mv apache-tomcat-8.5.55-src tomcat8
# 进入bin目录
$ cd /usr/local/tomcat8/bin
# 启动tomcat服务器
$ ./startup.sh
# 提示权限不够解决方案
$ chmod u+x *.sh
# 重启应用服务
$ ./startup.sh
# 开放linux系统防火墙8080端口
$ firewall-cmd --zone=public --add-port=8080/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 检查是否生效
$ firewall-cmd --zone=public --query-port=8080/tcp
# windows客户端使用浏览器访问linux的8080端口tomcat
$ 39.108.96.122:8080
# 查看tomcat日志
$ tail -f catalina.out
# tomcat无法找到JAVA_HOME解决方案
# 查看环境变量是否有问题
$ echo $JAVA_HOME
$ echo $JRE_HOME
# 定位到tomcat/bin/setclasspath.sh目录下,文件开头添加环境变量
JAVA_HOME=/usr/local/jdk1.8.0_251
JRE_HOME=/usr/local/jdk1.8.0_251/jre
# 删除tomcat和日志文件
$ rm -rf /usr/local/tomcat
$ rm -rf /usr/local/logs/*.txt &
$ rm -rf /usr/local/logs/*.log &
~~~

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200529110826.png)

### 部署项目5-Redis安装-启动

~~~bash
# 添加EPEL Repository
$ yum install epel-release
# 更新yum
$ yum update
# 安装Redis
$ yum install redis
# 启动Redis
$ systemctl start redis
# 设置开启启动
$ systemctl enable redis
# 验证Redis是否安装成功 /如果返回PONG,说明Redis安装成功
$ redis-cli ping
# 设置Redis密码/打开Redis配置文件/找到# requirepass foobared,取消注释,将foobared 改成你的密码
$ vi /etc/redis.conf
# 全局查找,修改密码
$ requirepass root
# 然后重启redis服务
$ systemctl restart redis
# 使用AUTH验证登录
$ redis-cli
$ 127.0.0.1:6379> AUTH root
# 开启Redis远程连接打开Redis配置文件,找到bind 127.0.0.1,取消注释,将127.0.0.1 修改为 0.0.0.0 或 服务器的ip地址。别忘了重启 redis 服务
$ vi /etc/redis.conf
# 然后重启redis服务
$ systemctl restart redis
# 配置防火墙开放6379端口
$ firewall-cmd --permanent --zone=public --add-port=6379/tcp
$ firewall-cmd --reload
# 检查是否生效
$ iptables -L -n | grep 6379
# 远程连接
$ redis-cli -h 39.108.96.122
$ 192.168.56.2:6379> AUTH root
~~~

### 部署项目6-Git安装-启动

~~~bash
# 安装git
$ yum install git
# 验证版本
$ git --version
# 配置基本信息
$ git config --global user.name "mobaijun"
$ git config --global user.email "mobaijun8@163.com"
# 验证配置
$ git config --list
~~~

### 部署项目7-项目发布

* 链接Linux数据库(导入数据库)
* 在IDEA中导出war包
* 将war包部署到linux里面的tomcat里面的webapps里面
* 浏览器访问

#### 解决mysql底层乱码问题

* 修改`druid.properties`配置文件,设置mysql使用utf-8解码,添加`?characterEncoding=utf8`

~~~properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/linux?characterEncoding=utf8
username=root
password=root
initialSize=5
maxActive=50
maxWait=30000
minIdle=3
~~~

* **将当前项目需要重新打包,再部署到linux上tomcat的webapps里面**
* **关闭tomcat,执行shutdown.sh**
* **启动tomcat,执行startup.sh**

### 部署项目8-安装 Nodejs

~~~bash
# 12.x是版本
$ curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
# 下载nodejs
$ sudo yum install nodejs
# 验证版本
$ node -v && npm -v
~~~

### 创建用户分配远程登录权限,云服务器

* 创建用户

~~~bash
# 新建用户
$ adduser $user
# 为用户赋予密码
# passwd $user
Changing password for user esuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
~~~

* 赋予权限

~~~bash
# 这里演示为新用户赋予和root用户相同的权限
$ visudo
#执行上述命令后,找到## Allow root to run any commands anywhere 部分。
#追加类似这样的内容“NewUser ALL=(ALL) ALL”,效果如下所示
## Allow root to run any commands anywhere
root ALL=(ALL) ALL      # root这部分是自带的
esuser ALL=(ALL) ALL      # esuser这部分是我新增的
~~~

!(https://i.loli.net/2021/05/24/dYaoIjvkZXMN7Om.png)

> 也可以在/etc/sudoers文件中,追加“NewUser ALL=(ALL) ALL”这部分内容,也是可以的。但是首先需要为/etc/sudoers文件赋予可写的权限。

~~~bash
$ chmod 755 /etc/sudoers

$ chmod -v u+w /etc/sudoers
~~~

## 其他命令

### history命令

> 这个命令是一个历史记录命令

~~~bash
# 查看所有命令
$ history
# 清理所有命令
$ history -c
~~~

### 用户管理1-用户的管理

* 添加用户

~~~bash
# 添加用户,进入/home文件夹/创建用户和主目录
$ cd /home
# 查看
$ ll
# 创建组名
$ useradd -m mobaijun
# 查看
$ ll
# 创建用户名
$ useradd -mg mobaijun tom
# 查看
@mobai home]# ll
总用量 0
drwx------. 2 mobaijun mobaijun 62 5月29 11:25 mobaijun
drwx------. 2 tom      mobaijun 62 5月29 11:25 tom
# 查看/etc/passwd用户内容
$ cat /etc/passwd
# passwd文件用户内容
mobaijun:x:1000:1000::/home/mobaijun:/bin/bash
tom:x:1001:1000::/home/tom:/bin/bash
~~~

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200529113326.png)

* 给用户设置密码并切换用户

~~~bash
# 设置密码
$ passwd mobaijun
# 切换用户
$ su mobaijun
~~~

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200529115738.png)

* 删除用户

~~~bash
# 切换回主目录
$ su root
# 删除用户组
$ userdel -r tom
~~~

!(https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200529114210.png)

* 修改登录名

~~~bash
# 修改登录名称
$ usermod -1 Rose mobaijun
~~~

**总结**

* **useradd:添加用户**
* **passwd:给用户设置密码**
* **su:切换用户**
* **userdel:删除用户**
* **usermod:修改用户登录名**

### 用户管理2-组与用户的管理

* 添加组

~~~bash
# 添加组
$ groupadd [组名]
# 查看组
$ cat /etc/group
~~~

* 用户添加指定组

~~~bash
# 进入主目录
$ cd /home
# 修改用户组名称
$ usermod -g [新组名] [组名]
~~~

* 用户从指定组中删除

~~~bash
# 用户从指定组中删除
$ gpasswd -d 用户 组名
# 查看
$ ll
# 查看配置文件
$ cat /etc/group
~~~

* 修改组名

~~~bash
# 修改组名
$ groupmod -n 新组名 组名
~~~

* 删除组

~~~bash
# 删除组
$ groupdel 组名
# 查看
$ cat /etc/group
~~~

**总结**

* **groupadd:添加组**
* **gpaddwd:将用户从组中删除**
* **groupmod:修改组名**
* **groupdel:删除组**

### 用户管理3-给普通用户设置 sudo超级管理权限

~~~bash
# 编辑配置文件
$ vim /etc/sudoers
# 切换用户
$ su mobaijun
# 设置权限
$ sudo useradd -m 用户名
# 查看
$ cd /home
~~~

### 其他

[相关内容](https://my.oschina.net/u/3803405/blog/1791255)

~~~bash
# 列出所有可更新的软件包
$ yum list updates
# 列出所有已安装的软件包
$ yum list installed
# 列出所有已安装但不在 Yum Repository 内的软件包
$ yum list extras
# 搜索yum包
$ yum search PACKAGE_NAME
# 列出所有可更新的软件包信息
$ yum info updates
# 列出所有已安装的软件包信息
$ yum info installed
# .列出软件包提供哪些文件
$ yum provides
# 更新具体的yum包
$ yum update PACKAGE_NAME
# 清除yum缓存
$ yum clean all
# 卸载yum包装
$ yum remove PACKAGE_NAME
# 取出yum包装
$ yum downloader PACKAGE_NAME
# 重新安装一个yum包
$ yum reinstall PACKAGE_NAME
# 查可以更新的软件包
$ yum check-update
# 查看所有安装的软件包
$ rpm -qa
~~~

### 内网环境--禅道

官网地址:[传送门](https://www.zentao.net/)

下载地址:[传送门](https://www.zentao.net/dynamic/zentaopms.biz4.0-80250.html)

> 阿里云服务器需要设置安全组端口号为8086

~~~bash
# 下载禅道
$ wget https://www.zentao.net/dl/ZenTaoPMS.biz4.0.zbox_64.tar.gz
# 下载完成解压
$ tar -zxvf ZenTaoPMS.12.3.3.zbox_64.tar.gz -C /opt
# 避免端口冲突,先更改新的端口,更改完成后,启动即可
$ /opt/zbox/zbox -ap 8086 -mp 3308
# 开放8086端口号
$ firewall-cmd --zone=public --add-port=8086/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 查看是否成功
$ firewall-cmd --zone=public --query-port=8086/tcp
# 启动禅道
$ /opt/zbox/zbox start
# 输入IP地址和端口号打开项目
$ http://39.108.96.122/zentao/my/
~~~

![](https://s1.ax1x.com/2020/08/03/aalfUJ.png)

* 输入用户名密码

> 开源版默认为 admin 123456
>
> 登录完成后,可设置公司名称,添加用户及权限等

!(https://s1.ax1x.com/2020/08/03/aa3AOK.png)

### 内网环境--GitLab

官网地址:[传送门](https://mirrors.tuna.tsinghua.edu.cn)

下载地址:[传送门](https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/)

~~~bash
# 安装依赖软件
$ yum -y install policycoreutils openssh-server openssh-clients postfix
# 设置postfix开机自启,并启动,postfix支持gitlab发信功能
$ systemctl enable postfix && systemctl start postfix
# 下载gitlab
$ wget http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-14.4.2-ce.0.el7.x86_64.rpm
# 安装rpm包
$ rpm -i gitlab-ce-14.4.2-ce.0.el7.x86_64.rpm
# 修改gitlab配置文件
$ vim /etc/gitlab/gitlab.rb
# 指定服务器ip和自定义端口
# external_url 'http://127.0.0.1:8010'
# 开放8010端口号
$ firewall-cmd --zone=public --add-port=8010/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld
# 查看是否成功
$ firewall-cmd --zone=public --query-port=8010/tcp
# 重置并启动GitLab
$ gitlab-ctl reconfigure
# 启动
$ gitlab-ctl restart
# 开放阿里云安全组端口号8010
# 如果访问报502错误
$ chmod -R 755 /var/log/gitlab
~~~

### 服务器相关命令

> 精选博客: [<font color="red">常用Linux服务器命令</font>](https://www.jianshu.com/p/435dde84882f)

~~~bash
# 查看服务器内存(阿拉伯数字方式)
$ free -m
# 查看服务器内存(内存方式)
$ free -g
~~~

* 参数详解

![内存图](https://cdn.jsdelivr.net/gh/mobaijun/blog_css_js/image/blog_images/20200824162946.png)

|参数   |      释义      |
| :-----: | :----------------: |
|total|      内存总数      |
|used   |   已使用内存总数   |
|   mem   |   单位均为M      |
|free   |   空闲内存数   |
| shared|    当前废弃不用    |
| buffers | 缓存内存数(Buffer) |
| cached|缓存内舒数(Page)|
|Swap   |      交换分区      |

~~~bash
===================================================服务器相关命令===================================================
# 显示服务器进程
$ top
# Linux网络监控工具
$ tcpdump
# 监控存储系统的详细信息
$ iostat # iostat -m -x 1 1000
# 实时系统监控工具
$ mpstat
$ mpstat -P ALL 1 1000
# 网络监控
$ netstat
# 进程监控命令
$ pmap <args>
# 监控虚拟内存
$ vmstat
# 查找对应端口被那个进程占用
$ lsof -i : 80
# 查看系统内核信息
$ uname -a # 详细版
$ uname -r # 精简版
# 查看系统版本
$ cat /proc/version
# 查看系统CPU逻辑核数
$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
# 查看系统CPU物理核数
$ cat /proc/cpuinfo | grep physical | uniq -c
$ grep "model name" /proc/cpuinfo
# 查看系统CPU运行位数
$ getconf LONG_BIT # 当前CPU运行在64bit模式下
# 查看系统CPU是否支持64位计算[说明:结果大于0, 支持64bit计算. lm指long mode, 支持lm则是64bit]
$ cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
# 查看系统Shell脚本
$ cat /proc/cpuinfo
# 查看物理CPU的个数
$ cat /proc/cpuinfo |grep "physical id"|sort |uniq| wc -l
# 查看逻辑CPU的个数
$ cat /proc/cpuinfo |grep "processor"|wc -l
# 查看CPU是几核
$ cat /proc/cpuinfo |grep "cores"|uniq
# 查看CPU的主频
$ cat /proc/cpuinfo |grep MHz|uniq
# 查看用户所在哪些终端
$ who | awk '{print $1 "\t" $6}'
# 查看操作系统版本
$ head -n 1 /etc/issue
# 列出加载的内核模块
$ lsmod
# 查看环境变量资源
$ env
# 查看各分区使用情况
$ df -h
# 查看所有分区
$ fdisk -l
# 查看所有交换分区
$ swapon -s
# 查看防火墙设置
$ iptables -L
# 查看所有监听端口
$ netstat -lntp
# 查看所有已经建立的连接
$ netstat -antp
# 查看网络统计信息进程
$ netstat -s
# 查看所有网络接口的属性
$ ifconfig
# 查看启动时IDE设备检测状况网络
$ dmesg | grep IDE
# 查看计算机名称
$ hostname
# 查看所有进程
$ ps -ef
# 查看活动用户
$ w
# 查看指定用户信息
$ id <用户名>
# 查看用户登录日志
$ last
# 查看系统所有组
$ cut -d: -f1 /etc/group
# 查看当前用户的计划任务服务
$ crontab -l
# 列出所有系统服务
$ chkconfig --list
# 列出所有启动的系统服务程序
$ chkconfig --list | grep on
# 杀掉进程
$ kill pid
# 强制杀掉进程
$ killall -9 processname
===================================================时间相关命令===================================================
# 查看当前系统时间
$ date
# 修改当前系统时间
$ date -s "2020-07-28 15:32:00"
# 查看系统运行时间、用户数、负载
$ uptime
===================================================其他相关命令===================================================
# 列出当前目录的文件树
$ find
===================================================网络相关命令===================================================
# 查看本地网络信息(包括ip等)
$ ifconfig | ifconfig eth0
# 查看路由信息
$ netstat -r
# 关闭网卡
$ sudo ifconfig eth0 down
# 启动网卡
$ sudo ifconfig eth0 up
# 查看网卡状态
$ ethtool eth0
# 查看路由表
$ route -n
# 修改主机名称
$ hostnamectl set-hostname
~~~

### 服务器卡顿

阿里云服务器有IO积分测试,垃圾

## Linux查看公网 IP

最近在解决网络问题时,需要查看本机的出口公网IP信息,有如下两个方法:

~~~bash
# Curl 纯文本格式输出:
$ curl cip.cc
$ curl icanhazip.com
$ curl ident.me
$ curl ipecho.net/plain
$ curl whatismyip.akamai.com
$ curl ifconfig.me
$ curl www.trackip.net/i
$ curl ipinfo.io/ip
~~~

* 在`linux`系统中输入上述的命令,可以查看到本机连接的公网信息;
* 如果该命令无效,可以使用下面的脚本,也同样可以获得对应的信息

~~~bash
#!/bin/bash
PUBLIC_IP=`wget http://ipecho.net/plain -O - -q ; echo`
echo $PUBLIC_IP
~~~

## 环境变量:

~~~bash
#set java environment
JAVA_HOME=/usr/local/jdk1.8.0_311
MAVEN_HOME=/ur/local/apache-maven-3.8.4
CLASSPATH=.:$JAVA_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
export JAVA_HOME MAVEN_HOME CLASSPATH PATH
~~~

## Ubuntu系统

### 安装ip查看插件

* 初次安装需要配置IP插件

~~~bash
$ sudo apt install net-tools
~~~

### 无法连接Xshell

~~~bash
# 首先,判断Ubuntu是否安装了ssh服务:
# 输入:ps -e |grep ssh 如果服务已经启动,则可以同时看到“ssh-agent”和“sshd”,否则表示没有安装服务,或没有开机启动
$ ps -e |grep ssh
# 安装ssh服务
$ sudo apt-get install openssh-server
# 启动服务
$ /etc/init.d/ssh start
# 本机测试是否能够成功登录:ssh -l 用户名 本机ip
$ ssh -l mobai 192.168.65.129
~~~

### 安装dos2unix插件

~~~bash
# 命令
$ sudo apt install dos2unix
~~~

### 不联网安装ubuntu插件

~~~bash
# 要安装.deb套件包时
$ dpkg -i 文件名
# 要反安装.deb套件包时
$ dpkg -r 文件名
~~~

| dpkg -i package.deb      | 安装包               |
| ------------------------ | ---------------------- |
| dpkg -r package          | 删除包               |
| dpkg -P package          | 删除包(包括配置文件) |
| dpkg -L package          | 列出与该包关联的文件   |
| dpkg -l package          | 显示该包的版本         |
| dpkg –unpack package.deb | 解开 deb 包的内容      |
| dpkg -S keyword          | 搜索所属的包内容       |
| dpkg -l                  | 列出当前已安装的包   |
| dpkg -c package.deb      | 列出 deb 包的内容      |
| dpkg –configure package| 配置包               |

ziyangboy 发表于 2022-4-2 20:49

谢谢分享,整理的很全

chinasugar 发表于 2022-4-2 21:08

linux系统的学习是非常有必要的。

as4202 发表于 2022-4-2 21:15

谢谢分享,收藏

bnxf 发表于 2022-4-2 21:21

办公用的国产电脑装的就是linux核心系统

xiadongming 发表于 2022-4-2 21:23

wycdd 发表于 2022-4-2 21:40

学过一遍,不过现在都忘的差不多了

ab123 发表于 2022-4-2 23:05

有点过于流水帐了,可以当作入门用的基础总结
页: [1]
查看完整版本: Linux从基础到实用总结-原创非首发