03 - 服务器与SSH¶
本章核心: 掌握SSH远程连接技术,能够安全地管理远程服务器
📖 章节导航¶
前序章节: 01-网络基础.md → 02-域名与DNS.md 后续章节: 04-代理与VPN.md 快速参考: 网络工具箱.md 第1章 故障排查: 故障排查手册.md 第3章
📚 目录¶
1. 引言¶
🤔 什么是服务器?¶
想象一下,你的电脑就像一个私人工作室,你在里面工作、存储文件、运行程序。而服务器就像一个公共图书馆或数据中心,它专门用来存储大量数据、运行服务程序,供很多人同时访问和使用。
简单来说: - 服务器 = 一台强大的电脑,专门用来提供服务 - 远程连接 = 从你的电脑控制那台远方的服务器
🌍 为什么需要远程连接服务器?¶
在现代开发和运维工作中,远程连接服务器是必备技能:
- 部署应用:将你开发的应用程序部署到服务器上,让全世界的用户都能访问
- 数据存储:服务器通常有更强大的存储能力和更好的备份机制
- 计算资源:服务器拥有更强的CPU和GPU,适合运行大型程序或机器学习模型
- 持续运行:服务器可以7×24小时不间断运行,不像个人电脑需要关机
- 团队协作:多个开发者可以通过SSH连接到同一台服务器协同工作
💡 现实场景举例¶
场景1:你开发了一个网站
├── 在本地电脑开发完成
├── 通过SSH连接到云服务器
├── 将代码上传到服务器
└── 网站就可以被全世界访问了!
场景2:训练机器学习模型
├── 本地电脑配置不够
├── 租用一台带GPU的云服务器
├── 通过SSH连接服务器
└── 在服务器上训练模型,速度提升100倍!
2. 服务器基础¶
🖥️ 服务器的定义和类型¶
什么是服务器?¶
服务器是一种高性能的计算机,专门用来存储数据、运行应用程序、提供网络服务。它通常具有以下特点: - 高性能:强大的CPU、大容量内存、高速存储 - 高可靠性:24小时不间断运行,有冗余备份 - 网络连接:高速稳定的网络连接 - 远程管理:支持远程操作和管理
服务器的类型¶
┌─────────────────────────────────────────────────────┐
│ 服务器类型 │
├─────────────────────────────────────────────────────┤
│ │
│ 1. 物理服务器 │
│ ┌─────────────────┐ │
│ │ 真实的硬件设备 │ │
│ │ - 独立的服务器 │ │
│ │ - 性能强大 │ │
│ │ - 成本较高 │ │
│ └─────────────────┘ │
│ │
│ 2. 云服务器 (Cloud Server) │
│ ┌─────────────────┐ │
│ │ 虚拟化的服务器 │ │
│ │ - 按需付费 │ │
│ │ - 弹性扩展 │ │
│ │ - 管理方便 │ │
│ └─────────────────┘ │
│ │
│ 3. 虚拟服务器 (VPS) │
│ ┌─────────────────┐ │
│ │ 物理服务器上 │ │
│ │ 的虚拟机 │ │
│ │ - 成本较低 │ │
│ │ - 独立环境 │ │
│ │ - 适合个人 │ │
│ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
🔍 服务器与普通电脑的区别¶
| 特性 | 普通电脑 | 服务器 |
|---|---|---|
| 用途 | 个人使用、娱乐、办公 | 提供服务、存储数据 |
| 性能 | 满足日常需求 | 高性能、高并发 |
| 稳定性 | 偶尔关机、重启 | 7×24小时运行 |
| 网络 | 家庭/办公网络 | 高速企业级网络 |
| 管理 | 图形界面为主 | 命令行界面为主 |
| 位置 | 就在你身边 | 在数据中心或云端 |
| 访问方式 | 直接操作 | 远程连接(SSH等) |
🐧 常见的服务器操作系统¶
Linux系统(推荐新手使用)¶
Linux是服务器领域的主流操作系统,具有以下优势: - 免费开源:大多数Linux发行版免费 - 稳定可靠:可以长时间运行不崩溃 - 安全性高:权限管理严格,病毒较少 - 资源占用少:适合资源有限的服务器 - 社区支持:遇到问题容易找到解决方案
常见Linux发行版:
Ubuntu Server
├── 优点:易用、文档丰富、社区活跃
├── 缺点:更新频繁,可能不够稳定
└── 适用:新手入门、快速部署
CentOS / Rocky Linux
├── 优点:稳定、企业级、长期支持
├── 缺点:软件版本较旧
└── 适用:生产环境、企业应用
Debian
├── 优点:极其稳定、安全
├── 缺点:软件版本保守
└── 适用:追求稳定性的场景
Alpine Linux
├── 优点:体积小、启动快
├── 缺点:包管理器特殊
└── 适用:Docker容器、嵌入式
Windows Server¶
Windows Server是微软推出的服务器操作系统:
新手建议:如果你是初学者,强烈推荐使用 Ubuntu Server 或 CentOS,因为它们有丰富的中文文档和社区支持。
☁️ 云服务商介绍¶
国内主流云服务商对比:
阿里云(Alibaba Cloud)¶
🏢 阿里云
├── 优势:国内市场份额第一、文档完善、服务稳定
├── 产品:ECS云服务器、OSS对象存储、RDS数据库
├── 价格:中等,经常有优惠活动
├── 适用:国内业务、企业应用
└── 官网:https://www.aliyun.com
阿里云ECS实例类型: - 共享型:适合个人学习、测试环境 - 通用型:适合中小型网站、企业应用 - 计算型:适合计算密集型应用 - 内存型:适合数据库、缓存等内存密集型应用 - GPU型:适合AI训练、图形渲染
腾讯云(Tencent Cloud)¶
🎮 腾讯云
├── 优势:与微信生态集成、价格有竞争力
├── 产品:CVM云服务器、COS对象存储、MySQL数据库
├── 价格:中等偏下,学生优惠多
├── 适用:游戏、社交应用、小程序后端
└── 官网:https://cloud.tencent.com
华为云(Huawei Cloud)¶
🔷 华为云
├── 优势:企业级服务、安全性高
├── 产品:ECS云服务器、OBS对象存储
├── 价格:中等,企业客户有优惠
├── 适用:企业应用、政府项目
└── 官网:https://www.huaweicloud.com
国外云服务商¶
☁️ 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)是一种网络协议,用于在不安全的网络上安全地进行远程登录和命令执行。
┌────────────────────────────────────────────────────┐
│ SSH 是什么? │
├────────────────────────────────────────────────────┤
│ │
│ SSH = Secure Shell(安全外壳) │
│ │
│ 作用: │
│ ✅ 安全地远程登录服务器 │
│ ✅ 在远程服务器上执行命令 │
│ ✅ 安全地传输文件 │
│ ✅ 端口转发(建立加密隧道) │
│ │
└────────────────────────────────────────────────────┘
🆚 为什么使用SSH而不是Telnet?¶
在SSH出现之前,人们使用Telnet进行远程连接。但Telnet有一个致命问题:不安全。
对比:Telnet vs SSH
┌─────────────────┐ ┌─────────────────┐
│ Telnet │ │ SSH │
├─────────────────┤ ├─────────────────┤
│ ❌ 明文传输 │ │ ✅ 加密传输 │
│ ❌ 容易被窃听 │ │ ✅ 防止窃听 │
│ ❌ 容易被篡改 │ │ ✅ 防止篡改 │
│ ❌ 不安全 │ │ ✅ 安全可靠 │
│ │ │ │
│ 就像寄明信片 │ │ 就像寄加密信件 │
└─────────────────┘ └─────────────────┘
实际场景说明:
❌ 使用Telnet:
你的电脑 ───────> 互联网 ───────> 服务器
│ │
└── 发送密码:123456 └── 接收密码:123456
(明文,任何人都能看到) (明文,不安全)
✅ 使用SSH:
你的电脑 ───────> 互联网 ───────> 服务器
│ │
└── 发送:加密后的乱码 └── 解密:123456
(密文,只有服务器能解密) (安全)
🔧 SSH的工作原理¶
SSH通过以下机制保证安全:
SSH工作流程:
1. 连接建立
┌──────────┐ ┌──────────┐
│ 客户端 │ │ 服务器 │
└────┬─────┘ └────┬─────┘
│ │
│ ① 发送连接请求 │
│ ─────────────────────────────>│
│ │
│ ② 返回服务器公钥 │
│ <─────────────────────────────│
│ │
2. 密钥交换
┌──────────┐ ┌──────────┐
│ 客户端 │ │ 服务器 │
└────┬─────┘ └────┬─────┘
│ │
│ ③ 生成会话密钥 │
│ │
│ ④ 用服务器公钥加密会话密钥 │
│ ─────────────────────────────>│
│ │
│ ⑤ 服务器用私钥解密 │
│ │
│ ⑥ 双方使用会话密钥加密通信 │
│ <═══════════════════════════>│
│ (加密通道建立) │
3. 身份认证
┌──────────┐ ┌──────────┐
│ 客户端 │ │ 服务器 │
└────┬─────┘ └────┬─────┘
│ │
│ ⑦ 发送用户名和认证信息 │
│ ─────────────────────────────>│
│ │
│ ⑧ 确认身份 │
│ <─────────────────────────────│
│ │
│ ⑨ 登录成功! │
│ │
SSH的三大安全机制¶
- 加密(Encryption)
- 所有数据都经过加密传输
-
即使被截获,也无法解读内容
-
认证(Authentication)
- 确认连接者的身份
-
支持密码认证和密钥认证
-
完整性(Integrity)
- 确保数据在传输过程中未被篡改
- 使用消息认证码(MAC)验证
SSH认证方式¶
┌─────────────────────────────────────────────────────┐
│ SSH认证方式 │
├─────────────────────────────────────────────────────┤
│ │
│ 方式1:密码认证 │
│ ┌─────────────────────────────────────────────┐ │
│ │ 流程: │ │
│ │ 1. 服务器发送加密挑战 │ │
│ │ 2. 客户端用密码加密响应 │ │
│ │ 3. 服务器验证密码 │ │
│ │ │ │
│ │ 优点:简单、方便 │ │
│ │ 缺点:可能被暴力破解 │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ 方式2:密钥认证(推荐) │
│ ┌─────────────────────────────────────────────┐ │
│ │ 流程: │ │
│ │ 1. 生成密钥对(公钥+私钥) │ │
│ │ 2. 将公钥放到服务器上 │ │
│ │ 3. 客户端用私钥签名 │ │
│ │ 4. 服务器用公钥验证签名 │ │
│ │ │ │
│ │ 优点:更安全、无需输入密码 │ │
│ │ 缺点:需要配置密钥 │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
4. SSH连接实战¶
🚀 基本连接命令¶
最简单的SSH连接¶
# 基本语法
ssh 用户名@服务器地址
# 示例:连接到阿里云服务器
ssh root@47.95.123.45
# 示例:连接到腾讯云服务器
ssh ubuntu@119.29.123.45
# 示例:连接到本地虚拟机
ssh user@192.168.1.100
首次连接时的提示:
$ 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 确认 - 然后输入密码(输入时不会显示字符) - 连接成功后,你的命令行提示符会变成服务器的提示符
连接成功后的提示符变化¶
🔌 指定端口连接¶
SSH默认使用22端口,但为了安全,很多服务器会修改默认端口。
# 基本语法
ssh -p 端口号 用户名@服务器地址
# 示例:连接到使用2222端口的服务器
ssh -p 2222 root@47.95.123.45
# 示例:连接到使用自定义端口的服务器
ssh -p 10086 ubuntu@119.29.123.45
如何知道服务器的SSH端口? - 云服务商通常在控制台显示 - 或者在购买服务器时设置的端口 - 默认通常是22端口
🔑 使用密钥认证¶
密钥认证比密码认证更安全,而且登录时不需要输入密码。
生成SSH密钥对¶
# 生成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:添加注释(通常是邮箱)
执行过程:
$ 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命令(推荐,最简单)
# 基本用法
ssh-copy-id 用户名@服务器地址
# 示例
ssh-copy-id root@47.95.123.45
# 指定端口
ssh-copy-id -p 2222 root@47.95.123.45
方法2:手动复制公钥
# 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命令
# 将公钥复制到服务器
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
使用密钥登录¶
配置好密钥后,就可以直接登录,无需输入密码:
⚙️ 配置SSH config文件¶
如果你有多台服务器需要管理,每次都输入完整的命令会很麻烦。SSH config文件可以简化这个过程。
创建config文件¶
config文件示例¶
# ~/.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文件后,连接变得非常简单:
# 之前
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转发到远程服务器的端口。
基本语法:
示例1:访问远程服务器的MySQL数据库
# 将本地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服务
# 将本地8080端口的流量转发到远程服务器的80端口
ssh -L 8080:localhost:80 root@47.95.123.45
# 现在可以在浏览器访问
http://localhost:8080
示例3:转发到远程服务器能访问的其他服务器
远程端口转发(Remote Port Forwarding)¶
将远程服务器端口的流量通过SSH转发到本地电脑的端口。
基本语法:
示例:让远程服务器访问本地电脑的Web服务
# 将远程服务器的8080端口转发到本地电脑的3000端口
ssh -R 8080:localhost:3000 root@47.95.123.45
# 现在在远程服务器上访问localhost:8080,就会访问到你本地电脑的3000端口
动态端口转发(Dynamic Port Forwarding)¶
创建SOCKS代理,可以转发多种协议的流量。
基本语法:
示例:创建SOCKS代理
# 在本地1080端口创建SOCKS代理
ssh -D 1080 root@47.95.123.45
# 然后在浏览器中配置SOCKS代理
# 代理地址:127.0.0.1
# 代理端口:1080
📝 SSH连接实用技巧¶
保持连接活跃¶
有时候SSH连接会因为长时间没有操作而断开,可以通过配置保持连接活跃。
方法1:客户端配置
方法2:命令行参数
调试连接问题¶
如果连接失败,可以使用 -v 参数查看详细信息:
# 显示详细连接信息
ssh -v root@47.95.123.45
# 显示更详细的信息
ssh -vv root@47.95.123.45
# 显示最详细的信息
ssh -vvv root@47.95.123.45
执行单条命令后退出¶
# 在远程服务器执行命令,然后立即退出
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提供的文件传输命令,简单易用。
基本语法:
# 从本地复制到远程
scp 本地文件 用户名@服务器地址:远程路径
# 从远程复制到本地
scp 用户名@服务器地址:远程路径 本地路径
# 复制目录(使用-r参数)
scp -r 本地目录 用户名@服务器地址:远程路径
示例:
# 上传单个文件
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高级用法:
# 保留文件属性(时间戳、权限等)
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:
sftp常用命令:
# 连接到服务器
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是一个强大的文件同步工具,支持增量传输,适合大文件和大量文件的传输。
基本语法:
常用选项: - -a:归档模式,保留文件属性 - -v:显示详细信息 - -z:压缩传输 - -r:递归复制目录 - --progress:显示进度 - --delete:删除目标中源没有的文件
示例:
# 同步目录到远程服务器
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还可以直接在远程服务器执行命令。
执行单条命令¶
# 基本用法
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"
执行多条命令¶
# 使用分号分隔
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的命令¶
# 执行sudo命令
ssh root@47.95.123.45 "sudo apt update"
# 如果不是root用户,可能需要使用-t参数
ssh -t user@47.95.123.45 "sudo apt update"
执行本地脚本¶
# 执行远程服务器上的脚本
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
实用示例¶
# 查看服务器负载
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:
# Ubuntu/Debian
sudo apt install tmux
# CentOS/RHEL
sudo yum install tmux
# macOS
brew install tmux
tmux基本使用:
# 创建新会话
tmux
# 创建命名会话
tmux new -s mysession
# 列出所有会话
tmux ls
# 连接到会话
tmux attach -t mysession
# 断开会话(保持会话运行)
# 在tmux中按:Ctrl+B 然后按 D
# 杀死会话
tmux kill-session -t mysession
tmux常用快捷键:
前缀键: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实用示例:
# 场景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:
screen基本使用:
# 创建新会话
screen
# 创建命名会话
screen -S mysession
# 列出所有会话
screen -ls
# 连接到会话
screen -r mysession
# 断开会话(保持会话运行)
# 在screen中按:Ctrl+A 然后按 D
# 杀死会话
screen -X -S mysession quit
screen常用快捷键:
前缀键: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实用示例:
# 运行长时间任务
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:测试密钥登录¶
步骤3:修改SSH配置¶
# 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. 已在另一个终端测试密钥登录成功否则禁用密码登录后将无法连接服务器!
# 禁用密码登录(请先确保密钥认证可用,否则会被锁定!)
PasswordAuthentication no
# 禁用空密码登录
PermitEmptyPasswords no
# 确保公钥认证启用
PubkeyAuthentication yes
# 可选:限制root用户登录
# PermitRootLogin prohibit-password
# 或者完全禁止root登录
# PermitRootLogin no
步骤4:重启SSH服务¶
步骤5:测试连接¶
# 确保可以使用密钥登录
ssh root@47.95.123.45
# 尝试用密码登录(应该失败)
ssh -o PreferredAuthentications=password root@47.95.123.45
⚠️ 重要提示: - 在禁用密码登录之前,一定要确保密钥认证可以正常工作 - 否则你可能无法登录服务器! - 建议保留一个SSH会话,在新会话中测试成功后再关闭旧会话
🔢 修改默认SSH端口¶
SSH默认使用22端口,这是攻击者最常扫描的端口。修改端口可以减少大部分自动化攻击。
步骤1:选择新端口¶
选择一个1024-65535之间的端口号,避免使用常用端口。
步骤2:修改SSH配置¶
修改以下配置:
步骤3:配置防火墙¶
# 如果使用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服务¶
步骤5:测试新端口¶
# 使用新端口连接
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文件¶
🛡️ 配置防火墙¶
防火墙可以限制对服务器的访问,只允许必要的端口开放。
ufw(Uncomplicated Firewall)¶
ufw是Ubuntu默认的防火墙工具,简单易用。
安装ufw:
基本使用:
# 查看防火墙状态
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
常用配置示例:
# 基本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内核的防火墙工具,功能强大但配置复杂。
基本使用:
# 查看当前规则
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+的默认防火墙工具。
基本使用:
# 查看状态
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:
基本配置:
# 1. 复制默认配置
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 2. 编辑配置文件
sudo vim /etc/fail2ban/jail.local
配置示例:
[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:
# 启动服务
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日志:
🔐 其他安全建议¶
1. 禁用root登录¶
# 创建普通用户
adduser newuser
usermod -aG sudo newuser
# 配置SSH
sudo vim /etc/ssh/sshd_config
# 修改
PermitRootLogin no
# 重启SSH
sudo systemctl restart sshd
2. 限制登录用户¶
# 编辑SSH配置
sudo vim /etc/ssh/sshd_config
# 只允许特定用户登录
AllowUsers user1 user2
# 或者拒绝特定用户
DenyUsers root
3. 使用两步验证(2FA)¶
# 安装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. 定期更新系统¶
5. 配置自动安全更新¶
# 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:注册阿里云账号¶
- 访问阿里云官网:https://www.aliyun.com
- 点击"免费注册"
- 填写手机号、邮箱等信息
- 完成实名认证(需要身份证)
步骤2:选择ECS实例¶
- 登录阿里云控制台
- 点击"产品" → "云服务器ECS"
- 点击"创建实例"
步骤3:配置实例¶
基础配置:
付费模式:按量付费(适合测试)或包年包月(适合长期使用)
地域:选择离你最近的地域(如华东1-杭州)
实例规格:选择适合的规格
├── 共享型 s6:适合个人学习、测试
├── 通用型 g6:适合中小型网站
└── 计算型 c6:适合计算密集型应用
镜像选择:
公共镜像
├── Ubuntu 20.04 LTS(推荐新手)
├── Ubuntu 22.04 LTS(最新版本)
├── CentOS 7.9(稳定版本)
└── Debian 11(极度稳定)
存储选择:
网络选择:
实例名称:
步骤4:设置密码¶
步骤5:确认订单¶
- 检查配置信息
- 选择购买时长(按量付费不需要)
- 查看价格
- 点击"确认订单"
- 支付费用
步骤6:等待实例创建¶
- 实例创建需要1-3分钟
- 创建完成后,状态变为"运行中"
- 记录实例的公网IP地址
🔐 配置安全组规则¶
安全组相当于虚拟防火墙,控制哪些IP可以访问服务器的哪些端口。
步骤1:进入安全组配置¶
- 在ECS控制台,找到你的实例
- 点击"更多" → "网络和安全组" → "安全组配置"
- 点击"配置规则"
步骤2:添加入方向规则¶
必须添加的规则:
规则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访问
安全建议:
步骤3:保存规则¶
- 点击"保存"
- 规则立即生效
🔌 使用SSH连接到服务器¶
方法1:使用密码连接¶
# 基本连接命令
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:使用密钥连接¶
如果购买时选择了密钥对:
如果购买时没有选择密钥对,可以自己配置:
# 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:更新系统¶
步骤2:安装Web服务器¶
# 安装Nginx
sudo apt install nginx -y
# 启动Nginx
sudo systemctl start nginx
# 设置开机自启
sudo systemctl enable nginx
# 查看Nginx状态
sudo systemctl status nginx
步骤3:创建简单的网页¶
# 进入Nginx默认网站目录
cd /var/www/html
# 备份默认页面
sudo mv index.nginx-debian.html index.nginx-debian.html.bak
# 创建新的index.html
sudo vim index.html
index.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:测试网站¶
步骤5:在浏览器中访问¶
- 打开浏览器
- 访问:http://你的公网IP
- 例如:http://47.95.123.45
- 应该能看到你创建的网页
步骤6:查看Nginx日志¶
# 查看访问日志
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:配置防火墙(如果需要)¶
# 如果防火墙未启用,启用它
sudo ufw enable
# 允许HTTP访问
sudo ufw allow 80/tcp
# 允许HTTPS访问
sudo ufw allow 443/tcp
# 查看防火墙状态
sudo ufw status
步骤8:优化Nginx配置(可选)¶
# 备份配置文件
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
# 编辑配置文件
sudo vim /etc/nginx/nginx.conf
优化建议:
# 在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:
📦 部署Python应用(进阶)¶
步骤1:安装Python和pip¶
# 安装Python 3和pip
sudo apt install python3 python3-pip python3-venv -y
# 验证安装
python3 --version
pip3 --version
步骤2:创建虚拟环境¶
# 创建项目目录
mkdir ~/myproject
cd ~/myproject
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 提示符会变成
(myproject) root@server:~/myproject#
步骤3:安装Flask¶
步骤4:创建Flask应用¶
app.py内容:
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应用¶
步骤6:使用Gunicorn运行(生产环境)¶
步骤7:配置Nginx反向代理¶
配置内容:
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;
}
}
启用配置:
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
# 测试配置
sudo nginx -t
# 重启Nginx
sudo systemctl restart nginx
步骤8:使用systemd管理服务¶
服务文件内容:
[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
启动服务:
# 重新加载systemd
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start myproject
# 设置开机自启
sudo systemctl enable myproject
# 查看服务状态
sudo systemctl status myproject
8. 常见问题¶
❓ 连接被拒绝怎么办¶
问题现象¶
可能原因和解决方案¶
原因1:SSH服务未启动
# 登录到服务器(通过云服务商控制台)
# 检查SSH服务状态
sudo systemctl status sshd
# 启动SSH服务
sudo systemctl start sshd
# 设置开机自启
sudo systemctl enable sshd
原因2:SSH端口不是22
原因3:防火墙阻止了连接
# 检查防火墙状态
sudo ufw status
# 允许SSH端口
sudo ufw allow 22/tcp
# 或者自定义端口
sudo ufw allow 2222/tcp
# 重启防火墙
sudo ufw reload
原因4:安全组规则未配置
原因5:服务器IP地址错误
⏱️ 连接超时怎么办¶
问题现象¶
可能原因和解决方案¶
原因1:网络问题
原因2:服务器关机或重启中
原因3:防火墙阻止了连接
原因4:SSH服务崩溃
原因5:网络延迟高
🔑 如何管理多个服务器¶
方法1:使用SSH config文件¶
配置示例:
# 阿里云服务器
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
使用:
方法2:使用脚本批量管理¶
脚本内容:
#!/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
使用:
# 添加执行权限
chmod +x manage_servers.sh
# 查看所有服务器状态
./manage_servers.sh status
# 更新所有服务器
./manage_servers.sh update
方法3:使用Ansible(高级)¶
Ansible是一个自动化运维工具,适合管理大量服务器。
inventory内容:
[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:
# 测试连接
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:丢失私钥,但还能通过密码登录¶
# 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恢复方法:
# 1. 登录阿里云控制台
# 2. 找到你的ECS实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"远程连接" → "VNC连接"
# 5. 通过VNC连接到服务器
# 6. 重置root密码或重新配置SSH密钥
重置root密码(Ubuntu):
重新配置SSH密钥:
# 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重置密码:
# 1. 登录阿里云控制台
# 2. 找到你的ECS实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"更多" → "密码/密钥" → "重置实例密码"
# 5. 输入新密码
# 6. 确认重置
# 7. 重启实例使密码生效
腾讯云CVM重置密码:
# 1. 登录腾讯云控制台
# 2. 找到你的CVM实例
# 3. 点击"实例ID"进入详情页
# 4. 点击"更多" → "密码/密钥" → "重置密码"
# 5. 输入新密码
# 6. 确认重置
# 7. 重启实例使密码生效
📚 学习资源推荐¶
官方文档¶
- SSH官方文档:https://www.openssh.com/manual.html
- 阿里云ECS文档:https://help.aliyun.com/product/25365.html
- 腾讯云CVM文档:https://cloud.tencent.com/document/product/213
- Ubuntu官方文档:https://ubuntu.com/server/docs
在线教程¶
- Linux命令行教程:https://linuxjourney.com/
- SSH入门教程:https://www.digitalocean.com/community/tutorials/how-to-configure-ssh-key-based-authentication-on-a-linux-server
- Nginx入门教程:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04
推荐书籍¶
- 《Linux命令行与shell脚本编程大全》
- 《鸟哥的Linux私房菜》
- 《SSH权威指南》
实用工具¶
- MobaXterm:Windows下的SSH客户端,功能强大
- Termius:跨平台SSH客户端,支持同步
- PuTTY:Windows下的经典SSH客户端
- VS Code Remote SSH:在VS Code中直接连接服务器
🎓 进阶学习路径¶
掌握了基础SSH操作后,你可以继续学习:
- Linux系统管理
- 用户和权限管理
- 进程和服务管理
- 日志管理
-
磁盘管理
-
Web服务器配置
- Nginx高级配置
- Apache配置
- SSL证书配置
-
负载均衡
-
数据库管理
- MySQL安装和配置
- PostgreSQL安装和配置
- Redis安装和配置
-
数据库备份和恢复
-
容器技术
- Docker安装和使用
- Docker Compose
-
Kubernetes基础
-
自动化运维
- Shell脚本编程
- Ansible自动化
-
CI/CD基础
-
监控和日志
- 系统监控
- 日志收集和分析
- 告警配置
💡 最佳实践总结¶
服务器安全最佳实践¶
✅ 使用强密码(至少12位,包含大小写字母、数字、特殊字符)
✅ 使用SSH密钥认证,禁用密码登录
✅ 修改默认SSH端口
✅ 配置防火墙,只开放必要的端口
✅ 安装fail2ban防止暴力破解
✅ 定期更新系统和软件
✅ 禁用root远程登录,使用普通用户+sudo
✅ 配置自动安全更新
✅ 定期备份数据
✅ 监控服务器日志
SSH连接最佳实践¶
✅ 使用SSH config文件管理多台服务器
✅ 为不同的服务器使用不同的SSH密钥
✅ 定期轮换SSH密钥
✅ 使用tmux/screen保持会话
✅ 使用rsync进行文件同步
✅ 使用SSH端口转发保护敏感服务
✅ 限制SSH访问的IP地址
✅ 配置SSH连接超时
✅ 使用详细模式调试连接问题
服务器管理最佳实践¶
✅ 使用版本控制管理配置文件
✅ 编写自动化脚本
✅ 使用systemd管理服务
✅ 配置日志轮转
✅ 定期检查磁盘空间
✅ 监控系统资源使用
✅ 定期备份数据
✅ 文档化服务器配置
✅ 使用标签和注释组织配置
✅ 定期进行安全审计
🎉 结语¶
恭喜你!通过本教程,你已经学会了:
✅ 理解了服务器的基本概念和类型 ✅ 掌握了SSH协议的工作原理 ✅ 学会了使用SSH连接远程服务器 ✅ 掌握了文件传输和远程命令执行 ✅ 了解了服务器安全配置 ✅ 完成了从购买服务器到部署应用的完整流程 ✅ 学会了解决常见问题
SSH是服务器管理的核心技能,掌握它将为你的开发和运维工作打下坚实的基础。继续实践,探索更多高级功能,你会发现服务器管理其实并不难!
记住: - 安全第一,永远不要忽视服务器安全 - 定期备份,数据无价 - 持续学习,技术不断更新 - 勇于实践,理论结合实际
祝你学习愉快,在服务器管理的道路上越走越远!🚀
文档版本:v1.0 最后更新:2026-01-27 作者:AI学习创作团队 许可证:MIT License