SCP指令使用详解

SCP指令使用详解

SCP(Secure Copy Protocol)是基于SSH协议的安全文件传输命令,用于在本地主机与远程主机之间,或者两个远程主机之间安全地复制文件和目录。

基本语法

1
scp [选项] 源文件 目标位置

基本格式说明

  • 本地到远程:scp local_file user@remote_host:remote_path
  • 远程到本地:scp user@remote_host:remote_file local_path
  • 远程到远程:scp user1@host1:file user2@host2:path

常用选项参数

基础选项

选项 说明
-r 递归复制整个目录
-p 保留文件的修改时间、访问时间和权限
-v 显示详细的传输过程
-q 静默模式,不显示传输进度
-C 启用压缩传输

高级选项

选项 说明
-P port 指定SSH端口号
-i identity_file 指定私钥文件
-o ssh_option 传递SSH选项
-l limit 限制传输带宽(Kbit/s)
-S program 指定加密程序

实用示例

1. 基本文件传输

1
2
3
4
5
6
7
8
# 上传单个文件到远程服务器
scp /local/file.txt user@192.168.1.100:/remote/path/

# 从远程服务器下载文件
scp user@192.168.1.100:/remote/file.txt /local/path/

# 重命名文件同时传输
scp /local/old_name.txt user@192.168.1.100:/remote/new_name.txt

2. 目录传输

1
2
3
4
5
6
7
8
# 上传整个目录
scp -r /local/directory/ user@192.168.1.100:/remote/path/

# 下载整个目录
scp -r user@192.168.1.100:/remote/directory/ /local/path/

# 保留文件属性的目录传输
scp -rp /local/directory/ user@192.168.1.100:/remote/path/

3. 高级用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定非标准SSH端口
scp -P 2222 file.txt user@host:/path/

# 使用私钥认证
scp -i ~/.ssh/private_key file.txt user@host:/path/

# 启用压缩传输大文件
scp -C large_file.zip user@host:/path/

# 限制传输带宽为1000 Kbit/s
scp -l 1000 file.txt user@host:/path/

# 显示详细传输过程
scp -v file.txt user@host:/path/

4. 批量传输

1
2
3
4
5
6
7
8
9
# 传输多个文件
scp file1.txt file2.txt file3.txt user@host:/remote/path/

# 使用通配符传输
scp *.txt user@host:/remote/path/
scp /local/path/*.log user@host:/remote/logs/

# 传输指定类型的文件
scp /local/path/*.{jpg,png,gif} user@host:/remote/images/

远程主机间传输

1
2
3
4
5
# 在两个远程主机间直接传输文件
scp user1@host1:/path/file.txt user2@host2:/path/

# 通过本地主机中转(3-way copy)
scp -3 user1@host1:/path/file.txt user2@host2:/path/

配置文件优化

SSH配置文件 (~/.ssh/config)

1
2
3
4
5
6
Host myserver
HostName 192.168.1.100
User myuser
Port 2222
IdentityFile ~/.ssh/myserver_key
Compression yes

使用配置后的简化命令:

1
scp file.txt myserver:/remote/path/

安全注意事项

1. 密钥管理

1
2
3
4
5
6
7
8
# 生成SSH密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 复制公钥到远程服务器
ssh-copy-id user@remote_host

# 设置私钥权限
chmod 600 ~/.ssh/private_key

2. 主机验证

1
2
3
4
5
# 严格主机密钥检查
scp -o StrictHostKeyChecking=yes file.txt user@host:/path/

# 首次连接时添加主机密钥
scp -o StrictHostKeyChecking=ask file.txt user@host:/path/

3. 连接安全

1
2
3
4
5
6
7
8
# 禁用密码认证,仅使用密钥
scp -o PasswordAuthentication=no file.txt user@host:/path/

# 设置连接超时
scp -o ConnectTimeout=30 file.txt user@host:/path/

# 使用特定的加密算法
scp -o Ciphers=aes256-ctr file.txt user@host:/path/

性能优化技巧

1. 传输优化

1
2
3
4
5
6
7
8
# 启用压缩(适用于文本文件)
scp -C documents.tar user@host:/path/

# 调整SSH连接复用
scp -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p file.txt user@host:/path/

# 批量传输时使用tar
tar czf - /local/directory/ | ssh user@host "cd /remote/path && tar xzf -"

2. 并行传输

1
2
3
4
5
6
7
8
9
# 使用rsync替代scp进行大量文件传输
rsync -avz -e ssh /local/path/ user@host:/remote/path/

# 分割大文件并行传输
split -b 100M large_file.zip chunk_
for chunk in chunk_*; do
scp "$chunk" user@host:/remote/path/ &
done
wait

故障排除

常见错误及解决方案

  1. Permission denied (publickey)

    1
    2
    3
    4
    5
    # 检查SSH代理
    ssh-add -l

    # 添加私钥到SSH代理
    ssh-add ~/.ssh/private_key
  2. Host key verification failed

    1
    2
    3
    4
    5
    # 移除旧的主机密钥
    ssh-keygen -R hostname

    # 重新连接并接受新密钥
    ssh user@hostname
  3. Connection timed out

    1
    2
    3
    4
    5
    # 检查网络连接
    ping hostname

    # 测试SSH连接
    ssh -v user@hostname

调试模式

1
2
3
4
5
6
7
8
# 启用详细输出
scp -v file.txt user@host:/path/

# 启用调试模式
scp -vvv file.txt user@host:/path/

# 检查SSH配置
ssh -F /dev/null -v user@host

最佳实践

1. 安全实践

  • 始终使用密钥认证而非密码认证
  • 定期更换SSH密钥
  • 使用非标准SSH端口
  • 启用防火墙和fail2ban
  • 定期更新SSH服务

2. 效率实践

  • 对于大量小文件,使用tar打包后传输
  • 利用SSH连接复用减少握手开销
  • 根据网络条件选择是否启用压缩
  • 使用rsync进行增量同步

3. 自动化脚本示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# SCP备份脚本

SOURCE_DIR="/local/backup"
REMOTE_HOST="backup-server"
REMOTE_DIR="/remote/backup"
DATE=$(date +%Y%m%d)

# 创建压缩包
tar czf "backup_${DATE}.tar.gz" "$SOURCE_DIR"

# 传输到远程服务器
scp -C "backup_${DATE}.tar.gz" "$REMOTE_HOST:$REMOTE_DIR/"

# 清理本地临时文件
rm "backup_${DATE}.tar.gz"

echo "备份完成: backup_${DATE}.tar.gz"

总结

SCP是一个功能强大且安全的文件传输工具,掌握其各种选项和用法可以大大提高工作效率。在使用过程中,要特别注意安全配置,合理使用各种优化选项,并根据实际需求选择最适合的传输方式。

对于日常运维工作,建议结合SSH配置文件、密钥认证和自动化脚本,构建高效安全的文件传输工作流程。


SCP指令使用详解
http://www.mowu.xyz/2025/01/27/scp-command-guide/
作者
莫无
发布于
2025年1月27日
许可协议