在Linux和Unix系统中,通过SSH协议进行文件拷贝是远程管理和服务维护的常见需求,SSH(Secure Shell)提供了安全的加密传输通道,确保文件在传输过程中不被窃听或篡改,本文将详细介绍几种常用的SSH命令行文件拷贝方法,包括scp、rsync和sftp,并分析它们的适用场景和参数使用。
使用scp命令拷贝文件
scp(secure copy)是基于SSH协议的文件传输工具,语法简单,适合快速拷贝单个或多个文件、目录,其基本语法为:
scp [选项] 源文件 目标地址
本地文件拷贝到远程服务器
将本地文件拷贝到远程服务器的指定目录,需提供远程服务器的用户名、IP(或域名)及目标路径:
scp /path/to/local/file.txt username@remote_ip:/path/to/remote/directory/
将本地/home/user/docs/report.pdf
拷贝到远程服务器168.1.100
的/opt/docs/
目录下,使用用户名admin
:
scp /home/user/docs/report.pdf admin@192.168.1.100:/opt/docs/
远程服务器文件拷贝到本地
与上述操作相反,将远程文件拷贝到本地只需交换源文件和目标地址的位置:
scp username@remote_ip:/path/to/remote/file.txt /path/to/local/directory/
从远程服务器168.1.100
的/var/log/
目录下拷贝access.log
到本地/tmp/
目录:
scp admin@192.168.1.100:/var/log/access.log /tmp/
远程服务器之间拷贝文件
若需要在两台远程服务器之间直接传输文件,可在本地终端通过SSH代理转发,避免先下载到本地再上传:
scp -3 username1@remote_ip1:/path/to/file.txt username2@remote_ip2:/path/to/directory/
其中-3
参数强制通过本地主机转发(默认情况下,若两台远程服务器之间网络互通,可省略-3
直接传输)。
拷贝目录
若需拷贝整个目录,需添加-r
(递归)参数:
scp -r /path/to/local/directory/ username@remote_ip:/path/to/remote/
常用参数说明
参数 | 作用 |
---|---|
-r |
递归拷贝目录 |
-P |
指定SSH端口(默认22,需大写,避免与-p 冲突) |
-p |
保留文件的修改时间、访问时间和权限 |
-C |
启用压缩传输(适合大文件或网络较慢时) |
-v |
显示详细传输过程(调试用) |
-l |
限制传输速率(单位:Kbit/s,如-l 1000 限制为1Mbps) |
通过2222
端口传输文件并启用压缩:
scp -P 2222 -C /local/file.txt user@remote_ip:/remote/
使用rsync命令拷贝文件
rsync(remote sync)是一款更强大的文件同步工具,支持增量传输(仅同步变化的文件)、断点续传、权限保留等功能,适合大文件或频繁同步的场景,其基本语法为:
rsync [选项] 源文件 目标地址
本地同步到远程
rsync -avz /path/to/local/ username@remote_ip:/path/to/remote/
同步本地/home/user/project/
目录到远程服务器的/opt/project_backup/
:
rsync -avz /home/user/project/ admin@192.168.1.100:/opt/project_backup/
远程同步到本地
rsync -avz username@remote_ip:/path/to/remote/ /path/to/local/
增量同步与断点续传
rsync默认仅传输源文件和目标文件有差异的部分(通过文件大小、修改时间判断),大幅减少传输数据量,若传输中断,再次执行相同命令会自动续传(需配合--partial
参数显式保留未完成的传输文件):
rsync -avz --partial /large/file.iso user@remote_ip:/remote/
删除目标中多余的文件
使用--delete
参数可使目标目录与源目录完全一致(删除目标中存在但源中不存在的文件):
rsync -avz --delete /local/directory/ user@remote_ip:/remote/directory/
常用参数说明
参数 | 作用 |
---|---|
-a |
归档模式,相当于-rlptgoD (递归、保留权限、时间等) |
-v |
显示传输详情 |
-z |
启用压缩传输 |
-P |
显示传输进度,相当于--partial --progress (支持断点续传) |
--exclude |
排除特定文件(如--exclude "*.tmp" 排除临时文件) |
--bwlimit |
限制带宽(单位:KB/s,如--bwlimit 500 限制为500KB/s) |
排除.git
目录并限制带宽:
rsync -avz --exclude .git --bwlimit 1000 /local/project/ user@remote_ip:/remote/
使用sftp命令拷贝文件
sftp(SSH File Transfer Protocol)是基于SSH的安全文件传输协议,提供交互式命令行界面,支持类似FTP的文件操作(如上传、下载、删除、创建目录等),适合需要复杂操作的场景。
连接远程服务器
sftp username@remote_ip
连接成功后,会显示sftp>
提示符。
上传文件(本地→远程)
put /path/to/local/file.txt /path/to/remote/directory/
上传report.pdf
到远程服务器的/opt/docs/
:
put /home/user/docs/report.pdf /opt/docs/
下载文件(远程→本地)
get /path/to/remote/file.txt /path/to/local/directory/
下载远程的access.log
到本地/tmp/
:
get /var/log/access.log /tmp/
拷贝目录
需添加-r
参数:
put -r /local/directory/ /remote/directory/ get -r /remote/directory/ /local/directory/
常用交互命令
命令 | 作用 |
---|---|
ls |
列出远程当前目录文件 |
lls |
列出本地当前目录文件 |
cd |
切换远程目录 |
lcd |
切换本地目录 |
mkdir |
创建远程目录 |
lmkdir |
创建本地目录 |
rm |
删除远程文件 |
lrmdir |
删除本地目录 |
bye |
退出sftp |
交互式上传整个project
目录并排除node_modules
:
sftp admin@192.168.1.100 lcd /home/user/project mkdir -p /remote/project cd /remote/project put -r * bye
三种工具对比与选择
工具 | 核心功能 | 适用场景 |
---|---|---|
scp |
基于SSH的快速文件/目录拷贝 | 小文件、简单传输,无需增量同步 |
rsync |
增量同步、断点续传、权限保留 | 大文件、频繁同步、需保持目录一致性 |
sftp |
交互式文件管理(上传/下载/删除等) | 需要复杂操作(如批量处理文件、远程管理目录) |
相关问答FAQs
Q1: scp和rsync有什么区别?什么时候选择rsync而不是scp?
A: scp适合简单、一次性文件拷贝,语法简单,但每次传输完整文件,无法增量同步;rsync支持增量传输(仅同步变化部分)、断点续传、带宽限制等功能,适合大文件、频繁同步或需保持目录一致的场景(如备份代码目录),若仅需传输少量文件且无需断点续传,scp更简洁;若传输大文件或需定期同步,rsync效率更高。
Q2: 使用SSH拷贝文件时提示“Permission denied”,如何解决?
A: 常见原因及解决方法:
- 用户名错误:确认远程服务器用户名是否正确,如
admin@remote_ip
中的admin
是否存在。 - 密码错误或密钥未配置:若使用密码登录,确认输入密码正确;若使用SSH密钥,需确保本地公钥已添加到远程服务器的
~/.ssh/authorized_keys
文件中,且权限设置正确(~/.ssh
目录权限为700,authorized_keys
权限为600)。 - 目标目录权限不足:确认远程服务器目标目录的所属用户是否有写入权限,可通过
chmod
修改权限(如chmod 755 /remote/directory/
)。 - 防火墙或端口限制:确认远程服务器防火墙允许SSH端口(默认22)的访问,或使用
-P
参数指定正确的SSH端口。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/18393.html