跳转至

03 - 服务器与SSH

服务器与SSH

本章核心: 掌握SSH远程连接技术,能够安全地管理远程服务器


📖 章节导航

前序章节: 01-网络基础.md02-域名与DNS.md 后续章节: 04-代理与VPN.md 快速参考: 网络工具箱.md 第1章 故障排查: 故障排查手册.md 第3章


📚 目录


1. 引言

🤔 什么是服务器?

想象一下,你的电脑就像一个私人工作室,你在里面工作、存储文件、运行程序。而服务器就像一个公共图书馆数据中心,它专门用来存储大量数据、运行服务程序,供很多人同时访问和使用。

简单来说: - 服务器 = 一台强大的电脑,专门用来提供服务 - 远程连接 = 从你的电脑控制那台远方的服务器

🌍 为什么需要远程连接服务器?

在现代开发和运维工作中,远程连接服务器是必备技能:

  1. 部署应用:将你开发的应用程序部署到服务器上,让全世界的用户都能访问
  2. 数据存储:服务器通常有更强大的存储能力和更好的备份机制
  3. 计算资源:服务器拥有更强的CPU和GPU,适合运行大型程序或机器学习模型
  4. 持续运行:服务器可以7×24小时不间断运行,不像个人电脑需要关机
  5. 团队协作:多个开发者可以通过SSH连接到同一台服务器协同工作

💡 现实场景举例

Text Only
场景1:你开发了一个网站
├── 在本地电脑开发完成
├── 通过SSH连接到云服务器
├── 将代码上传到服务器
└── 网站就可以被全世界访问了!

场景2:训练机器学习模型
├── 本地电脑配置不够
├── 租用一台带GPU的云服务器
├── 通过SSH连接服务器
└── 在服务器上训练模型,速度提升100倍!

2. 服务器基础

🖥️ 服务器的定义和类型

什么是服务器?

服务器是一种高性能的计算机,专门用来存储数据、运行应用程序、提供网络服务。它通常具有以下特点: - 高性能:强大的CPU、大容量内存、高速存储 - 高可靠性:24小时不间断运行,有冗余备份 - 网络连接:高速稳定的网络连接 - 远程管理:支持远程操作和管理

服务器的类型

Text Only
┌─────────────────────────────────────────────────────┐
│                    服务器类型                         │
├─────────────────────────────────────────────────────┤
│                                                     │
│  1. 物理服务器                                      │
│     ┌─────────────────┐                             │
│     │  真实的硬件设备  │                             │
│     │  - 独立的服务器  │                             │
│     │  - 性能强大     │                             │
│     │  - 成本较高     │                             │
│     └─────────────────┘                             │
│                                                     │
│  2. 云服务器 (Cloud Server)                         │
│     ┌─────────────────┐                             │
│     │  虚拟化的服务器  │                             │
│     │  - 按需付费     │                             │
│     │  - 弹性扩展     │                             │
│     │  - 管理方便     │                             │
│     └─────────────────┘                             │
│                                                     │
│  3. 虚拟服务器 (VPS)                                │
│     ┌─────────────────┐                             │
│     │  物理服务器上    │                             │
│     │  的虚拟机       │                             │
│     │  - 成本较低     │                             │
│     │  - 独立环境     │                             │
│     │  - 适合个人     │                             │
│     └─────────────────┘                             │
│                                                     │
└─────────────────────────────────────────────────────┘

🔍 服务器与普通电脑的区别

特性 普通电脑 服务器
用途 个人使用、娱乐、办公 提供服务、存储数据
性能 满足日常需求 高性能、高并发
稳定性 偶尔关机、重启 7×24小时运行
网络 家庭/办公网络 高速企业级网络
管理 图形界面为主 命令行界面为主
位置 就在你身边 在数据中心或云端
访问方式 直接操作 远程连接(SSH等)

🐧 常见的服务器操作系统

Linux系统(推荐新手使用)

Linux是服务器领域的主流操作系统,具有以下优势: - 免费开源:大多数Linux发行版免费 - 稳定可靠:可以长时间运行不崩溃 - 安全性高:权限管理严格,病毒较少 - 资源占用少:适合资源有限的服务器 - 社区支持:遇到问题容易找到解决方案

常见Linux发行版:

Text Only
Ubuntu Server
├── 优点:易用、文档丰富、社区活跃
├── 缺点:更新频繁,可能不够稳定
└── 适用:新手入门、快速部署

CentOS / Rocky Linux
├── 优点:稳定、企业级、长期支持
├── 缺点:软件版本较旧
└── 适用:生产环境、企业应用

Debian
├── 优点:极其稳定、安全
├── 缺点:软件版本保守
└── 适用:追求稳定性的场景

Alpine Linux
├── 优点:体积小、启动快
├── 缺点:包管理器特殊
└── 适用:Docker容器、嵌入式

Windows Server

Windows Server是微软推出的服务器操作系统:

Text Only
Windows Server
├── 优点:图形界面、与Windows生态兼容
├── 缺点:收费、资源占用大、学习成本高
└── 适用:Windows应用、企业环境

新手建议:如果你是初学者,强烈推荐使用 Ubuntu ServerCentOS,因为它们有丰富的中文文档和社区支持。

☁️ 云服务商介绍

国内主流云服务商对比:

阿里云(Alibaba Cloud)

Text Only
🏢 阿里云
├── 优势:国内市场份额第一、文档完善、服务稳定
├── 产品:ECS云服务器、OSS对象存储、RDS数据库
├── 价格:中等,经常有优惠活动
├── 适用:国内业务、企业应用
└── 官网:https://www.aliyun.com

阿里云ECS实例类型: - 共享型:适合个人学习、测试环境 - 通用型:适合中小型网站、企业应用 - 计算型:适合计算密集型应用 - 内存型:适合数据库、缓存等内存密集型应用 - GPU型:适合AI训练、图形渲染

腾讯云(Tencent Cloud)

Text Only
🎮 腾讯云
├── 优势:与微信生态集成、价格有竞争力
├── 产品:CVM云服务器、COS对象存储、MySQL数据库
├── 价格:中等偏下,学生优惠多
├── 适用:游戏、社交应用、小程序后端
└── 官网:https://cloud.tencent.com

华为云(Huawei Cloud)

Text Only
🔷 华为云
├── 优势:企业级服务、安全性高
├── 产品:ECS云服务器、OBS对象存储
├── 价格:中等,企业客户有优惠
├── 适用:企业应用、政府项目
└── 官网:https://www.huaweicloud.com

国外云服务商

Text Only
☁️ AWS (Amazon Web Services)
├── 优势:全球领先、功能最全、生态完善
├── 缺点:国内访问速度慢、文档主要是英文
└── 官网:https://aws.amazon.com

☁️ Google Cloud Platform (GCP)
├── 优势:AI/ML能力强、Kubernetes领先
├── 缺点:国内访问困难
└── 官网:https://cloud.google.com

☁️ Microsoft Azure
├── 优势:与Windows生态集成好
├── 缺点:国内访问速度一般
└── 官网:https://azure.microsoft.com

新手建议: - 如果你的主要用户在国内,推荐使用阿里云腾讯云 - 如果是学习测试,可以购买最便宜的实例(通常几十元/月) - 学生可以申请学生优惠,通常有免费或低价套餐


3. SSH协议

🔐 SSH的定义和作用

SSH(Secure Shell)是一种网络协议,用于在不安全的网络上安全地进行远程登录和命令执行。

