把本地文件传到服务器,或者从服务器拉个日志回来,不用另开 FTP 工具,一条 scp命令就能走 ssh 通道完成,前提是两台机器 ssh 能通。
基本写法
scp ./app.tar.gz root@192.168.1.10:/opt/backup/scp root@192.168.1.10:/var/log/syslog ./冒号前是机器,冒号后是路径,本地和远程位置对调,就是上传和下载两个方向。目标写目录名就是保持原名放进去,写文件名就是改名传输。拷目录加 -r 参数。端口不是 22 时必须用大写 -P 指定,注意 scp 里小写 -p 的含义是保留文件时间权限,跟 ssh 的 -p 不是一回事,写错就传不到。
scp -r ./logs root@192.168.1.10:/opt/scp -P 2222 root@192.168.1.10:/opt/data.csv ./几个实用细节
- 加 -C 走压缩传输,文本和日志类大文件能省不少流量,图片视频基本没收益。
- 路径带空格时转义麻烦,简单粗暴的办法是先改名再传。
- 新版 OpenSSH 的 scp 底层已改走 SFTP 协议,连老机器报协议错误时加 -O 回退旧协议。
- 用密钥登录时加 -i 指定私钥文件,写法和 ssh 一致。
- 带宽紧张时加 -l 限制速率,单位是 Kbit/s,别把专线占满。
和 rsync 怎么分
一次性拷文件,scp命令直接了当,Linux 机器上到处都有,不挑环境。要反复同步目录、断点续传、只传差异,rsync 更合适,它的增量算法会跳过没变化的文件,批量定时同步一般选 rsync 配合计划任务。机器上没装 rsync 的话,包管理器一条命令就能补上,依赖很少。
提醒一句:scp 默认直接覆盖目标同名文件,没有回收站可后悔。覆盖之前先 ls 看一眼目标目录,传完对一下文件大小,大文件再比对校验值更稳,这几个习惯关键时刻能救急。