目录
[2.1 密码 vs 密钥:两种认证方式](#2.1 密码 vs 密钥:两种认证方式)
[2.2 生成密钥对](#2.2 生成密钥对)
[2.3 将公钥安装到服务器](#2.3 将公钥安装到服务器)
[2.4 测试免密登录](#2.4 测试免密登录)
[2.5 禁用密码登录(提升安全性)](#2.5 禁用密码登录(提升安全性))
[3.1 痛点:记不住IP](#3.1 痛点:记不住IP)
[3.2 创建配置文件](#3.2 创建配置文件)
[3.3 使用别名连接](#3.3 使用别名连接)
[3.4 常用配置项](#3.4 常用配置项)
[4.1 SCP:简单直接的文件拷贝](#4.1 SCP:简单直接的文件拷贝)
[4.2 SFTP:交互式文件管理器](#4.2 SFTP:交互式文件管理器)
[4.3 SCP vs SFTP:如何选择?](#4.3 SCP vs SFTP:如何选择?)
一、引言:密码登录的三个痛点
还记得第一篇我们购买的云服务器吗?那时我们用的是密码登录:
bash
ssh root@123.456.789.0
# 输入密码……
这种方式用久了,几个痛点会越来越明显:
-
每次都要输密码,密码短了不安全,长了手酸
-
多台服务器要记多个IP和密码,脑容量告急
-
密码可以被暴力破解,你的服务器时刻在被全世界的扫描器试探
今天我们要解决的,就是这三个问题。目标很明确:敲几个字母就能安全登录任意一台服务器,还能方便地传文件。
二、SSH密钥对:更安全、更便捷的认证方式
2.1 密码 vs 密钥:两种认证方式
SSH支持两种认证方式:
| 方式 | 原理 | 安全性 | 便捷性 |
|---|---|---|---|
| 密码认证 | 你知道什么 | 取决于密码强度,可被暴力破解 | 每次都要输入 |
| 密钥认证 | 你拥有什么 | 非对称加密,几乎无法暴力破解 | 一次配置,终身免密 |
密钥认证的核心是非对称加密:你拥有一对密钥------公钥和私钥。
-
私钥 :绝对保密,存放在你自己的电脑上(
~/.ssh/id_rsa) -
公钥 :公开的,安装到你需要登录的服务器上(
~/.ssh/authorized_keys)
它们之间存在数学关联:公钥加密的数据只能用私钥解密,私钥签名的数据能用公钥验证。登录时,服务器用公钥加密一个随机数发给你,你能用私钥解密并正确回复,就证明你是密钥的主人,无需密码。
一个重要的直观理解:可以把公钥想象成一把挂锁 ,私钥是唯一能打开这把锁的钥匙。你把挂锁(公钥)装到服务器门上,之后只有手握钥匙(私钥)的人才能开门进去。
2.2 生成密钥对
在你的本地电脑(不是服务器)上执行:
bash
ssh-keygen -t ed25519 -C "your_email@example.com"
参数说明:
-
-t ed25519:使用Ed25519算法(比传统RSA更安全、更短、更快,现代系统已全面支持) -
-C:添加注释(通常写邮箱),方便识别这是哪把密钥
执行过程:
text
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/you/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
三次询问:
-
保存位置:直接回车,使用默认路径
-
密码短语:可设置一个额外密码保护私钥(即使私钥泄露也多一层防护),学习阶段可直接回车留空
-
确认密码短语
生成的文件:
text
~/.ssh/id_ed25519 # 私钥(绝不给任何人看)
~/.ssh/id_ed25519.pub # 公钥(可以公开,分发到服务器)
查看公钥内容:
bash
cat ~/.ssh/id_ed25519.pub
输出类似:ssh-ed25519 AAAAC3NzaC1l... your_email@example.com
2.3 将公钥安装到服务器
安装公钥最简单的方法是使用ssh-copy-id命令:
bash
ssh-copy-id user@服务器IP
系统会提示你输入一次服务器密码(最后一次),然后公钥就自动追加到服务器的~/.ssh/authorized_keys文件中。
手动安装方法 (如果ssh-copy-id不可用):
bash
# 1. 复制公钥内容
cat ~/.ssh/id_ed25519.pub
# 2. 登录服务器
ssh user@服务器IP
# 3. 在服务器上执行
mkdir -p ~/.ssh
echo "刚才复制的公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
exit
⚠️ 权限设置极其重要 :
.ssh目录必须是700(只有自己能读写执行),authorized_keys必须是600(只有自己能读写)。权限错一点,SSH就会拒绝密钥认证。
2.4 测试免密登录
bash
ssh user@服务器IP
如果直接进入了,不再提示密码------配置成功!
如果仍然要求密码,按以下顺序排查:
bash
# 在服务器上查看SSH日志
sudo tail -f /var/log/auth.log # Ubuntu/Debian
sudo tail -f /var/log/secure # CentOS/RHEL
# 检查权限(在服务器上)
ls -la ~/.ssh/
# drwx------ (700) → 正常
# -rw------- (600) → 正常
常见原因:权限错误、服务器未开启密钥认证(检查/etc/ssh/sshd_config中PubkeyAuthentication yes)。
2.5 禁用密码登录(提升安全性)
配置好密钥登录后,建议禁用密码登录以杜绝暴力破解:
bash
sudo vim /etc/ssh/sshd_config
修改或确认以下三项:
text
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
重启SSH服务:
bash
sudo systemctl restart sshd
关键提醒 :在确认密钥登录成功之前,不要关闭当前的SSH连接!另开一个终端窗口测试密钥登录,确认能连上后再关闭密码登录。否则一个配置错误可能导致自己永远进不去。
三、~/.ssh/config:多服务器管理神器
3.1 痛点:记不住IP
假设你管理着多台服务器:
text
阿里云ECS:root@47.xx.xx.xx
腾讯云CVM:ubuntu@129.xx.xx.xx
公司测试服:test@10.0.0.xx
家里的树莓派:pi@192.168.1.xx
每次连接都要回忆"这台是用root还是ubuntu?""IP是多少来着?"
3.2 创建配置文件
在本地创建~/.ssh/config文件:
bash
vim ~/.ssh/config
ini
Host aliyun
HostName 47.xx.xx.xx
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
Host tencent
HostName 129.xx.xx.xx
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Host testserver
HostName 10.0.0.xx
User test
Port 2222 # 如果修改了SSH端口
Host raspberry
HostName 192.168.1.xx
User pi
3.3 使用别名连接
配置完成后,只需要:
bash
ssh aliyun # 等同于 ssh root@47.xx.xx.xx
ssh tencent # 等同于 ssh ubuntu@129.xx.xx.xx
Shell自动补全也支持这些别名------输入ssh a按Tab,自动补全为ssh aliyun。
3.4 常用配置项
ini
Host myserver
HostName 192.168.1.100
User deployer
Port 2222
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60 # 每60秒发送心跳包,防止断线
Compression yes # 开启压缩(慢网络下提升体验)
ForwardAgent no # 不转发认证代理
通配符配置:可以定义一套默认配置,应用于所有主机:
ini
Host *
ServerAliveInterval 60
IdentityFile ~/.ssh/id_ed25519
ConnectTimeout 10
Host aliyun
HostName 47.xx.xx.xx
User root
所有主机自动启用60秒心跳、使用默认密钥、连接超时10秒。特定主机只需写差异化的HostName和User。
四、SCP与SFTP:文件传输方案对比
管理远程服务器时,不可避免地要在本地和服务器之间传文件。
4.1 SCP:简单直接的文件拷贝
scp(Secure Copy)用法和cp几乎一样,只是路径前面加上主机:。
bash
# 本地文件上传到服务器
scp report.txt aliyun:/home/user/
# 从服务器下载文件
scp aliyun:/var/log/nginx/error.log ./error_aliyun.log
# 上传整个目录(-r 递归)
scp -r /myproject/ aliyun:/home/user/
# 在服务器之间直接传输
scp aliyun:/data/backup.tar.gz tencent:/data/
常用参数:
-
-r:递归传输目录 -
-P 端口号:指定SSH端口(注意是大写P,与ssh命令的小写p不同) -
-C:传输时压缩(慢网络推荐)
4.2 SFTP:交互式文件管理器
sftp更像一个"FTP客户端",可以浏览、上传、下载、断点续传。
bash
sftp aliyun
进入SFTP交互界面后:
bash
# 远程服务器目录操作
ls # 列出远程目录
cd # 切换远程目录
pwd # 显示远程当前目录
# 本地目录操作
lls # 列出本地目录
lcd # 切换本地目录
lpwd # 显示本地当前目录
# 文件传输
put 本地文件 # 上传文件
get 远程文件 # 下载文件
put -r 本地目录/ # 上传整个目录
get -r 远程目录/ # 下载整个目录
# 断点续传
reput 本地文件 # 续传上传
reget 远程文件 # 续传下载
# 执行本地命令
!ls # 在本地执行ls
!df -h # 在本地执行df -h
# 退出
exit / quit
4.3 SCP vs SFTP:如何选择?
| 对比维度 | SCP | SFTP |
|---|---|---|
| 使用方式 | 一行命令 | 交互式会话 |
| 断点续传 | 不支持 | 支持(大文件传输利器) |
| 浏览远程目录 | 不支持 | 支持 |
| 适合场景 | 快速传单个文件、写脚本 | 大文件、需要浏览挑选文件 |
| 速度 | 较快 | 略慢(协议开销略大) |
选择建议:
-
明确知道文件路径,传完就完事 →
scp -
大文件传输(需要断点续传)→
sftp的reput/reget -
不知道文件在哪,需要边看边找 →
sftp交互浏览 -
传输进度显示 →
rsync -P(-P=--partial --progress,支持断点续传和进度条)
五、综合实战:搭建一个高效的管理环境
假设你刚接手管理3台服务器,目标是建立一个安全、高效的管理环境。
第一步:在本地生成密钥对
bash
ssh-keygen -t ed25519 -C "admin@mycompany.com"
第二步:将公钥分发到所有服务器
bash
ssh-copy-id root@aliyun.example.com
ssh-copy-id ubuntu@tencent.example.com
ssh-copy-id deployer@test.local
第三步:配置别名
编辑~/.ssh/config:
ini
Host *
ServerAliveInterval 60
IdentityFile ~/.ssh/id_ed25519
Host prod
HostName aliyun.example.com
User root
Host staging
HostName tencent.example.com
User ubuntu
Host test
HostName test.local
User deployer
Port 2222
第四步:测试免密登录
bash
ssh prod
ssh staging
ssh test
全部免密进入 → 配置成功。
第五步:在服务器上禁用密码登录(可选但强烈建议)
登录每台服务器,编辑/etc/ssh/sshd_config:
text
PasswordAuthentication no
然后sudo systemctl restart sshd。
第六步:日常使用
bash
# 登录生产服务器
ssh prod
# 上传配置文件到生产服务器
scp nginx.conf prod:/etc/nginx/
# 从生产服务器下载日志
scp prod:/var/log/nginx/error.log ./today_error.log
# 向测试服务器传输大量文件
sftp test
> put -r ./deploy_package/
> exit
六、本篇小结
SSH密钥认证:
-
ssh-keygen -t ed25519生成密钥对 -
ssh-copy-id user@host安装公钥 -
私钥权限必须是600,
.ssh目录权限700
多服务器管理:
-
~/.ssh/config定义主机别名 -
支持通配符配置默认选项
文件传输:
| 命令 | 适用场景 |
|---|---|
scp |
快速单次传输,写脚本 |
sftp |
大文件续传,交互式浏览 |
rsync |
增量同步,备份(后续章节详述) |
安全性提升:
-
启用密钥登录后,禁用密码登录
-
修改默认SSH端口可减少90%的自动化攻击
动手练习
bash
# 1. 生成一对ed25519密钥(如果还没有)
ssh-keygen -t ed25519
# 2. 查看公钥内容
cat ~/.ssh/id_ed25519.pub
# 3. 如果有云服务器或虚拟机,配置免密登录
ssh-copy-id user@你的服务器IP
# 4. 测试免密登录
ssh user@你的服务器IP
# 5. 创建~/.ssh/config,为你的服务器配别名
vim ~/.ssh/config
# 6. 练习scp传输
echo "test file" > test.txt
scp test.txt 你的别名:/tmp/
ssh 你的别名 "cat /tmp/test.txt"
# 7. 练习sftp
sftp 你的别名
> ls /tmp
> get /tmp/test.txt
> exit
七、下篇预告
有了便捷的SSH连接,跑在服务器上的服务随时可能出现各种问题------CPU飙升、内存泄漏、磁盘I/O异常。
下一篇我们将学习性能监控工具大盘点 ,综合运用vmstat、iostat、dstat等工具,快速识别系统性能瓶颈。你将掌握一套标准化的性能诊断流程,在接到"服务器好慢"的告警时不再茫然。
延伸思考 :SSH除了远程登录和文件传输,还有一个强大的功能------端口转发(SSH Tunneling)。它可以把远程服务器当作跳板,访问内网服务;也可以把本地端口映射到远程,临时暴露服务。这是运维和渗透测试中的重要技能。试试搜索"SSH端口转发 三种模式",了解更多。