Text Only
┌────────────────────────────────────────────────────┐
│                   SSH 是什么?                       │
├────────────────────────────────────────────────────┤
│                                                    │
│  SSH = Secure Shell(安全外壳)                     │
│                                                    │
│  作用:                                            │
│  ✅ 安全地远程登录服务器                            │
│  ✅ 在远程服务器上执行命令                          │
│  ✅ 安全地传输文件                                  │
│  ✅ 端口转发(建立加密隧道)                        │
│                                                    │
└────────────────────────────────────────────────────┘

🆚 为什么使用SSH而不是Telnet?

在SSH出现之前,人们使用Telnet进行远程连接。但Telnet有一个致命问题:不安全

Text Only
对比:Telnet vs SSH

┌─────────────────┐         ┌─────────────────┐
│     Telnet      │         │      SSH        │
├─────────────────┤         ├─────────────────┤
│ ❌ 明文传输      │         │ ✅ 加密传输      │
│ ❌ 容易被窃听    │         │ ✅ 防止窃听      │
│ ❌ 容易被篡改    │         │ ✅ 防止篡改      │
│ ❌ 不安全        │         │ ✅ 安全可靠      │
│                 │         │                 │
│ 就像寄明信片     │         │ 就像寄加密信件   │
└─────────────────┘         └─────────────────┘

实际场景说明:

Text Only
❌ 使用Telnet:
你的电脑 ───────> 互联网 ───────> 服务器
   │                              │
   └── 发送密码:123456            └── 接收密码:123456
       (明文,任何人都能看到)        (明文,不安全)

✅ 使用SSH:
你的电脑 ───────> 互联网 ───────> 服务器
   │                              │
   └── 发送:加密后的乱码            └── 解密:123456
       (密文,只有服务器能解密)      (安全)

🔧 SSH的工作原理

SSH通过以下机制保证安全:

Text Only
SSH工作流程:

1. 连接建立
   ┌──────────┐                    ┌──────────┐
   │  客户端  │                    │  服务器  │
   └────┬─────┘                    └────┬─────┘
        │                               │
        │  ① 发送连接请求                │
        │ ─────────────────────────────>│
        │                               │
        │  ② 返回服务器公钥              │
        │ <─────────────────────────────│
        │                               │

2. 密钥交换
   ┌──────────┐                    ┌──────────┐
   │  客户端  │                    │  服务器  │
   └────┬─────┘                    └────┬─────┘
        │                               │
        │  ③ 生成会话密钥                │
        │                               │
        │  ④ 用服务器公钥加密会话密钥    │
        │ ─────────────────────────────>│
        │                               │
        │  ⑤ 服务器用私钥解密            │
        │                               │
        │  ⑥ 双方使用会话密钥加密通信    │
        │ <═══════════════════════════>│
        │     (加密通道建立)           │

3. 身份认证
   ┌──────────┐                    ┌──────────┐
   │  客户端  │                    │  服务器  │
   └────┬─────┘                    └────┬─────┘
        │                               │
        │  ⑦ 发送用户名和认证信息        │
        │ ─────────────────────────────>│
        │                               │
        │  ⑧ 确认身份                    │
        │ <─────────────────────────────│
        │                               │
        │  ⑨ 登录成功!                  │
        │                               │

SSH的三大安全机制

  1. 加密(Encryption)
  2. 所有数据都经过加密传输
  3. 即使被截获,也无法解读内容

  4. 认证(Authentication)

  5. 确认连接者的身份
  6. 支持密码认证和密钥认证

  7. 完整性(Integrity)

  8. 确保数据在传输过程中未被篡改
  9. 使用消息认证码(MAC)验证

SSH认证方式

Text Only
┌─────────────────────────────────────────────────────┐
│                  SSH认证方式                          │
├─────────────────────────────────────────────────────┤
│                                                     │
│  方式1:密码认证                                     │
│  ┌─────────────────────────────────────────────┐   │
│  │  流程:                                     │   │
│  │  1. 服务器发送加密挑战                      │   │
│  │  2. 客户端用密码加密响应                     │   │
│  │  3. 服务器验证密码                          │   │
│  │                                             │   │
│  │  优点:简单、方便                            │   │
│  │  缺点:可能被暴力破解                        │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
│  方式2:密钥认证(推荐)                             │
│  ┌─────────────────────────────────────────────┐   │
│  │  流程:                                     │   │
│  │  1. 生成密钥对(公钥+私钥)                  │   │
│  │  2. 将公钥放到服务器上                        │   │
│  │  3. 客户端用私钥签名                         │   │
│  │  4. 服务器用公钥验证签名                     │   │
│  │                                             │   │
│  │  优点:更安全、无需输入密码                  │   │
│  │  缺点:需要配置密钥                          │   │
│  └─────────────────────────────────────────────┘   │
│                                                     │
└─────────────────────────────────────────────────────┘

4. SSH连接实战

🚀 基本连接命令

最简单的SSH连接

Bash
# 基本语法
ssh 用户名@服务器地址

# 示例:连接到阿里云服务器
ssh root@47.95.123.45

# 示例:连接到腾讯云服务器
ssh ubuntu@119.29.123.45

# 示例:连接到本地虚拟机
ssh user@192.168.1.100

首次连接时的提示:

Bash
$ ssh root@47.95.123.45
The authenticity of host '47.95.123.45 (47.95.123.45)' can't be established.
ECDSA key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '47.95.123.45' (ECDSA) to the list of known hosts.
root@47.95.123.45's password: [输入密码]

解释: - 第一次连接时,SSH会询问你是否信任这台服务器 - 输入 yes 确认 - 然后输入密码(输入时不会显示字符) - 连接成功后,你的命令行提示符会变成服务器的提示符

连接成功后的提示符变化

Bash
# 连接前(本地电脑)
$ whoami
yourname

# 连接后(服务器)
[root@iZ2ze3abc123 ~]# whoami
root

🔌 指定端口连接

SSH默认使用22端口,但为了安全,很多服务器会修改默认端口。

Bash
# 基本语法
ssh -p 端口号 用户名@服务器地址

# 示例:连接到使用2222端口的服务器
ssh -p 2222 root@47.95.123.45

# 示例:连接到使用自定义端口的服务器
ssh -p 10086 ubuntu@119.29.123.45

如何知道服务器的SSH端口? - 云服务商通常在控制台显示 - 或者在购买服务器时设置的端口 - 默认通常是22端口

🔑 使用密钥认证

密钥认证比密码认证更安全,而且登录时不需要输入密码。

生成SSH密钥对

Bash
# 生成RSA密钥对(推荐)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 生成ED25519密钥对(更现代、更安全)
ssh-keygen -t ed25519 -C "your_email@example.com"

参数说明: - -t:指定密钥类型(rsa、ed25519等) - -b:指定密钥长度(RSA推荐4096位) - -C:添加注释(通常是邮箱)

执行过程:

Bash
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yourname/.ssh/id_rsa): [按Enter使用默认路径]
Enter passphrase (empty for no passphrase): [可以输入密码短语,也可以直接按Enter]
Enter same passphrase again: [再次输入密码短语]
Your identification has been saved in /home/yourname/.ssh/id_rsa.
Your public key has been saved in /home/yourname/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:abc123... your_email@example.com

生成的文件: - ~/.ssh/id_rsa:私钥(千万不要泄露!) - ~/.ssh/id_rsa.pub:公钥(可以分享给服务器)

将公钥上传到服务器

方法1:使用ssh-copy-id命令(推荐,最简单)

Bash
# 基本用法
ssh-copy-id 用户名@服务器地址

# 示例
ssh-copy-id root@47.95.123.45

