家人们!还在为跨服务器传文件反复输密码感到崩溃吗?还在为集群搭建时的登录认证问题抓耳挠腮吗?今天飞哥带来两个「运维神技能」——scp
远程拷贝和SSH 密钥对免密登录,直接把服务器操作效率拉满,让你从此告别手动输入密码的痛苦!全程干货 + 人话讲解,新手也能轻松拿捏,建议收藏后跟着实操~
一、scp 远程拷贝:跨服务器文件传输的「魔法指令」
1. scp 是什么?比 U 盘更酷的跨机传输
想象一下:你在本地写好的代码,想传到远程服务器,不用 U 盘插拔,不用 FTP 工具繁琐操作,更不用压缩后发邮件 —— 只需一条命令,文件就能「瞬间移动」到目标服务器!
scp(Secure Copy)就是基于 SSH 协议的加密传输工具,专门解决跨服务器文件传输问题,支持本地与远程、远程与远程之间的文件 / 文件夹互传,而且全程加密,安全又高效,堪称程序员的「跨机复制粘贴」神器!
2. 3 大核心场景 + 保姆级命令演示
📤 场景 1:本地文件 / 文件夹→远程服务器(上传)
# 单文件上传(把本地hosts文件传到bigdata01的/etc/目录)
scp /etc/hosts root@bigdata01:/etc/
# 执行后输入远程服务器密码,等待进度条跑完即可,传输过程清晰可见!
# 文件夹上传(必加 `-r` 参数,否则会报错!)
scp -r /opt/modules root@bigdata01:/opt/
💡 记忆口诀:传文件像本地cp
,传文件夹加 -r
(r
代表递归传输,文件夹内容层层复制)。
📥 场景 2:远程服务器→本地(下载)
# 下载远程服务器的网卡配置文件到当前目录(后续修改配置超方便!)
scp root@bigdata01:/etc/sysconfig/network-scripts/ifcfg-ens33 ./
# 下载整个日志目录到本地备份(加 `-r` 递归下载)
scp -r root@bigdata01:/var/log ./log_backup
💡 实用技巧:下载后用 ls
命令查看当前目录,文件 / 文件夹秒级到位!
🌐 场景 3:远程服务器→远程服务器(A→B)
scp root@bigdata01:/etc/hosts root@bigdata02:/etc/
# 原理:先从A服务器下载到本地中转,再上传到B服务器,需输入两次密码
💡 进阶操作:如果 A 和 B 服务器在同一网络,可通过 -3
参数指定中转主机(适合资深运维,新手先掌握基础即可)。
3. 高阶玩法:让你快人一步的「偷懒技巧」
✅ IP 地址直连:专治主机名解析失败
如果遇到「无法解析主机名」的报错(比如bigdata02
找不到),直接用 IP 地址代替,简单粗暴零失误:
scp /etc/hosts root@192.168.32.128:/etc/
# 先用 `ifconfig` 或 `ip addr` 查看目标服务器IP,复制粘贴即可!
✅ $PWD 路径魔法:少打一半字的懒人福音
先进入本地目标目录,再用 $PWD
自动填充当前路径,告别冗长路径输入:
cd /etc/
scp hosts root@bigdata01:$PWD
# 等价于 `scp /etc/hosts root@bigdata01:/etc/`,但输入量直接减半!
💡 原理:$PWD
是 Linux 内置变量,会自动替换为当前工作目录(比如 /etc
),敲命令更丝滑~
✅ 指定 SSH 端口:非 22 端口服务器必备
如果远程服务器修改了 SSH 端口(比如改为 2222),加 -P
参数指定端口(注意大写!):
scp -P 2222 /etc/hosts root@192.168.32.128:/etc/
# 端口号紧跟 `-P`,无需空格,例:`-P2222` 或 `-P 2222` 都正确
4. 避坑指南:99% 的人会踩的 3 个坑
❌ 坑 1:传文件夹忘记加 -r
,报错「Not a directory」
💥 原因:scp 默认只传文件,文件夹需显式声明递归传输
✅ 解决:永远记住「文件夹传输必带 -r
」,养成习惯:
scp -r my_project root@server:/var/www/
❌ 坑 2:主机名无法识别,提示「unknow host」
💥 原因:本地或远程服务器的 /etc/hosts
未配置 IP 映射
✅ 解决:
vi /etc/hosts
# 添加一行:192.168.32.129 bigdata02 (IP和主机名一一对应,多个服务器用空格分隔)
❌ 坑 3:远程目录权限不足,无法写入
💥 原因:普通用户对系统目录(如 /etc
)无写入权限
✅ 解决:
- 用 root 用户传输:
scp file root@server:path
- 或在远程服务器用
sudo
提升权限:ssh server 'sudo mv file /target/path'
-
二、SSH 免密登录:让服务器之间「无缝互访」的魔法钥匙
1. 为什么必须掌握?集群部署的「核心刚需」
当你搭建 Hadoop、Kafka 等分布式集群时,主节点需要无密码访问所有从节点,否则每次启动都要手动输入密码,效率极低!SSH 免密登录通过密钥对认证,让服务器之间「自由串门」,是自动化部署和集群管理的必备技能。
2. 手把手教学:3 步实现单向免密(bigdata01→bigdata02)
-
① 生成密钥对(在发起方 bigdata01 上操作)
-
ssh-keygen -t rsa # 一路按回车,使用默认路径和密码(密钥生成到 /root/.ssh/ 目录): # ✔️ id_rsa:私钥(相当于你的私人钥匙,绝对不能泄露!) # ✔️ id_rsa.pub:公钥(相当于门锁的备用钥匙,可以安全地交给目标服务器)
💡 灵魂提问:为什么需要两个文件?
👉 公钥和私钥是「加密解密搭档」:公钥加密的内容只能用对应的私钥解密,反之亦然,利用这种特性实现安全认证。 -
② 传输公钥到目标服务器(bigdata02)
-
ssh-copy-id bigdata02 # 输入bigdata02的root密码后,工具会自动将公钥追加到: # /root/.ssh/authorized_keys (目标服务器的「信任名单」文件)
💡 底层操作:无需手动复制粘贴,一条命令搞定,比手动编辑文件更安全高效!
-
③ 验证免密登录(见证奇迹的时刻!)
-
ssh bigdata02 # 直接登录成功,不再弹出密码输入框! # 退出登录:exit
3. 特殊场景:让服务器免密登录自己
-
# 主节点bigdata01需要免密登录自身(Hadoop等框架启动时需要) ssh-copy-id bigdata01
💡 为什么?:集群框架启动时会默认访问本地主机,免密登录避免循环认证,确保服务正常启动。
-
4. 原理图解:3 步看懂密钥对认证流程(附人话解释)
-
1. 目标服务器(bigdata02)生成一段随机字符串「hi there」,用bigdata01的公钥加密,变成乱码「#$%^&*」 2. bigdata01收到乱码后,用自己的私钥解密,得到原始字符串「hi there」,并回传给bigdata02 3. bigdata02对比两次的字符串,发现一致,于是放行登录(全程不传输密码,安全性MAX!)
5. 注意事项:细节决定成败
- 单向性:当前是 bigdata01→bigdata02 免密,若要双向免密,需在 bigdata02 上重复①②步骤,生成并传输它的公钥到 bigdata01
- 权限设置:确保
authorized_keys
文件权限为600
(只有所有者可读写),否则免密会失效: -
chmod 600 /root/.ssh/authorized_keys
- 多节点集群:如果有 N 台从节点,只需在主节点生成一次密钥,然后用
ssh-copy-id
依次传给所有从节点,一劳永逸! -
三、飞哥总结:两大工具的「黄金使用法则」
📦 scp 远程拷贝法则
- 文件传输:单文件直接传,文件夹加
-r
,跨远程用 IP 或主机名(优先 IP,兼容性更强) - 路径规范:目标路径统一格式「用户名 @主机:绝对路径」,例如
root@192.168.32.128:/etc/hosts
- 安全第一:传输敏感文件(如数据库配置、私钥)必须用 scp,拒绝明文传输工具(如 FTP)
- 密钥对本质:公钥公开给目标服务器,私钥自己妥善保管,绝不泄露(泄露私钥 = 服务器大门敞开!)
- 集群必备:搭建分布式框架前,先配置好主从节点免密登录,避免启动时卡壳
- 权限检查:设置完免密后,第一时间用
ssh 目标主机
测试,失败则检查authorized_keys
权限和内容 -
四、终极速查表:常用命令一键复制(建议截图保存)
-
掌握这两个技能,服务器间的文件传输和登录操作将变得无比丝滑,从此告别手动输入密码的低效工作!无论是日常开发还是集群部署,都能节省大量时间,把精力聚焦在更有价值的代码上~ 觉得有用的话,点赞收藏走一波,评论区留言你在运维中遇到的难题,飞哥下次专门出教程帮你解决! 🚀操作场景 scp 命令示例 免密登录命令示例 本地→远程传文件 scp 本地文件 用户名@主机:远程路径
ssh-keygen -t rsa
(生成密钥对)本地→远程传文件夹 scp -r 本地文件夹 用户名@主机:远程路径
ssh-copy-id 目标主机
(传公钥)远程→本地下载文件 scp 用户名@主机:远程文件 本地路径
ssh 目标主机
(验证免密登录)指定 SSH 端口 scp -P 端口号 文件 用户名@主机:路径
chmod 600 ~/.ssh/authorized_keys
(设权限)服务器免密登录自己 —— ssh-copy-id localhost