windows与linux服务器之间通过scp快速并行的文件传输

在大数据时代,有很多数据集包含很多小文件,这些小文件在不同设备之间的传输是一个很大的问题
sftp在传输小文件时,往往很慢。因此下面通过scp进行并行的文件传输,速度提升20倍左右。

首先需要在windows安装openSSH

基于PowerShell的OpenSSH:https://github.com/PowerShell/Win32-OpenSSH/releases
安装步骤
1、进入链接下载最新 OpenSSH-Win64.zip(64位系统),解压至D:\DEVELOPEWORKS\OpenSSH-Win64
2、打开cmd,cd进入D:\DEVELOPEWORKS\OpenSSH-Win64(安装目录),执行命令:

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1
# 设置服务自启动
sc config sshd start= auto
 
# 启动sshd服务
net start sshd

参考教程
https://blog.csdn.net/boonya/article/details/102811966

然后使用ssh秘钥连接linux服务器(为了并行scp,可以不用重复输入密码)

1. 生成SSH密钥对(如果还没有):

ssh-keygen -t rsa

在生成SSH密钥时,你会被要求输入一些信息。以下是每个步骤的解释:

Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa):

这里系统默认会将密钥保存到C:\Users\Administrator/.ssh/id_rsa。通常情况下,你可以直接按回车键使用默认路径。如果你指定了id_rsa.pub作为文件名,系统实际上会生成id_rsa.pub.pub,因为它会自动在文件名后面添加.pub。
建议:直接按回车使用默认路径,或者输入一个你希望存储私钥的路径,比如id_rsa。

Enter passphrase (empty for no passphrase):

你可以选择为你的SSH密钥设置一个密码短语,这样在使用该密钥时需要输入这个密码短语以增加安全性。如果你希望无密码登录,则直接按回车键跳过这个步骤。
建议:如果你希望SSH密钥能够自动登录而不需要每次输入密码,可以直接按回车跳过设置密码短语。

Confirm passphrase: 如果你设置了密码短语,系统会要求你再次输入以确认。

Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\Administrator/.ssh/id_rsa): [按回车]
Enter passphrase (empty for no passphrase): [按回车]
Enter same passphrase again: [按回车]

2. 将公钥复制到远程服务器

手动复制SSH公钥
打开PowerShell或CMD,然后使用以下命令查看并复制公钥的内容:

cat ~/.ssh/id_rsa.pub

在Windows上,如果你使用了默认路径,命令可能需要指定完整路径:

type C:\Users\Administrator\.ssh\id_rsa.pub

这会输出公钥内容,像这样:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq3Te0nKe...你的公钥内容... user@hostname

连接到远程服务器

ssh -p **** username@**.**.**.**

创建.ssh目录(如果不存在)
一旦连接到服务器,运行以下命令以确保.ssh目录存在:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

将公钥添加到authorized_keys
将上面的公钥内容直接复制到authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq3Te0nKe...你的公钥内容... user@hostname

设置正确的权限

chmod 600 ~/.ssh/authorized_keys

退出服务器
测试无密码登录
完成上述步骤后,你可以尝试从Windows终端使用SSH密钥登录:

ssh -p **** username@**.**.**.**

如果一切正常,你应该能够直接登录到服务器,而无需输入密码。
同样scp也不需要密码,这样就可以通过python程序进行并行scp,且不用重复输入密码了。

最后是并行scp的python脚本

import subprocess
from concurrent.futures import ThreadPoolExecutor
import os
# 定义并行传输的函数
def scp_upload(file_path, remote_path, port=****):
    command = f"scp -r -C -P {port} {file_path} username@**.**.**.**:{remote_path}"
    try:
        subprocess.run(command, shell=True, check=True)
        print(f"Successfully uploaded {file_path}")
    except subprocess.CalledProcessError as e:
        print(f"Error uploading {file_path}: {e}")

# 主函数
def main():
    # 文件列表,可以将所有需要上传的文件或目录放在这里
    rootPath = 'H:/胎儿胎盘'
    fList = os.listdir(rootPath)
    files_to_upload = []
    for f in fList:
        ft = os.path.join(rootPath, f)
        files_to_upload.append(ft)
    # files_to_upload = [
    #     "01140623206020/file1",  # 假设每个文件在子目录中
    #     "01140623206020/file2",
    #     # 添加更多文件或目录
    # ]
    
    remote_base_path = "/RAID5/projects/fuxingwen/gxb/pregnacy_predict/dataset/BYSY"
    
    # 使用ThreadPoolExecutor进行并行上传
    with ThreadPoolExecutor(max_workers=16) as executor:  # 可以根据CPU数量调整workers数量
        for file_path in files_to_upload:
            remote_path = f"{remote_base_path}/{file_path.split('/')[-1]}"
            executor.submit(scp_upload, file_path, remote_path)

if __name__ == "__main__":
    main()

### 快速传输大文件到Linux远程服务器的方法 为了实现本地机器向Linux远程服务器的大规模数据传输,可以考虑多种方法和技术来优化速度和可靠性。以下是几种常见的高效解决方案: #### 1. 使用 `ascp` 工具 `Aspera` 提供了一种高效的文件传输工具 `ascp`,它能够利用专有的协议加速大规模数据的移动。根据实际经验,在停止尝试并行复制之后,以下命令被证明可靠,并能维持数天时间完成传输任务[^1]。 ```bash /path/to/ascp -QT -l 500M -k1 user@remote.source.org:/remote/path /local/path ``` 尽管其性能不如 GridFTP 高效,但它仍然是一种可行的选择,尤其适用于网络条件较差的情况。 --- #### 2. 利用 `GridFTP` 对于需要更高带宽利用率的应用场景,`GridFTP` 是一种专门设计用于高性能计算环境中的文件传输协议。相比传统的 FTP 或 SCP 方法,它可以显著提升传输效率。然而需要注意的是,部署和配置可能较为复杂。 --- #### 3. 基于 SSH 的改进方式 —— Rsync 和 SFTP Rsync 结合压缩选项 `-z` 可以有效减少传输的数据量,从而加快进程。此外,SFTP 协议也支持通过 JSCH 库集成至 DolphinScheduler 等调度平台中[^3]。下面是一个简单的 rsync 示例: ```bash rsync -avz --progress /source/directory/ user@remote.server:/destination/ ``` 此命令会递归同步目录内容,并显示进度条以便监控状态变化。 --- #### 4. USB 控制器驱动程序层面的理解 从底层角度来看,USB 数据包处理机制决定了某些特定条件下如何更有效地安排请求序列化操作。例如,控制器驱动不会合并相邻请求成单一数据包;而对于 OUT 类型转移,则可能会重复使用已缓存在硬件里的资料片段[^2]。虽然这主要针对嵌入式设备开发人员而言,但对于理解整体架构仍有帮助。 --- #### 总结建议 综合以上分析可知,如果追求简单易用且无需额外安装软件的话,推荐优先选用基于 SSH 的方案 (如上述提到过的 Rsync/SFTP) 。而当面临更加苛刻的需求或者特殊环境下工作时,则可进一步探索 Aspera 或者 GridFTP 这类专业化产品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值