# 指定端口
ssh-copy-id -p 2222 root@47.95.123.45

方法2:手动复制公钥

Bash
# 1. 查看公钥内容
cat ~/.ssh/id_rsa.pub

# 2. 登录到服务器
ssh root@47.95.123.45

# 3. 在服务器上创建.ssh目录(如果不存在)
mkdir -p ~/.ssh

# 4. 将公钥添加到authorized_keys文件
echo "你的公钥内容" >> ~/.ssh/authorized_keys

# 5. 设置正确的权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

方法3:使用scp命令

Bash
# 将公钥复制到服务器
scp ~/.ssh/id_rsa.pub root@47.95.123.45:~/

# 登录服务器
ssh root@47.95.123.45

# 添加公钥
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

# 删除临时文件
rm ~/id_rsa.pub

# 设置权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

使用密钥登录

配置好密钥后,就可以直接登录,无需输入密码:

Bash
# 直接登录(无需密码)
ssh root@47.95.123.45

# 如果密钥文件不是默认位置
ssh -i /path/to/private_key root@47.95.123.45

⚙️ 配置SSH config文件

如果你有多台服务器需要管理,每次都输入完整的命令会很麻烦。SSH config文件可以简化这个过程。

创建config文件

Bash
# 创建或编辑config文件
vim ~/.ssh/config

config文件示例

Bash
# ~/.ssh/config

# 阿里云服务器
Host aliyun
    HostName 47.95.123.45
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa_aliyun

# 腾讯云服务器
Host tencent
    HostName 119.29.123.45
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_rsa_tencent

# 本地虚拟机
Host vm
    HostName 192.168.1.100
    User vagrant
    Port 22

# GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github

参数说明: - Host:别名(你喜欢的名称) - HostName:服务器地址(IP或域名) - User:用户名 - Port:端口号(可选,默认22) - IdentityFile:私钥文件路径(可选)

使用config文件简化连接

配置好config文件后,连接变得非常简单:

Bash
# 之前
ssh -i ~/.ssh/id_rsa_aliyun -p 22 root@47.95.123.45

# 现在
ssh aliyun

# 之前
ssh -i ~/.ssh/id_rsa_tencent -p 2222 ubuntu@119.29.123.45

# 现在
ssh tencent

🔄 SSH端口转发

SSH端口转发(也叫SSH隧道)是一个非常强大的功能,可以通过SSH连接建立加密通道,转发网络流量。

本地端口转发(Local Port Forwarding)

将本地端口的流量通过SSH转发到远程服务器的端口。

Text Only
应用场景:
- 访问远程服务器的数据库
- 访问远程服务器的Web服务
- 突破防火墙限制

基本语法:

Bash
ssh -L 本地端口:目标地址:目标端口 用户名@服务器地址

示例1:访问远程服务器的MySQL数据库

Bash
# 将本地3306端口的流量转发到远程服务器的3306端口
ssh -L 3306:localhost:3306 root@47.95.123.45

# 现在可以在本地连接远程服务器的MySQL
mysql -h 127.0.0.1 -P 3306 -u root -p

示例2:访问远程服务器的Web服务

Bash
# 将本地8080端口的流量转发到远程服务器的80端口
ssh -L 8080:localhost:80 root@47.95.123.45

# 现在可以在浏览器访问
http://localhost:8080

示例3:转发到远程服务器能访问的其他服务器

Bash
# 将本地3306端口转发到远程服务器能访问的192.168.1.200:3306
ssh -L 3306:192.168.1.200:3306 root@47.95.123.45

远程端口转发(Remote Port Forwarding)

将远程服务器端口的流量通过SSH转发到本地电脑的端口。

Text Only
应用场景:
- 让远程服务器访问本地电脑的服务
- 内网穿透

基本语法:

Bash
ssh -R 远程端口:目标地址:目标端口 用户名@服务器地址

示例:让远程服务器访问本地电脑的Web服务

Bash
# 将远程服务器的8080端口转发到本地电脑的3000端口
ssh -R 8080:localhost:3000 root@47.95.123.45

# 现在在远程服务器上访问localhost:8080,就会访问到你本地电脑的3000端口

动态端口转发(Dynamic Port Forwarding)

创建SOCKS代理,可以转发多种协议的流量。

Text Only
应用场景:
- 科学上网
- 浏览器代理

基本语法:

Bash
ssh -D 本地端口 用户名@服务器地址

示例:创建SOCKS代理

Bash
# 在本地1080端口创建SOCKS代理
ssh -D 1080 root@47.95.123.45

# 然后在浏览器中配置SOCKS代理
# 代理地址:127.0.0.1
# 代理端口:1080

📝 SSH连接实用技巧

保持连接活跃

有时候SSH连接会因为长时间没有操作而断开,可以通过配置保持连接活跃。

方法1:客户端配置

Bash
# 编辑客户端配置
vim ~/.ssh/config

# 添加以下内容
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

方法2:命令行参数

Bash
# 每60秒发送一次心跳
ssh -o ServerAliveInterval=60 root@47.95.123.45

调试连接问题

如果连接失败,可以使用 -v 参数查看详细信息:

Bash
# 显示详细连接信息
ssh -v root@47.95.123.45

# 显示更详细的信息
ssh -vv root@47.95.123.45

# 显示最详细的信息
ssh -vvv root@47.95.123.45

执行单条命令后退出

Bash
# 在远程服务器执行命令,然后立即退出
ssh root@47.95.123.45 "ls -la"

# 执行多条命令
ssh root@47.95.123.45 "cd /var/www && ls -la"

# 执行需要sudo的命令
ssh root@47.95.123.45 "sudo apt update"

5. 服务器常用操作

📁 文件传输

连接到服务器后,经常需要在本地和服务器之间传输文件。SSH提供了多种文件传输方式。

scp命令(Secure Copy)

scp是SSH提供的文件传输命令,简单易用。

基本语法:

Bash
# 从本地复制到远程
scp 本地文件 用户名@服务器地址:远程路径

# 从远程复制到本地
scp 用户名@服务器地址:远程路径 本地路径

# 复制目录(使用-r参数)
scp -r 本地目录 用户名@服务器地址:远程路径

示例:

Bash
# 上传单个文件
scp index.html root@47.95.123.45:/var/www/html/

# 上传目录
scp -r myproject/ root@47.95.123.45:/var/www/

# 下载单个文件
scp root@47.95.123.45:/var/log/syslog ./syslog

# 下载目录
scp -r root@47.95.123.45:/var/www/backup ./backup

# 指定端口
scp -P 2222 file.txt root@47.95.123.45:/root/

# 使用密钥
scp -i ~/.ssh/id_rsa file.txt root@47.95.123.45:/root/

scp高级用法:

Bash
# 保留文件属性(时间戳、权限等)
scp -p file.txt root@47.95.123.45:/root/

# 显示传输进度
scp -v file.txt root@47.95.123.45:/root/

# 限制传输速度(单位:KB/s)
scp -l 1000 largefile.zip root@47.95.123.45:/root/

sftp命令(Secure FTP)

sftp提供了一个交互式的文件传输界面,类似FTP,但使用SSH加密。

启动sftp:

Bash
# 基本连接
sftp root@47.95.123.45

# 指定端口
sftp -P 2222 root@47.95.123.45

sftp常用命令:

Bash
# 连接到服务器
sftp root@47.95.123.45

# 查看远程文件
sftp> ls
sftp> ls -la

# 查看本地文件
sftp> lls
sftp> lls -la

# 切换远程目录
sftp> cd /var/www
sftp> pwd

