使用 SCP 将文件夹和文件从远程复制到本地

使用 SCP 将文件夹和文件从远程复制到本地
Shell

使用 SCP 传输文件:快速指南

安全复制协议 (SCP) 是一种用于在远程和本地计算机之间传输文件和目录的便捷工具。如果您经常使用 SSH 访问服务器,那么了解如何有效地复制文件夹和文件对于管理数据至关重要。

在本指南中,我们将探讨如何使用 SCP 复制名为 富 到您的本地计算机,特别是 /home/用户/桌面。本教程假设您对 SSH 和终端命令有基本的了解。

命令 描述
scp -r 以递归方式安全地将目录及其内容从远程主机复制到本地计算机。
paramiko.SSHClient() 使用Python创建SSH客户端实例以方便SSH操作。
scp.get() 使用Python中的SCP客户端将文件或目录从远程主机检索到本地路径。
ansible.builtin.fetch Ansible 模块用于将文件从远程计算机获取到本地计算机。
flat: no Ansible 获取模块中的选项可在复制时维护目录结构。
validate_checksum: yes 通过验证其校验和来确保复制文件的完整性。

了解 SCP 文件传输

提供的 shell 脚本演示了如何使用 scp 将文件夹从远程服务器复制到本地计算机。首先,它定义远程用户名、主机和目录以及本地目录的变量。然后该脚本执行 scp -r 命令,代表“安全复制”并允许递归复制目录。语法 ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR} 指定源路径,同时 ${LOCAL_DIR} 指定本地计算机上的目标路径。该脚本通过回显成功消息来结束。

Python 脚本实现了相同的目标,但使用了 paramiko 处理 SSH 连接的库和 scp 库来执行安全复制。导入必要的库后,它会为远程和本地目录设置变量。该脚本使用以下命令创建 SSH 客户端实例 paramiko.SSHClient() 并使用以下命令连接到远程服务器 connect 方法。然后它创建一个 SCP 客户端实例 SCPClient(ssh.get_transport()) 并使用 scp.get 方法将远程目录复制到本地计算机。最后,脚本关闭 SCP 客户端。

使用 Ansible 自动进行文件传输

Ansible playbook 是将文件从远程服务器复制到本地计算机的另一种方法。 Ansible 使用基于 YAML 的配置来定义任务。该剧本首先命名任务并指定主机,在本例中为 localhost。然后它定义一个任务来使用以下命令获取远程文件夹 ansible.builtin.fetch 模块。这 src 属性指定远程目录,而 dest 属性指定本地目的地。这 flat: no 选项确保在复制过程中保持目录结构。

fail_on_missing: yes 选项确保如果源目录不存在,剧本将会失败,从而提供了额外的错误处理层。此外, validate_checksum: yes 选项通过检查其校验和来验证复制文件的完整性,确保文件已正确传输且没有损坏。此方法对于以一致且可靠的方式自动执行重复文件传输任务特别有用。

使用SCP将文件从远程传输到本地

用于 SCP 文件传输的 Shell 脚本

# Copying a remote folder to local directory using SCP
#!/bin/bash
# Define variables
REMOTE_USER="your_username"
REMOTE_HOST="your_server_address"
REMOTE_DIR="/path/to/remote/folder"
LOCAL_DIR="/home/user/Desktop"
# Execute SCP command
scp -r ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR} ${LOCAL_DIR}
echo "Folder copied successfully to ${LOCAL_DIR}"

使用 Python 自动化 SCP 文件传输

用于自动 SCP 传输的 Python 脚本

import paramiko
from scp import SCPClient
# Define variables
remote_user = "your_username"
remote_host = "your_server_address"
remote_dir = "/path/to/remote/folder"
local_dir = "/home/user/Desktop"
# Create SSH client and connect
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(remote_host, username=remote_user)
# Create SCP client and transfer files
scp = SCPClient(ssh.get_transport())
scp.get(remote_dir, local_dir, recursive=True)
scp.close()

使用 Ansible 管理 SCP 文件传输

用于 SCP 文件传输的 Ansible Playbook

--- 
- name: Copy folder from remote to local
  hosts: localhost
  tasks:
    - name: Copy remote folder to local directory
      ansible.builtin.fetch:
        src: "/path/to/remote/folder"
        dest: "/home/user/Desktop"
        flat: no
        fail_on_missing: yes
        validate_checksum: yes

高级 SCP 技术和注意事项

除了基本的文件传输之外,SCP 还提供了多种高级功能和选项,对于更复杂的任务来说非常有用。其中一项功能是能够使用通配符指定多个文件或目录。例如,使用 scp user@remote_host:/path/to/files/*.txt /local/path/ 会将所有 .txt 文件从远程目录复制到本地目录。在处理大量文件时,这可以节省时间并简化工作流程。

另一个有用的功能是 17 号 选项,允许您指定 SCP 连接的端口号。如果您的 SSH 服务在非标准端口上运行,这尤其方便。例如,使用 scp -P 2222 user@remote_host:/path/to/file /local/path/ 将连接到端口 2222 上的远程主机。此外, 19 号 选项可用于在传输过程中压缩数据,这可以显着减少大文件的传输时间。这是通过添加来实现的 -C 到 SCP 命令,例如 scp -C user@remote_host:/path/to/largefile /local/path/

有关 SCP 文件传输的常见问题

  1. 如何使用 SCP 复制整个目录?
  2. 使用命令 scp -r user@remote_host:/path/to/remote/dir /local/path/ 递归复制目录。
  3. 我可以使用 SCP 从特定端口复制文件吗?
  4. 是的,您可以指定端口 scp -P port_number user@remote_host:/path/to/file /local/path/
  5. 如何使用 SCP 复制多个文件?
  6. 使用通配符,例如 scp user@remote_host:/path/to/files/*.txt /local/path/ 复制多个文件。
  7. SCP传输期间是否可以压缩文件?
  8. 是的,添加 19 号 SCP 命令的选项,例如 scp -C user@remote_host:/path/to/file /local/path/
  9. 如何使用 SCP 处理大文件传输?
  10. 使用 -C 选项来压缩文件,并确保稳定的连接以防止中断。
  11. SCP 可以通过脚本实现自动化吗?
  12. 是的,您可以使用 shell 脚本、Python 脚本或 Ansible playbook 来自动执行 SCP 文件传输。
  13. SCP传输失败怎么办?
  14. 检查网络连接,确保路径和权限正确,并验证 SSH 配置。
  15. SCP 可以恢复中断的传输吗?
  16. 不,SCP 不支持恢复传输。考虑使用 rsync 进行可恢复传输。
  17. 如何在 SCP 传输过程中确保文件完整性?
  18. 使用 validate_checksum Ansible 中的选项或在传输后手动验证校验和。

关于 SCP 转移的最终想法:

掌握使用 SCP 在远程和本地计算机之间进行文件传输是高效服务器管理的一项基本技能。通过利用 shell 脚本、Python 脚本和 Ansible playbook,您可以自动化并简化这些任务,从而节省时间并减少错误。递归复制、端口规范和数据压缩等高级选项进一步增强了 SCP 的多功能性。无论是日常操作还是大规模数据迁移,了解这些技术都可以确保文件传输安全可靠。