第 7 章 · 06 远程登录与传输: 、 、 本节摘要: 是远程登录与安全传输的事实标准——几乎所有服务器管理都靠它。本节要讲清三件事:一是 的密钥认证为什么比密码安全(以及怎么用 配置免密登录);二是 与 的差别(单次拷贝 vs 增量同步);三是 防的中间人攻击。还要顺带介绍 端口转发这个进阶能力——它是穿透防火墙、访问内网服务的「瑞士军刀」。理解 ssh,你就拥有了远程管理服务器的基础能力。 内容来源:综合 / 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 登录远程服务器,理解它默认走 22 端口、全程加密。 用 生成密钥对,把公钥上传到服务器的 ,实现免密登录。 解释密钥认证为什么比密码安全(私钥不离本机、不可暴力破解)。
ssh、scp、rsync本节摘要:
ssh是远程登录与安全传输的事实标准——几乎所有服务器管理都靠它。本节要讲清三件事:一是ssh的密钥认证为什么比密码安全(以及怎么用ssh-keygen配置免密登录);二是scp与rsync的差别(单次拷贝 vs 增量同步);三是known_hosts防的中间人攻击。还要顺带介绍ssh端口转发这个进阶能力——它是穿透防火墙、访问内网服务的「瑞士军刀」。理解 ssh,你就拥有了远程管理服务器的基础能力。
内容来源:综合
ssh/scp知识整理,套用体系化模板。
阅读完本节,你应当能够:
ssh user@host 登录远程服务器,理解它默认走 22 端口、全程加密。ssh-keygen 生成密钥对,把公钥上传到服务器的 ~/.ssh/authorized_keys,实现免密登录。known_hosts 的作用:防止中间人攻击(首次连接记录指纹,后续比对)。scp 单次拷贝文件、用 rsync -avz 增量同步(呼应第 4 章)。ssh 端口转发的概念(本地转发、远程转发),知道它是穿透内网的工具。早期的远程登录工具(telnet、rlogin)用明文传输——你敲的密码、传输的数据,在网络上任何一跳都能被嗅探。这在互联网早期还行,现在完全不可接受。
ssh(Secure Shell)的出现就是为了解决这个问题:全程加密——登录握手、密码/密钥认证、之后的所有交互数据,全部加密传输。即使流量被截获,攻击者也看不到内容。
ssh 的两大认证方式:
密钥认证比密码安全得多:私钥不离开你的机器,攻击者无法通过网络嗅探或暴力破解得到它。生产服务器通常禁用密码、只允许密钥认证。
# 步骤 1: 本机生成密钥对(一路回车, 或设个 passphrase 更安全) ssh-keygen -t ed25519 # 生成 ~/.ssh/id_ed25519(私钥) 与 .pub(公钥) # ed25519 比 rsa 更现代更短, 推荐; 若兼容老系统用 rsa -b 4096 # 步骤 2: 把公钥上传到服务器(一条命令搞定) ssh-copy-id user@server # 自动追加公钥到服务器的 ~/.ssh/authorized_keys # 步骤 3: 之后 ssh user@server 不再问密码 ssh user@server
💡 技巧:
ssh-copy-id是配置免密登录最省事的方式。如果服务器没装这个命令,手动:把本机~/.ssh/id_ed25519.pub的内容,追加到服务器的~/.ssh/authorized_keys文件里(注意是追加>>,不是覆盖>)。
ssh user@192.168.1.10 # 用 user 登录该 IP ssh user@server -p 2222 # -p 指定端口(默认 22) ssh -i ~/.ssh/special_key user@server # -i 指定私钥(多密钥场景)
scp file.txt user@server:/tmp/ # 本地 → 远程 scp user@server:/var/log/app.log ./ # 远程 → 本地 scp -r localdir user@server:/tmp/ # -r 递归拷目录 scp -P 2222 file user@server:/tmp/ # -P 大写, 指定端口(注意与 ssh 的 -p 区别!)
scp 适合「一次性拷贝」。它每次都全量传,文件大或反复传时低效。
rsync -avz localdir/ user@server:/backup/ # 本地 → 远程增量同步 # -a 保留权限/时间等, -v 详细, -z 传输时压缩
rsync 走 ssh 通道,但只传差异部分,适合「反复同步」或大文件。详见第 4 章。
# 本地转发: 把远程的 3306(mysql) 映射到本机 13306 ssh -L 13306:localhost:3306 user@server # 之后本机连 localhost:13306 = 连服务器的 mysql # 远程转发: 把本机的服务暴露给远程(穿透 NAT, 反向) ssh -R 8080:localhost:80 user@server
端口转发是 ssh 的「隐藏大招」——它能穿透防火墙、安全访问内网服务、做临时隧道。日常排查也常用(如把内网数据库端口转到本地用图形工具连)。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
这是 known_hosts 在保护你:服务器的指纹变了,可能被中间人攻击,或(更常见的)服务器重装了系统、换了密钥。
ssh-keygen -R server # 删除旧指纹记录 ssh user@server # 重新接受新指纹
确认服务器确实换过密钥/重装过才能这么做,否则可能是真的中间人攻击。
chmod 700 ~/.ssh # .ssh 目录必须 700 chmod 600 ~/.ssh/authorized_keys # authorized_keys 必须 600 chmod 600 ~/.ssh/id_ed25519 # 私钥必须 600
ssh 对权限极其严格——.ssh 目录或密钥文件权限过松(对其他用户可读),ssh 会拒绝使用(防被窃)。权限不对是「配了密钥还问密码」的头号原因。
-P(端口)是大小,ssh 的 -p 是小写ssh -p 2222 server # ssh 小写 -p scp -P 2222 file server:/tmp # scp 大写 -P
两者参数大小写相反,极易写错。这是历史遗留,只能记。
scp big.iso user@server:/tmp/ # 中断了只能重头来 rsync -avz --partial big.iso user@server:/tmp/ # rsync 支持断点, 大文件用 rsync
scp 一次失败就重来;大文件或不稳定网络用 rsync --partial(支持续传)。
ssh-keygen 生成密钥 → ssh-copy-id 上传公钥 → 直接 ssh user@host。known_hosts 防中间人攻击:首次记录指纹,变了会警告(服务器重装后用 ssh-keygen -R 清旧记录)。.ssh 700、authorized_keys/私钥 600,权限不对是「配了密钥还问密码」的头号原因。ssh -p(小写)vs scp -P(大写)指定端口。下一节是本章的终极武器——tcpdump,当所有上层工具都失效时,直接抓数据包看真相。