问题
每次利用scp命令进行windows和linux之间文件互传的时候,都需要输入一次远程服务器的密码,若是要利用shell脚本进行多个文件的传输,则需要输入多次,非常不方便。琢磨了很多种方法,最后还是选择考虑在本地电脑和远程服务器之间建立非对称密码体系来进行文件传输,这种方式较为方便,不用安装各种包。
非对称加密体系介绍
非对称加密中公钥和私钥的认证过程如下:
假设Alice想把一段数据发送给Bob,当Bob收到数据时如何判断该数据确实是Alic发送的且传输过程中没有被篡改?基于公钥和私钥的认证可以完成这个需求,具体流程如下:
- Alice用她的私钥对数据加密(或者对于数据的哈希值进行加密作为签名)
- Alice将加密后的数据(或者明文数据+签名)发送给Bob
- Bob用Alice的公钥解密数据(或校验签名),如果解密(校验)成功则可以保证数据的发送方肯定是Alice
因为这里的算法中加密和解密用的不是同一个密钥,因此叫做非对称加密。
拓展到SCP的传输过程,可以理解为:
- 用户1在主机A创建自己的密钥对,包括公钥和私钥
- 用户1将想传输的内容用私钥进行加密,然后将签名发送给主机B
- 主机B用A的公钥对签名进行解密,若校验成功则同意传输
做法
假设是windows本地电脑想免密登录远程服务器
-
在windows中创建密钥对
ssh-keygen
-
将公钥传给远程服务器
ssh-copy-id -p端口号 用户名@远程服务器ip地址
这个命令会要求输入远程服务器地址
-
免密执行scp命令,-r为递归执行目录,-p为端口号
scp -r -p端口号 用户名@ip地址:远程服务器地址 本地地址
当然也可以用shell脚本来进行多个文件的免密传输,这里提供一个我写好的shell脚本:
将文件从远程服务器目录from_dir
传到本地to_dir
,from_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