免密SCP:本机和远程服务器之间文件免密互传

问题

每次利用scp命令进行windows和linux之间文件互传的时候,都需要输入一次远程服务器的密码,若是要利用shell脚本进行多个文件的传输,则需要输入多次,非常不方便。琢磨了很多种方法,最后还是选择考虑在本地电脑和远程服务器之间建立非对称密码体系来进行文件传输,这种方式较为方便,不用安装各种包。

非对称加密体系介绍

非对称加密中公钥和私钥的认证过程如下:
假设Alice想把一段数据发送给Bob,当Bob收到数据时如何判断该数据确实是Alic发送的且传输过程中没有被篡改?基于公钥和私钥的认证可以完成这个需求,具体流程如下:

  1. Alice用她的私钥对数据加密(或者对于数据的哈希值进行加密作为签名)
  2. Alice将加密后的数据(或者明文数据+签名)发送给Bob
  3. Bob用Alice的公钥解密数据(或校验签名),如果解密(校验)成功则可以保证数据的发送方肯定是Alice

因为这里的算法中加密和解密用的不是同一个密钥,因此叫做非对称加密。

拓展到SCP的传输过程,可以理解为:

  1. 用户1在主机A创建自己的密钥对,包括公钥和私钥
  2. 用户1将想传输的内容用私钥进行加密,然后将签名发送给主机B
  3. 主机B用A的公钥对签名进行解密,若校验成功则同意传输

做法

假设是windows本地电脑想免密登录远程服务器

  1. 在windows中创建密钥对

    ssh-keygen

  2. 将公钥传给远程服务器

    ssh-copy-id -p端口号 用户名@远程服务器ip地址

    这个命令会要求输入远程服务器地址

  3. 免密执行scp命令,-r为递归执行目录,-p为端口号

    scp -r -p端口号 用户名@ip地址:远程服务器地址 本地地址

    当然也可以用shell脚本来进行多个文件的免密传输,这里提供一个我写好的shell脚本:
    将文件从远程服务器目录from_dir传到本地to_dirfrom_dir_w的作用是获取目录名

    #!/bin/bash
    to_dir=" D:/project/***/finish_v1_pixel"
    from_dir="/data1/***/jupyter-data/***/Datasets/SD_ICSI/"
    from_dir_w="/data/***/Datasets/"
    for j in `ls ${from_dir_w}`
    do
     echo $j
     scp -r -P端口号 用户名@主机地址:${from_dir}/$j/result/. ${to_dir}/$j
     echo finish copy
    done
    
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值