为了学习一下scp协议,我找了一个开源的scp实现(python实现)来看。这里记录我的学习过程
1、主模块
scp内置了两个参数 -t 和 -f ,这两个参数是隐藏的,不会被用户显式提供,那么谁提供这个参数呢,两个scp进程之间传输数据时,远端机器上的scp进程被本地scp进程启动起来时提供上去。需要说明的是,这是通过本地scp进程经ssh远程过去开启远端机器的scp进程来实现的。
2、SSH远程连接模块
开启一个远程连接用了paramiko这个包,登陆时提示输入密码则可以使用python自带的getpass这个模块
3、传输模块
这个模块是最核心的模块了。发送数据接收数据的具体代码都在这了。ssh的数据和消息统一使用一个tcp channel。也就是说建立起来的tcp连接既走协议消息包又走文件数据包。ssh的协议是简单的一问一答型协议,还有是简单的文本型协议。
比如说D代表发送文件夹,C代表发送文件,T代表文件夹或者文件的时间戳信息。我们可以扩展这个简单的协议,比如加上H字段协议用作文件哈希值字段,实现断点续传功能。
另外程序中有个打印进度条功能,实现是在每次有网络IO时就触发一次更新打印进度条,具体的就是read,write函数