# 切换本地目录
sftp> lcd /home/user/projects
sftp> lpwd

# 上传文件
sftp> put file.txt
sftp> put -r directory/

# 下载文件
sftp> get file.txt
sftp> get -r directory/

# 创建目录
sftp> mkdir newdir
sftp> lmkdir newdir

# 删除文件
sftp> rm file.txt
sftp> rmdir directory/

# 重命名文件
sftp> mv oldname.txt newname.txt

# 查看文件内容
sftp> cat file.txt

# 退出sftp
sftp> exit
sftp> bye
sftp> quit

rsync命令(同步工具)

rsync是一个强大的文件同步工具,支持增量传输,适合大文件和大量文件的传输。

基本语法:

Bash
# 本地到远程
rsync [选项] 源路径 用户名@服务器地址:目标路径

# 远程到本地
rsync [选项] 用户名@服务器地址:源路径 目标路径

常用选项: - -a:归档模式,保留文件属性 - -v:显示详细信息 - -z:压缩传输 - -r:递归复制目录 - --progress:显示进度 - --delete:删除目标中源没有的文件

示例:

Bash
# 同步目录到远程服务器
rsync -avz ./myproject/ root@47.95.123.45:/var/www/myproject/

# 显示进度
rsync -avz --progress ./largefile.zip root@47.95.123.45:/root/

# 删除目标中源没有的文件
rsync -avz --delete ./myproject/ root@47.95.123.45:/var/www/myproject/

# 从远程服务器同步到本地
rsync -avz root@47.95.123.45:/var/www/backup/ ./backup/

# 指定端口
rsync -avz -e "ssh -p 2222" ./file.txt root@47.95.123.45:/root/

# 排除某些文件
rsync -avz --exclude='*.log' --exclude='node_modules/' ./myproject/ root@47.95.123.45:/var/www/myproject/

rsync vs scp vs sftp:

特性 scp sftp rsync
易用性 ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
交互性
增量传输
断点续传
同步功能
适用场景 简单文件传输 交互式操作 大量文件同步

💻 远程命令执行

除了交互式登录,SSH还可以直接在远程服务器执行命令。

执行单条命令

Bash
# 基本用法
ssh 用户名@服务器地址 "命令"

# 示例:查看系统信息
ssh root@47.95.123.45 "uname -a"

# 查看磁盘使用情况
ssh root@47.95.123.45 "df -h"

# 查看内存使用情况
ssh root@47.95.123.45 "free -h"

# 查看运行中的进程
ssh root@47.95.123.45 "ps aux"

执行多条命令

Bash
# 使用分号分隔
ssh root@47.95.123.45 "cd /var/www; ls -la; pwd"

# 使用&&(前一条命令成功才执行下一条)
ssh root@47.95.123.45 "cd /var/www && ls -la"

# 使用||(前一条命令失败才执行下一条)
ssh root@47.95.123.45 "cd /var/www || echo '目录不存在'"

# 使用引号包含复杂命令
ssh root@47.95.123.45 "tail -n 100 /var/log/syslog | grep error"  # grep文本搜索:按模式匹配行

执行需要sudo的命令

Bash
# 执行sudo命令
ssh root@47.95.123.45 "sudo apt update"

# 如果不是root用户,可能需要使用-t参数
ssh -t user@47.95.123.45 "sudo apt update"

执行本地脚本

Bash
# 执行远程服务器上的脚本
ssh root@47.95.123.45 "bash /root/script.sh"

# 将本地脚本传输到远程并执行
ssh root@47.95.123.45 "bash -s" < local_script.sh

# 使用管道执行本地脚本
cat local_script.sh | ssh root@47.95.123.45 bash

实用示例

Bash
# 查看服务器负载
ssh root@47.95.123.45 "uptime"

# 查看最近登录的用户
ssh root@47.95.123.45 "last -n 10"

# 查看网络连接
ssh root@47.95.123.45 "netstat -tuln"

# 查看防火墙状态
ssh root@47.95.123.45 "sudo ufw status"

# 重启服务
ssh root@47.95.123.45 "sudo systemctl restart nginx"

# 查看服务状态
ssh root@47.95.123.45 "sudo systemctl status nginx"

# 查看日志
ssh root@47.95.123.45 "tail -f /var/log/nginx/access.log"

🎬 会话保持

有时候SSH连接会因为网络不稳定而断开,或者你需要长时间运行任务。使用tmux或screen可以保持会话,即使断开连接,任务也会继续运行。

tmux(推荐)

tmux是一个终端复用器,功能强大且易用。

安装tmux:

Bash
# Ubuntu/Debian
sudo apt install tmux

# CentOS/RHEL
sudo yum install tmux

# macOS
brew install tmux

tmux基本使用:

Bash
# 创建新会话
tmux

# 创建命名会话
tmux new -s mysession

# 列出所有会话
tmux ls

# 连接到会话
tmux attach -t mysession

# 断开会话(保持会话运行)
# 在tmux中按:Ctrl+B 然后按 D

# 杀死会话
tmux kill-session -t mysession

tmux常用快捷键:

Text Only
前缀键:Ctrl+B

窗口操作:
Ctrl+B c      创建新窗口
Ctrl+B n      切换到下一个窗口
Ctrl+B p      切换到上一个窗口
Ctrl+B 0-9    切换到指定编号的窗口
Ctrl+B ,      重命名当前窗口
Ctrl+B &      关闭当前窗口

面板操作:
Ctrl+B "      水平分割面板
Ctrl+B %      垂直分割面板
Ctrl+B 方向键 切换面板
Ctrl+B x      关闭当前面板
Ctrl+B z      最大化/恢复当前面板

其他操作:
Ctrl+B d      断开会话
Ctrl+B [      进入复制模式
Ctrl+B ]      粘贴
Ctrl+B ?      显示所有快捷键

tmux实用示例:

Bash
# 场景1:运行长时间任务
tmux new -s longtask
# 在tmux中运行
python train_model.py
# 断开会话(任务继续运行)
Ctrl+B D

# 场景2:多任务并行
tmux new -s multitask
# 分割面板
Ctrl+B "
# 在上面运行
python server.py
# 切换到下面
Ctrl+B 方向键
# 在下面运行
tail -f /var/log/syslog

# 场景3:远程协作
# 两个人可以连接到同一个tmux会话
tmux new -s collaboration
# 另一个人连接
tmux attach -t collaboration

screen

screen是另一个终端复用器,比tmux更老,但仍然广泛使用。

安装screen:

Bash
# Ubuntu/Debian
sudo apt install screen

# CentOS/RHEL
sudo yum install screen

screen基本使用:

Bash
# 创建新会话
screen

# 创建命名会话
screen -S mysession

# 列出所有会话
screen -ls

# 连接到会话
screen -r mysession

# 断开会话(保持会话运行)
# 在screen中按:Ctrl+A 然后按 D

# 杀死会话
screen -X -S mysession quit

screen常用快捷键:

Text Only
前缀键:Ctrl+A

Ctrl+A c      创建新窗口
Ctrl+A n      切换到下一个窗口
Ctrl+A p      切换到上一个窗口
Ctrl+A 0-9    切换到指定编号的窗口
Ctrl+A A      重命名当前窗口
Ctrl+A k      关闭当前窗口
Ctrl+A d      断开会话
Ctrl+A [      进入复制模式
Ctrl+A ]      粘贴
Ctrl+A ?      显示所有快捷键

screen实用示例:

Bash
# 运行长时间任务
screen -S training
python train_model.py
# 断开会话
Ctrl+A D

