mjj版的Linux入门教程


给 Linux 初学者的简单教程,看完后可以对 Linux 系统有基础认识,能够配置常见软件和写一些一键脚本。

本教程写于 2021 年下半年,采用 Debian GNU/Linux 11 (bullseye)。


0. 前言:为什么选择 Debian

国内首批接触 Linux 的人大多延续了 Unix-like 背景。千禧年后,真正的 Linux 使用者开始推广这个系统。红帽(Red Hat)在 1994 年发布操作系统,后改组为 RHEL。得益于优秀的商业支持,RHEL 迅速占领国内市场,成为 Linux 入门的主流选项。

CentOS 是根据 RHEL 源码重新编译的,相当于换标版本。但 CentOS 对入门用户不太友好:

  • 软件源落后主流版本好几代
  • 配置繁琐
  • SElinux 等功能对个人用户必要性不大

举个例子,很多新手修改 SSH 端口时,操作没问题但就是无法生效,最后发现是没在 SElinux 里放行。

所以本文选择 Debian GNU/Linux 11 (bullseye) 来演示。相比 Ubuntu 往系统里塞各种私货,Debian 始终保持着一个纯净 Linux 的追求。


1. 环境搭建

1.1 系统选择与安装

Debian 安装包命名规则:

  • 11 - 大版本号,代号称 bullseye(来源于《玩具总动员》角色名)
  • amd64 - 64 位系统(i386/x86 是 32 位)
  • netinst - 网络安装版(需联网),DVD 后缀是完整版
  • firmware - 含第三方非开源驱动(如 intel、Realtek 网卡驱动)

VPS 一键重装脚本(推荐使用 vicer 的脚本):

1
bash <(wget --no-check-certificate -qO- 'https://raw.githubusercontent.com/MoeClub/Note/master/InstallNET.sh') -d 11 -v 64 -p "自定义root密码" -port "自定义ssh端口"

1.2 常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 查看系统信息
cat /etc/os-release

# 新建文件
touch /home/hello.py

# 列出文件
ls -la # 显示详细信息,包括隐藏文件

# 进入目录
cd /home
cd .. # 返回上层
cd - # 返回刚才的目录

# 新建目录
mkdir /home/Python

# 移动/重命名
mv /home/hello.py /home/helloworld.py

# 复制文件
cp /home/fileA /home/fileB
cp -r /home/folderA /home/folderB # 复制文件夹

# 删除文件/文件夹
rm /home/hello.py
rm -rf /home/Python # 递归强制删除

# 查看文件夹大小
du -lh

1.3 文本编辑器:nano 和 vim

Debian 11 自带简便的 nano 编辑器,非常适合新手。

nano 使用

1
nano /etc/apt/sources.list

常用快捷键:

  • Ctrl+O - 保存
  • Ctrl+X - 退出
  • Ctrl+C - 取消

vim 使用

vim 被称作”编辑器之神”,功能强大但需要学习。

1
2
3
4
5
6
# 安装 vim
apt update
apt install vim -y

# 打开文件
vim /etc/apt/sources.list

基本操作:

  • iInsert 进入编辑模式
  • Esc 退出编辑模式
  • :wq - 保存并退出
  • :q! - 不保存强制退出

1.4 更新系统

1
2
3
4
5
6
7
8
9
10
11
12
13
# 同步更新源
apt update

# 查看可更新软件
apt list --upgradable

# 更新软件
apt upgrade -y

# 卸载软件
apt remove vim # 只卸载软件,保留配置
apt purge vim # 连同配置一起卸载
apt autoremove # 清理不需要的依赖

2. SSH 连接和基础配置

2.1 SSH 客户端推荐

客户端 特点
Xshell 家庭免费,中文,限制 4 个会话
MobaXterm 功能强大,文件传输、性能监控、远程桌面等
FinalShell 国产,全中文
electerm 开源免费,跨平台
PuTTY 老牌,简单

2.2 修改 SSH 端口

SSH 默认端口是 22,容易被扫描攻击。建议改成高端口(如 35261):

1
2
3
vim /etc/ssh/sshd_config
# 修改 Port 22 为 Port 35261
systemctl restart ssh

2.3 密钥登录

相比密码登录,密钥更安全:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 生成密钥
ssh-keygen -t rsa

# 配置公钥
touch ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

# 修改 SSH 配置
vim /etc/ssh/sshd_config
# PubkeyAuthentication yes
# PasswordAuthentication no # 测试密钥登录成功后再改
systemctl restart ssh

3. Linux 文件系统

3.1 文件系统格式

