【Linux从入门到精通】第19篇:SSH远程管理进阶——不只是输入密码

目录

一、引言:密码登录的三个痛点

二、SSH密钥对:更安全、更便捷的认证方式

[2.1 密码 vs 密钥:两种认证方式](#2.1 密码 vs 密钥:两种认证方式)

[2.2 生成密钥对](#2.2 生成密钥对)

[2.3 将公钥安装到服务器](#2.3 将公钥安装到服务器)

[2.4 测试免密登录](#2.4 测试免密登录)

[2.5 禁用密码登录(提升安全性)](#2.5 禁用密码登录(提升安全性))

三、~/.ssh/config:多服务器管理神器

[3.1 痛点:记不住IP](#3.1 痛点:记不住IP)

[3.2 创建配置文件](#3.2 创建配置文件)

[3.3 使用别名连接](#3.3 使用别名连接)

[3.4 常用配置项](#3.4 常用配置项)

四、SCP与SFTP:文件传输方案对比

[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
# 输入密码……

这种方式用久了,几个痛点会越来越明显:

  1. 每次都要输密码,密码短了不安全,长了手酸

  2. 多台服务器要记多个IP和密码,脑容量告急

  3. 密码可以被暴力破解,你的服务器时刻在被全世界的扫描器试探

今天我们要解决的,就是这三个问题。目标很明确:敲几个字母就能安全登录任意一台服务器,还能方便地传文件

二、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: 

三次询问:

  1. 保存位置:直接回车,使用默认路径

  2. 密码短语:可设置一个额外密码保护私钥(即使私钥泄露也多一层防护),学习阶段可直接回车留空

  3. 确认密码短语

生成的文件:

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_configPubkeyAuthentication 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

  • 大文件传输(需要断点续传)→ sftpreput/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异常。

下一篇我们将学习性能监控工具大盘点 ,综合运用vmstatiostatdstat等工具,快速识别系统性能瓶颈。你将掌握一套标准化的性能诊断流程,在接到"服务器好慢"的告警时不再茫然。


延伸思考 :SSH除了远程登录和文件传输,还有一个强大的功能------端口转发(SSH Tunneling)。它可以把远程服务器当作跳板,访问内网服务;也可以把本地端口映射到远程,临时暴露服务。这是运维和渗透测试中的重要技能。试试搜索"SSH端口转发 三种模式",了解更多。

相关推荐
煜3641 小时前
环境变量与虚拟内存
linux·运维·服务器
脆皮炸鸡7551 小时前
Linux~~基础IO
linux·运维·服务器·经验分享·算法·学习方法
众少成多积小致巨2 小时前
Android 初始化语言入门
android·linux·c++
思麟呀2 小时前
在Select的基础上学习poll
linux·网络·学习·tcp/ip
喜欢吃燃面2 小时前
Linux 信号保存机制深度解析:从内核数据结构到进程状态管理
linux·运维·数据结构·学习
云边有个稻草人2 小时前
【Linux系统】第十节—【进程概念】环境变量 | 详解,包会!
linux·环境变量·命令行参数·环境变量的特性·获取linux环境变量的方法·环境变量path·通过代码获取linux环境变量
IMPYLH2 小时前
Linux 的 stdbuf 命令
linux·运维·服务器·bash
郝学胜-神的一滴2 小时前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix
keyipatience2 小时前
12.GDB调试技巧与计算机体系结构解析
linux·运维·服务器