# 查看会话
screen -ls

# 重新连接
screen -r training

# 如果连接失败,尝试强制连接
screen -x training

tmux vs screen

特性 tmux screen
易用性 ⭐⭐⭐⭐ ⭐⭐⭐
功能 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐
配置 ⭐⭐⭐⭐⭐ ⭐⭐⭐
活跃度 ⭐⭐⭐⭐⭐ ⭐⭐⭐
推荐度 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐

建议: 新手推荐使用tmux,功能更强大,配置更灵活。


6. 服务器安全

🔒 禁用密码登录,只使用密钥

密码登录容易被暴力破解,使用密钥认证更安全。

步骤1:配置密钥认证

按照前面"使用密钥认证"章节的步骤,完成密钥配置。

步骤2:测试密钥登录

Bash
# 确保可以使用密钥登录
ssh -i ~/.ssh/id_rsa root@47.95.123.45

步骤3:修改SSH配置

Bash
# 1. 登录到服务器
ssh root@47.95.123.45

# 2. 备份配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 3. 编辑配置文件
sudo vim /etc/ssh/sshd_config

修改以下配置:

⚠️ 警告:在禁用密码登录之前,请务必确认已完成以下前置步骤: 1. 已生成 SSH 密钥对(ssh-keygen) 2. 已将公钥复制到服务器(ssh-copy-id user@server) 3. 已在另一个终端测试密钥登录成功

否则禁用密码登录后将无法连接服务器!

Bash
# 禁用密码登录(请先确保密钥认证可用,否则会被锁定!)
PasswordAuthentication no

# 禁用空密码登录
PermitEmptyPasswords no

# 确保公钥认证启用
PubkeyAuthentication yes

# 可选:限制root用户登录
# PermitRootLogin prohibit-password
# 或者完全禁止root登录
# PermitRootLogin no

步骤4:重启SSH服务

Bash
# 重启SSH服务
sudo systemctl restart sshd

# 或者
sudo service sshd restart

步骤5:测试连接

Bash
# 确保可以使用密钥登录
ssh root@47.95.123.45

# 尝试用密码登录(应该失败)
ssh -o PreferredAuthentications=password root@47.95.123.45

⚠️ 重要提示: - 在禁用密码登录之前,一定要确保密钥认证可以正常工作 - 否则你可能无法登录服务器! - 建议保留一个SSH会话,在新会话中测试成功后再关闭旧会话

🔢 修改默认SSH端口

SSH默认使用22端口,这是攻击者最常扫描的端口。修改端口可以减少大部分自动化攻击。

步骤1:选择新端口

选择一个1024-65535之间的端口号,避免使用常用端口。

Bash
# 示例:使用2222端口
# 示例:使用10086端口

步骤2:修改SSH配置

Bash
# 1. 登录到服务器
ssh root@47.95.123.45

# 2. 编辑配置文件
sudo vim /etc/ssh/sshd_config

修改以下配置:

Bash
# 找到Port 22,修改为
Port 2222

# 或者添加新端口(同时保留22端口,测试成功后再删除22)
Port 22
Port 2222

步骤3:配置防火墙

Bash
# 如果使用ufw
sudo ufw allow 2222/tcp

# 如果使用firewalld
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload

# 如果使用iptables
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
sudo service iptables save

步骤4:重启SSH服务

Bash
# 重启SSH服务
sudo systemctl restart sshd

步骤5:测试新端口

Bash
# 使用新端口连接
ssh -p 2222 root@47.95.123.45

# 如果成功,可以删除22端口
# 编辑配置文件,删除Port 22
sudo vim /etc/ssh/sshd_config
# 保留 Port 2222,删除 Port 22

# 重启SSH服务
sudo systemctl restart sshd

步骤6:更新SSH config文件

Bash
# 更新本地config文件
vim ~/.ssh/config

# 修改端口
Host aliyun
    HostName 47.95.123.45
    User root
    Port 2222

🛡️ 配置防火墙

防火墙可以限制对服务器的访问,只允许必要的端口开放。

ufw(Uncomplicated Firewall)

ufw是Ubuntu默认的防火墙工具,简单易用。

安装ufw:

Bash
# Ubuntu/Debian
sudo apt install ufw

# CentOS/RHEL
sudo yum install ufw

基本使用:

Bash
# 查看防火墙状态
sudo ufw status

# 启用防火墙
sudo ufw enable

# 禁用防火墙
sudo ufw disable

# 允许SSH连接(重要!)
sudo ufw allow ssh
# 或者
sudo ufw allow 22/tcp

# 允许HTTP
sudo ufw allow 80/tcp

# 允许HTTPS
sudo ufw allow 443/tcp

# 允许自定义端口
sudo ufw allow 2222/tcp

# 删除规则
sudo ufw delete allow 80/tcp

# 查看详细状态
sudo ufw status verbose

常用配置示例:

Bash
# 基本Web服务器配置
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS
sudo ufw enable

# 自定义SSH端口
sudo ufw allow 2222/tcp
sudo ufw enable

# 只允许特定IP访问SSH
sudo ufw allow from 123.45.67.89 to any port 22
sudo ufw enable

# 拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable

iptables

iptables是Linux内核的防火墙工具,功能强大但配置复杂。

基本使用:

Bash
# 查看当前规则
sudo iptables -L -n -v

# 清空所有规则
sudo iptables -F

# 允许已建立的连接
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环
sudo iptables -A INPUT -i lo -j ACCEPT

# 允许SSH
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 拒绝其他所有入站
sudo iptables -A INPUT -j DROP

# 保存规则
sudo service iptables save
# 或者
sudo iptables-save > /etc/iptables/rules.v4

firewalld

firewalld是CentOS/RHEL 7+的默认防火墙工具。

基本使用:

Bash
# 查看状态
sudo firewall-cmd --state

# 查看当前规则
sudo firewall-cmd --list-all

# 允许SSH
sudo firewall-cmd --permanent --add-service=ssh

# 允许HTTP
sudo firewall-cmd --permanent --add-service=http

# 允许HTTPS
sudo firewall-cmd --permanent --add-service=https

# 允许自定义端口
sudo firewall-cmd --permanent --add-port=2222/tcp

# 重新加载配置
sudo firewall-cmd --reload

# 查看所有可用服务
sudo firewall-cmd --get-services

🚫 fail2ban防止暴力破解

fail2ban可以监控日志文件,自动封禁尝试暴力破解的IP地址。

安装fail2ban:

Bash
# Ubuntu/Debian
sudo apt install fail2ban

# CentOS/RHEL
sudo yum install fail2ban

基本配置:

Bash
# 1. 复制默认配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 2. 编辑配置文件
sudo vim /etc/fail2ban/jail.local

配置示例:

Bash
[DEFAULT]
# 封禁时间(秒)
bantime = 3600

# 查找时间窗口(秒)
findtime = 600

# 最大尝试次数
maxretry = 5

[sshd]
enabled = true
port = ssh
# 或者自定义端口
# port = 2222
filter = sshd
logpath = /var/log/auth.log
# CentOS使用
# logpath = /var/log/secure
maxretry = 5

启动fail2ban:

Bash
# 启动服务
sudo systemctl start fail2ban

# 设置开机自启
sudo systemctl enable fail2ban

# 查看状态
sudo fail2ban-client status

# 查看SSH jail状态
sudo fail2ban-client status sshd

# 查看被封禁的IP
sudo fail2ban-client status sshd

# 解封IP
sudo fail2ban-client set sshd unbanip 123.45.67.89