Linux 将所有硬盘”挂载”在 / 根目录下。Linux 普遍使用 EXT4 格式,与 Windows 的 NTFS 互不兼容。

3.2 目录结构

目录 说明
/bin 应用程序
/boot 启动文件
/dev 外部设备(Linux 一切皆文件)
/etc 系统配置文件
/home 用户目录
/root root 用户目录
/tmp 临时文件
/usr 共享资源(类似 Windows 程序目录)
/var 不断变化的文件(如日志)

3.3 权限说明

1
2
3
4
# 权限示例:rwxr-xr-x
# r=4, w=2, x=1
# chmod +x file # 添加执行权限
# chmod 755 folder # 所有者全权限,其他读执行

4. Shell 脚本入门

简单示例:查看 CPU 和内存使用率

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

echo "1 for CPU, 2 for RAM"
read choice

if [ $choice -eq 1 ]; then
echo "CPU usage:"
grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'
elif [ $choice -eq 2 ]; then
echo "RAM usage:"
free -m | grep Mem | awk '{print ($3/$2)*100 "%"}'
else
echo "WRONG INPUT"
fi

5. Crontab 定时任务

1
2
3
4
5
6
# 编辑定时任务
crontab -e

# 格式:分 时 日 月 周 命令
# 每 15 分钟执行
*/15 * * * * /usr/bin/python3 /usr/local/weather/weather.py

时间设置推荐使用 crontab.guru


6. 系统权限

6.1 用户管理

1
2
3
4
5
6
7
8
9
# 添加用户
adduser mjj

# 切换用户
su mjj

# 给用户 sudo 权限
apt install sudo -y
usermod -aG sudo mjj

6.2 权限命令

1
2
3
4
5
6
7
8
# 添加执行权限
chmod +x script.sh

# 递归设置权限
chmod -R 755 /folder/

# 修改文件所有者
chown -R www-data:www-data /var/www/html

注意: 永远不要使用 chmod +777!这是安全隐患!


7. Systemd 服务管理

7.1 开机自启和进程守护

1
2
3
4
5
6
7
8
9
10
11
# 开机自启
systemctl enable frps

# 立即运行
systemctl start frps

# 查看状态
systemctl status frps

# 重启
systemctl restart frps

7.2 自定义服务

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=My App
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node app.js
Restart=always

[Install]
WantedBy=multi-user.target

8. 网站环境搭建

8.1 宝塔面板

国内版:https://www.bt.cn/

1
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh

国际版(aapanel):https://www.aapanel.com/install.html

8.2 手动搭建

安装 Nginx

1
apt install nginx

安装 PHP

1
apt install php-fpm

安装数据库

1
2
apt install mariadb-server
mysql_secure_installation

配置 SSL 证书(Let’s Encrypt)

1
2
3
4
5
6
7
8
9
# 安装 certbot
apt install python3 python3-venv libaugeas0
python3 -m venv /opt/certbot/
/opt/certbot/bin/pip install --upgrade pip
/opt/certbot/bin/pip install certbot certbot-nginx
ln -s /opt/certbot/bin/certbot /usr/bin/certbot

# 申请证书
certbot --nginx

9. Docker 快速入门

9.1 安装 Docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apt update
apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker GPG 密钥
curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 Docker 源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker
apt update
apt install -y docker-ce docker-ce-cli containerd.io

# 测试
docker run hello-world

9.2 常用 Docker 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 拉取镜像
docker pull nginx

# 运行容器
docker run -d -p 80:80 --name mynginx nginx

# 查看容器
docker ps -a

# 停止/启动容器
docker stop mynginx
docker start mynginx

# 删除容器
docker rm mynginx

# 查看镜像
docker images

9.3 Docker 安装 Nextcloud(网盘)

Docker Hub 搜索 Nextcloud,获取安装命令。


10. 内网穿透:frp 示例

服务端配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载 frp
wget https://github.com/fatedier/frp/releases/download/v0.38.0/frp_0.38.0_linux_amd64.tar.gz
tar -zxvf frp_0.38.0_linux_amd64.tar.gz
cd frp_0.38.0_linux_amd64/

# 配置
mkdir /etc/frp/
mv frps.ini /etc/frp/frps.ini
mv frps /bin/
mv systemd/frps.service /etc/systemd/system/

# 启动
systemctl enable frps
systemctl start frps

客户端配置

1
2
3
4
5
6
7
8
9
10
# 客户端配置示例
[common]
server_addr = 你的服务器IP
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

配置完成后,通过 服务器IP:6000 即可访问内网设备的 SSH。