查看fail2ban日志:

Bash
# 查看fail2ban日志
sudo tail -f /var/log/fail2ban.log

# 查看SSH认证日志
sudo tail -f /var/log/auth.log

🔐 其他安全建议

1. 禁用root登录

Bash
# 创建普通用户
adduser newuser
usermod -aG sudo newuser

# 配置SSH
sudo vim /etc/ssh/sshd_config
# 修改
PermitRootLogin no

# 重启SSH
sudo systemctl restart sshd

2. 限制登录用户

Bash
# 编辑SSH配置
sudo vim /etc/ssh/sshd_config

# 只允许特定用户登录
AllowUsers user1 user2

# 或者拒绝特定用户
DenyUsers root

3. 使用两步验证(2FA)

Bash
# 安装Google Authenticator
sudo apt install libpam-google-authenticator

# 配置
google-authenticator

# 编辑SSH配置
sudo vim /etc/ssh/sshd_config
# 添加
ChallengeResponseAuthentication yes

# 编辑PAM配置
sudo vim /etc/pam.d/sshd
# 添加
auth required pam_google_authenticator.so

# 重启SSH
sudo systemctl restart sshd

4. 定期更新系统

Bash
# Ubuntu/Debian
sudo apt update
sudo apt upgrade

# CentOS/RHEL
sudo yum update

5. 配置自动安全更新

Bash
# Ubuntu/Debian
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades

# CentOS/RHEL
sudo yum install yum-cron
sudo systemctl enable yum-cron
sudo systemctl start yum-cron

7. 实战案例

🛒 购买阿里云ECS实例

步骤1:注册阿里云账号

  1. 访问阿里云官网:https://www.aliyun.com
  2. 点击"免费注册"
  3. 填写手机号、邮箱等信息
  4. 完成实名认证(需要身份证)

步骤2:选择ECS实例

  1. 登录阿里云控制台
  2. 点击"产品" → "云服务器ECS"
  3. 点击"创建实例"

步骤3:配置实例

基础配置:

Text Only
付费模式:按量付费(适合测试)或包年包月(适合长期使用)
地域:选择离你最近的地域(如华东1-杭州)
实例规格:选择适合的规格
├── 共享型 s6:适合个人学习、测试
├── 通用型 g6:适合中小型网站
└── 计算型 c6:适合计算密集型应用

镜像选择:

Text Only
公共镜像
├── Ubuntu 20.04 LTS(推荐新手)
├── Ubuntu 22.04 LTS(最新版本)
├── CentOS 7.9(稳定版本)
└── Debian 11(极度稳定)

存储选择:

Text Only
系统盘:40GB SSD(默认)
数据盘:根据需要添加

网络选择:

Text Only
网络类型:专有网络(VPC)
带宽计费:按使用流量(适合测试)或按固定带宽(适合生产环境)
带宽值:1-5 Mbps(测试环境)

实例名称:

Text Only
自定义:my-first-server

步骤4:设置密码

Text Only
认证方式:自定义密码
用户名:root(Linux系统)
密码:设置一个强密码(至少8位,包含大小写字母、数字、特殊字符)
确认密码:再次输入密码

步骤5:确认订单

  1. 检查配置信息
  2. 选择购买时长(按量付费不需要)
  3. 查看价格
  4. 点击"确认订单"
  5. 支付费用

步骤6:等待实例创建

  1. 实例创建需要1-3分钟
  2. 创建完成后,状态变为"运行中"
  3. 记录实例的公网IP地址

🔐 配置安全组规则

安全组相当于虚拟防火墙,控制哪些IP可以访问服务器的哪些端口。

步骤1:进入安全组配置

  1. 在ECS控制台,找到你的实例
  2. 点击"更多" → "网络和安全组" → "安全组配置"
  3. 点击"配置规则"

步骤2:添加入方向规则

必须添加的规则:

Text Only
规则1:允许SSH连接
├── 协议类型:自定义TCP
├── 端口范围:22/22(或自定义端口如2222)
├── 授权对象:0.0.0.0/0(允许所有IP访问)
└── 描述:SSH访问

规则2:允许HTTP访问(如果需要)
├── 协议类型:自定义TCP
├── 端口范围:80/80
├── 授权对象:0.0.0.0/0
└── 描述:HTTP访问

规则3:允许HTTPS访问(如果需要)
├── 协议类型:自定义TCP
├── 端口范围:443/443
├── 授权对象:0.0.0.0/0
└── 描述:HTTPS访问

安全建议:

Text Only
限制SSH访问的IP(如果固定IP)
├── 授权对象:123.45.67.89/32(你的固定IP)
└── 这样只有你的IP可以SSH连接

步骤3:保存规则

  1. 点击"保存"
  2. 规则立即生效

🔌 使用SSH连接到服务器

方法1:使用密码连接

Bash
# 基本连接命令
ssh root@你的公网IP

# 示例
ssh root@47.95.123.45

# 首次连接会提示确认指纹
The authenticity of host '47.95.123.45' can't be established.
ECDSA key fingerprint is SHA256:abc123...
Are you sure you want to continue connecting (yes/no)? yes

# 输入密码
root@47.95.123.45's password: [输入密码]

# 连接成功
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-91-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

 System information as of Mon Jan 27 10:00:00 CST 2026

  System load:  0.01              Processes:             102
  Usage of /:   13.2% of 39.11GB  Users logged in:       0
  Memory usage: 18%               IPv4 address for eth0: 47.95.123.45
  Swap usage:   0%

0 updates can be applied immediately.

Last login: Mon Jan 27 10:00:00 2026 from 123.45.67.89
[root@iZ2ze3abc123 ~]#

方法2:使用密钥连接

如果购买时选择了密钥对:

Bash
# 下载私钥文件(.pem格式)
# 修改权限
chmod 400 your-key.pem

# 使用密钥连接
ssh -i your-key.pem root@47.95.123.45

如果购买时没有选择密钥对,可以自己配置:

Bash
# 1. 在本地生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 2. 将公钥复制到服务器
ssh-copy-id root@47.95.123.45

# 3. 测试密钥登录
ssh root@47.95.123.45

🌐 部署一个简单的Web应用

步骤1:更新系统

Bash
# 更新软件包列表
sudo apt update

# 升级已安装的软件包
sudo apt upgrade -y

步骤2:安装Web服务器

Bash
# 安装Nginx
sudo apt install nginx -y

# 启动Nginx
sudo systemctl start nginx

# 设置开机自启
sudo systemctl enable nginx

# 查看Nginx状态
sudo systemctl status nginx

步骤3:创建简单的网页

Bash
# 进入Nginx默认网站目录
cd /var/www/html

# 备份默认页面
sudo mv index.nginx-debian.html index.nginx-debian.html.bak

# 创建新的index.html
sudo vim index.html

index.html内容:

HTML
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的第一个网站</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 50px auto;
            padding: 20px;
            text-align: center;
        }
        h1 {
            color: #333;
        }
        p {
            color: #666;
            line-height: 1.6;
        }
        .info {
            background: #f0f0f0;
            padding: 20px;
            border-radius: 5px;
            margin: 20px 0;
        }
    </style>
</head>
<body>
    <h1>🎉 恭喜!你的网站已成功部署!</h1>
    <p>这是你使用SSH连接到阿里云服务器后部署的第一个网站。</p>

    <div class="info">
        <h2>📊 服务器信息</h2>
        <p>服务器IP:47.95.123.45</p>
        <p>Web服务器:Nginx</p>
        <p>操作系统:Ubuntu 20.04 LTS</p>
    </div>

    <p>现在你可以通过浏览器访问这个网站了!</p>
    <p>访问地址:<a href="http://47.95.123.45">http://47.95.123.45</a></p>
</body>
</html>

步骤4:测试网站

Bash
# 在服务器上测试
curl http://localhost

# 或者使用wget
wget -O - http://localhost

步骤5:在浏览器中访问

  1. 打开浏览器
  2. 访问:http://你的公网IP
  3. 例如:http://47.95.123.45
  4. 应该能看到你创建的网页

步骤6:查看Nginx日志

Bash
# 查看访问日志
sudo tail -f /var/log/nginx/access.log

# 查看错误日志
sudo tail -f /var/log/nginx/error.log

# 查看最近的访问记录
sudo tail -n 20 /var/log/nginx/access.log

步骤7:配置防火墙(如果需要)

Bash
# 如果防火墙未启用,启用它
sudo ufw enable

# 允许HTTP访问
sudo ufw allow 80/tcp

# 允许HTTPS访问
sudo ufw allow 443/tcp

# 查看防火墙状态
sudo ufw status

步骤8:优化Nginx配置(可选)

Bash
# 备份配置文件
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 编辑配置文件
sudo vim /etc/nginx/nginx.conf

优化建议:

Nginx Configuration File
# 在http块中添加
http {
    # ... 其他配置 ...

    # 开启gzip压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/plain text/css text/xml text/javascript
               application/x-javascript application/xml+rss
               application/json application/javascript;

    # 隐藏Nginx版本号
    server_tokens off;

    # ... 其他配置 ...
}

重启Nginx:

Bash
# 测试配置文件
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

📦 部署Python应用(进阶)

步骤1:安装Python和pip

Bash
# 安装Python 3和pip
sudo apt install python3 python3-pip python3-venv -y

# 验证安装
python3 --version
pip3 --version

步骤2:创建虚拟环境

Bash
# 创建项目目录
mkdir ~/myproject
cd ~/myproject

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 提示符会变成
(myproject) root@server:~/myproject#

步骤3:安装Flask

Bash
# 安装Flask
pip install flask

# 创建requirements.txt
pip freeze > requirements.txt

步骤4:创建Flask应用

Bash
# 创建app.py
vim app.py

app.py内容:

Python
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return '''
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Flask应用</title>
        <style>
            body {
                font-family: Arial, sans-serif;
                max-width: 800px;
                margin: 50px auto;
                padding: 20px;
                text-align: center;
            }
            h1 {
                color: #333;
            }
            p {
                color: #666;
            }
        </style>
    </head>
    <body>
        <h1>🚀 Flask应用已成功部署!</h1>
        <p>这是一个使用Python Flask框架创建的简单Web应用。</p>
        <p>服务器时间:2026-01-27</p>
    </body>
    </html>
    '''

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

步骤5:测试Flask应用

Bash
# 运行Flask应用
python app.py

# 在另一个SSH会话中测试
curl http://localhost:5000

步骤6:使用Gunicorn运行(生产环境)

Bash
# 安装Gunicorn
pip install gunicorn

# 使用Gunicorn运行
gunicorn -w 4 -b 0.0.0.0:5000 app:app

步骤7:配置Nginx反向代理

Bash
# 创建Nginx配置文件
sudo vim /etc/nginx/sites-available/myproject

配置内容:

Nginx Configuration File
server {
    listen 80;
    server_name 47.95.123.45;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

启用配置:

Bash
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/

# 测试配置
sudo nginx -t

# 重启Nginx
sudo systemctl restart nginx

步骤8:使用systemd管理服务

Bash
# 创建systemd服务文件
sudo vim /etc/systemd/system/myproject.service

服务文件内容:

INI
[Unit]
Description=Flask Application
After=network.target

[Service]
User=root
WorkingDirectory=/root/myproject
Environment="PATH=/root/myproject/venv/bin"
ExecStart=/root/myproject/venv/bin/gunicorn -w 4 -b 0.0.0.0:5000 app:app
Restart=always

[Install]
WantedBy=multi-user.target

启动服务:

Bash
# 重新加载systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start myproject

# 设置开机自启
sudo systemctl enable myproject

# 查看服务状态
sudo systemctl status myproject

8. 常见问题

❓ 连接被拒绝怎么办

问题现象

Bash
$ ssh root@47.95.123.45
ssh: connect to host 47.95.123.45 port 22: Connection refused

可能原因和解决方案

原因1:SSH服务未启动

Bash
# 登录到服务器(通过云服务商控制台)
# 检查SSH服务状态
sudo systemctl status sshd

# 启动SSH服务
sudo systemctl start sshd

# 设置开机自启
sudo systemctl enable sshd

原因2:SSH端口不是22

Bash
# 尝试常见端口
ssh -p 2222 root@47.95.123.45
ssh -p 10086 root@47.95.123.45

# 或者在云服务商控制台查看端口配置

原因3:防火墙阻止了连接

Bash
# 检查防火墙状态
sudo ufw status

# 允许SSH端口
sudo ufw allow 22/tcp
# 或者自定义端口
sudo ufw allow 2222/tcp

# 重启防火墙
sudo ufw reload

原因4:安全组规则未配置

Bash
# 登录阿里云控制台
# 检查安全组规则
# 确保允许SSH端口(22或自定义端口)的入站规则

原因5:服务器IP地址错误

Bash
# 确认IP地址是否正确
# 在云服务商控制台查看实例的公网IP

⏱️ 连接超时怎么办

问题现象

Bash
$ ssh root@47.95.123.45
ssh: connect to host 47.95.123.45 port 22: Connection timed out

可能原因和解决方案

原因1:网络问题

Bash
# 检查本地网络
ping 47.95.123.45

# 如果ping不通,检查:
# 1. 本地网络是否正常
# 2. 服务器是否正常运行
# 3. 是否有网络防火墙

原因2:服务器关机或重启中

Bash
# 登录云服务商控制台
# 检查实例状态
# 如果状态是"已停止",启动实例

原因3:防火墙阻止了连接

Bash
# 检查服务器防火墙
sudo ufw status

# 检查云服务商安全组
# 确保允许SSH端口的入站规则

原因4:SSH服务崩溃

Bash
# 通过云服务商控制台登录服务器
# 检查SSH服务状态
sudo systemctl status sshd

# 重启SSH服务
sudo systemctl restart sshd

原因5:网络延迟高

Bash
# 增加连接超时时间
ssh -o ConnectTimeout=30 root@47.95.123.45

# 使用详细模式查看连接过程
ssh -vvv root@47.95.123.45

🔑 如何管理多个服务器

方法1:使用SSH config文件

Bash
# 编辑config文件
vim ~/.ssh/config

配置示例:

Bash
# 阿里云服务器
Host aliyun-prod
    HostName 47.95.123.45
    User root
    Port 22
    IdentityFile ~/.ssh/id_rsa_aliyun

Host aliyun-test
    HostName 47.95.123.46
    User root
    Port 2222
    IdentityFile ~/.ssh/id_rsa_aliyun

# 腾讯云服务器
Host tencent-prod
    HostName 119.29.123.45
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/id_rsa_tencent

# 本地虚拟机
Host vm-dev
    HostName 192.168.1.100
    User vagrant
    Port 22

# GitHub
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa_github

使用:

Bash
# 连接到阿里云生产环境
ssh aliyun-prod

# 连接到阿里云测试环境
ssh aliyun-test

# 连接到腾讯云生产环境
ssh tencent-prod

方法2:使用脚本批量管理

Bash
# 创建管理脚本
vim manage_servers.sh

脚本内容:

Bash
#!/bin/bash

# 定义服务器列表
SERVERS=(
    "aliyun-prod:root@47.95.123.45"
    "aliyun-test:root@47.95.123.46"
    "tencent-prod:ubuntu@119.29.123.45"
)

# 函数:在所有服务器上执行命令
execute_on_all() {
    local command=$1
    for server in "${SERVERS[@]}"; do  # Shell for循环
        name=$(echo $server | cut -d: -f1)  # $()命令替换:执行命令并获取输出
        conn=$(echo $server | cut -d: -f2)  # |管道:将前一命令的输出作为后一命令的输入
        echo "=== $name ==="
        ssh $conn "$command"
        echo ""
    done
}

# 函数:查看所有服务器状态
check_status() {
    execute_on_all "uptime"
}

# 函数:更新所有服务器
update_all() {
    execute_on_all "sudo apt update && sudo apt upgrade -y"  # &&前一个成功才执行后一个;||前一个失败才执行
}

# 主菜单
case $1 in
    status)
        check_status
        ;;
    update)
        update_all
        ;;
    *)
        echo "Usage: $0 {status|update}"
        exit 1
        ;;
esac

使用:

Bash
# 添加执行权限
chmod +x manage_servers.sh

# 查看所有服务器状态
./manage_servers.sh status

# 更新所有服务器
./manage_servers.sh update

方法3:使用Ansible(高级)

Ansible是一个自动化运维工具,适合管理大量服务器。

Bash
# 安装Ansible
pip install ansible

# 创建inventory文件
vim inventory

inventory内容:

INI
[aliyun]
aliyun-prod ansible_host=47.95.123.45 ansible_user=root
aliyun-test ansible_host=47.95.123.46 ansible_user=root ansible_port=2222

[tencent]
tencent-prod ansible_host=119.29.123.45 ansible_user=ubuntu

[all:vars]
ansible_python_interpreter=/usr/bin/python3

使用Ansible:

Bash
# 测试连接
ansible all -i inventory -m ping

# 在所有服务器上执行命令
ansible all -i inventory -m shell -a "uptime"

# 更新所有服务器
ansible all -i inventory -m apt -a "update_cache=yes upgrade=yes"

🔐 SSH密钥丢失如何处理

场景1:丢失私钥,但还能通过密码登录

Bash
# 1. 登录到服务器
ssh root@47.95.123.45

# 2. 删除旧的公钥
rm ~/.ssh/authorized_keys

# 3. 在本地生成新的密钥对
ssh-keygen -t rsa -b 4096 -C "new_key@example.com"

# 4. 将新公钥上传到服务器
ssh-copy-id root@47.95.123.45

# 5. 测试新密钥登录
ssh root@47.95.123.45

场景2:丢失私钥,也无法通过密码登录

这是最危险的情况,需要通过云服务商的控制台来恢复。

阿里云ECS恢复方法:

Bash
# 1. 登录阿里云控制台
# 2. 找到你的ECS实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"远程连接" → "VNC连接"
# 5. 通过VNC连接到服务器
# 6. 重置root密码或重新配置SSH密钥

重置root密码(Ubuntu):

Bash
# 在VNC连接中执行
sudo passwd root

# 输入新密码两次

重新配置SSH密钥:

Bash
# 1. 在本地生成新的密钥对
ssh-keygen -t rsa -b 4096 -C "recovery@example.com"

# 2. 复制公钥内容
cat ~/.ssh/id_rsa.pub

# 3. 在VNC连接中执行
mkdir -p ~/.ssh
echo "你的新公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

# 4. 确保SSH服务运行
sudo systemctl restart sshd

场景3:忘记服务器密码

阿里云ECS重置密码:

Bash
# 1. 登录阿里云控制台
# 2. 找到你的ECS实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"更多" → "密码/密钥" → "重置实例密码"
# 5. 输入新密码
# 6. 确认重置
# 7. 重启实例使密码生效

腾讯云CVM重置密码:

Bash
# 1. 登录腾讯云控制台
# 2. 找到你的CVM实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"更多" → "密码/密钥" → "重置密码"
# 5. 输入新密码
# 6. 确认重置
# 7. 重启实例使密码生效

📚 学习资源推荐

官方文档

在线教程

推荐书籍

  • 《Linux命令行与shell脚本编程大全》
  • 《鸟哥的Linux私房菜》
  • 《SSH权威指南》

实用工具

  • MobaXterm:Windows下的SSH客户端,功能强大
  • Termius:跨平台SSH客户端,支持同步
  • PuTTY:Windows下的经典SSH客户端
  • VS Code Remote SSH:在VS Code中直接连接服务器

🎓 进阶学习路径

掌握了基础SSH操作后,你可以继续学习:

  1. Linux系统管理
  2. 用户和权限管理
  3. 进程和服务管理
  4. 日志管理
  5. 磁盘管理

  6. Web服务器配置

  7. Nginx高级配置
  8. Apache配置
  9. SSL证书配置
  10. 负载均衡

  11. 数据库管理

  12. MySQL安装和配置
  13. PostgreSQL安装和配置
  14. Redis安装和配置
  15. 数据库备份和恢复

  16. 容器技术

  17. Docker安装和使用
  18. Docker Compose
  19. Kubernetes基础

  20. 自动化运维

  21. Shell脚本编程
  22. Ansible自动化
  23. CI/CD基础

  24. 监控和日志

  25. 系统监控
  26. 日志收集和分析
  27. 告警配置

💡 最佳实践总结

服务器安全最佳实践

Bash
 使用强密码(至少12位,包含大小写字母、数字、特殊字符)
 使用SSH密钥认证,禁用密码登录
 修改默认SSH端口
 配置防火墙,只开放必要的端口
 安装fail2ban防止暴力破解
 定期更新系统和软件
 禁用root远程登录,使用普通用户+sudo
 配置自动安全更新
 定期备份数据
 监控服务器日志

SSH连接最佳实践

Bash
 使用SSH config文件管理多台服务器
 为不同的服务器使用不同的SSH密钥
 定期轮换SSH密钥
 使用tmux/screen保持会话
 使用rsync进行文件同步
 使用SSH端口转发保护敏感服务
 限制SSH访问的IP地址
 配置SSH连接超时
 使用详细模式调试连接问题

服务器管理最佳实践

Bash
 使用版本控制管理配置文件
 编写自动化脚本
 使用systemd管理服务
 配置日志轮转
 定期检查磁盘空间
 监控系统资源使用
 定期备份数据
 文档化服务器配置
 使用标签和注释组织配置
 定期进行安全审计

🎉 结语

恭喜你!通过本教程,你已经学会了:

✅ 理解了服务器的基本概念和类型 ✅ 掌握了SSH协议的工作原理 ✅ 学会了使用SSH连接远程服务器 ✅ 掌握了文件传输和远程命令执行 ✅ 了解了服务器安全配置 ✅ 完成了从购买服务器到部署应用的完整流程 ✅ 学会了解决常见问题

SSH是服务器管理的核心技能,掌握它将为你的开发和运维工作打下坚实的基础。继续实践,探索更多高级功能,你会发现服务器管理其实并不难!

记住: - 安全第一,永远不要忽视服务器安全 - 定期备份,数据无价 - 持续学习,技术不断更新 - 勇于实践,理论结合实际

祝你学习愉快,在服务器管理的道路上越走越远!🚀


文档版本:v1.0 最后更新:2026-01-27 作者:AI学习创作团队 许可证:MIT License