python通过sftp远程传输文件
python提供了一个第三方模块paramiko,通过这个模块可以实现两台机器之间的网络连接,sftp是paramiko的一个方法,使用sftp可以在两台机器之间互相传输
拷贝文件。然而paramiko的sftp只能拷贝文件,不能拷贝文件夹。要实现文件夹的拷贝,可以这样子思考:使用深度搜索遍历源目录,若是文件,直接拷贝到
目的目录;若是文件夹,则先在目的目录建立一个子目录,然后遍历子目录...使用递归函数,可以达到完全拷贝目录的目的。实现代码如下:
1.获取一个sftp句柄
import paramiko
#建立连接,获取sftp句柄def sftp_connect(username,password,host,port=22): client = None sftp = None try: client = paramiko.Transport((host,port)) except Exception as error: print error else: try: client.connect(username=username, password=password) except Exception as error: print error else: sftp = paramiko.SFTPClient.from_transport(client) return client,sftp#断开连接def disconnect(client): try: client.close() except Exception as error: print error2.从远程机器上下载文件(夹)到本地
import os
import sysfrom stat import S_ISDIR as isdirdef _check_local(local): if not os.path.exists(local): try: os.mkdir(local) except IOError as err: print errdef get(sftp,remote,local): #检查远程文件是否存在 try: result = sftp.stat(remote) except IOError as err: error = '[ERROR %s] %s: %s' %(err.errno,os.path.basename(os.path.normpath(remote)),err.strerror) print error else: #判断远程文件是否为目录 if isdir(result.st_mode): dirname = os.path.basename(os.path.normpath(remote)) local = os.path.join(local,dirname) _check_local(local) for file in sftp.listdir(remote): sub_remote = os.path.join(remote,file) sub_remote = sub_remote.replace('\\','/') get(sftp,sub_remote,local) else: #拷贝文件 if os.path.isdir(local): local = os.path.join(local,os.path.basename(remote)) try: sftp.get(remote,local) except IOError as err: print err else: print '[get]',local,'<==',remote3.从本地拷贝文件(夹)到远程机器
import os
def put(sftp,local,remote): #检查路径是否存在 def _is_exists(path,function): path = path.replace('\\','/') try: function(path) except Exception as error: return False else: return True #拷贝文件 def _copy(sftp,local,remote): #判断remote是否是目录 if _is_exists(remote,function=sftp.chdir): #是,获取local路径中的最后一个文件名拼接到remote中 filename = os.path.basename(os.path.normpath(local)) remote = os.path.join(remote,filename).replace('\\','/') #如果local为目录 if os.path.isdir(local): #在远程创建相应的目录 _is_exists(remote,function=sftp.mkdir) #遍历local for file in os.listdir(local): #取得file的全路径 localfile = os.path.join(local,file).replace('\\','/') #深度递归_copy() _copy(sftp=sftp,local=localfile,remote=remote) #如果local为文件 if os.path.isfile(local): try: sftp.put(local,remote) except Exception as error: print error print '[put]',local,'==>',remote,'FAILED' else: print '[put]',local,'==>',remote,'SUCCESSED' #检查local if not _is_exists(local,function=os.stat): print "'"+local+"': No such file or directory in local" return False #检查remote的父目录 remote_parent = os.path.dirname(os.path.normpath(remote)) if not _is_exists(remote_parent,function=sftp.chdir): print "'"+remote+"': No such file or directory in remote" return False #拷贝文件 _copy(sftp=sftp,local=local,remote=remote)python通过sftp远程传输文件的更多相关文章
- golang 远程传输文件
概述 之前有一篇介绍如何使用 golang 通过SSH协议来执行远程命令:golang 执行远程命令 同样,通过SSH协议也可以使用 golang 来远程传输文件. 除了 SSH 的库,为了传输文件, ...
- blfs(systemd版本)学习笔记-安装lrzsz软件包实现ssh远程传输文件到lfs系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 安装lrzsz软件包实现ssh远程传输文件到lfs系统 这个软件包在lfs系列的书中没有,这里是参照lrzsz官网的说明进行编译 ...
- Python+USB+Vnet+FTP传输文件开发记录
做一个Python+USB+Vnet+FTP传输文件开发记录
- Linux远程传输文件免密码
首先为什么Linux远程传输要免密码?手动使用scp命令传输每次都要输密码太过麻烦了. 开发中有一句话,能复制粘贴尽量不要手打. 运维中有一句话,能脚本化实现尽量不要手动执行. 远程传输文件免密码的目 ...
- Python不同电脑之间传输文件实现类似scp功能不输密码
SCP vs SFTP 通过paramiko还可以传输文件,如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式: sftp = paramiko.SFTPClient. ...
- sftp远程传输脚本
该脚本主要是是批量修改文件名,然后传输文件到服务器#!/bin/bash #脚本名:sftp.sh while true do num=`cat test.txt|wc -l` ;a<=$num ...
- 远程传输文件命令:scp
1.概述 scp(secure copy)是一个基于 SSH 协议在网络之间进行安全传输的命令,其格式为“scp [参数] 本地文件 远程帐户@远程 IP 地址:远程目录”. 与第 2 章讲解的 cp ...
- SCP远程传输文件
今天想用SCP通过局域网传输文件到服务器,但却发生了下面这种事情: 上面描述 连接主机端口22被拒绝,失去连接 后发现因为没有指定端口,我服务器这边改了端口,所以根据自己情况改一下命令 scp -29 ...
- scp远程传输文件和ssh远程连接
ssh使用方法 如果从一台linux服务器通过ssh远程登录到另一台Linux机器, 这种情况通常会在多台服务器的时候用到. 如用root帐号连接一个IP为192.168.1.102的机器,输入:“ ...
随机推荐
- Spark SQL读写方法
一.DataFrame:有列名的RDD 首先,我们知道SparkSQL的目的是用sql语句去操作RDD,和Hive类似.SparkSQL的核心结构是DataFrame,如果我们知道RDD里面的字段,也 ...
- centos 卸载已安装的软件
以mysql举例: 首先查询安装包: rpm -qa|grep mysql 查询到的一个结果为:mysql-community-libs-5.7.13-1.el6.x86_64 yum 删除 yum ...
- unicode gbk utf-8的差异
GB2312(1980年)定义,包含6763个汉字,682个字符 GBK1.0 定义了21003个汉字,21886个字符 ASCII->GB2312->GBK 编码方式向后兼容,即同一个字 ...
- iOS UI进阶-4.0 地图与定位
在移动互联网时代,移动app能解决用户的很多生活琐事,比如 导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能 ...
- Selenium基本使用(十一)异常捕获
1. 抛出异常和自定义异常 Python用异常对象(exception object)表示异常情况,遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种 ...
- GetLastError()返回值列表
GetLastError()返回值列表: [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无 ...
- nodejs中安卓端的编码如何转换为中文
借助一些模块来转换,比如,html-entities Github var Entities = require('html-entities').XmlEntities; entities = ne ...
- Linux的文件最大连接数
[最大连接数]Linux的文件最大连接数 查看当前操作系统连接数设置 ulimit -a ==================================== 修改服务器最大连接数 vim / ...
- db2修改表结构,增加列,删除列等
增加一列:ALTER TABLE tbname ADD COLUMN columnName datatype; 增加多列:ALTER TABLE tbname ADD COLUMN columnNam ...
- verdi bin工具
verdi安装目录下会有很多小的工具: 1)波形类型转换类:fsdb2saif,fsdb2vcd, log2fsdb(只能增加某些周期性信号,从log txt直接产生fsdb波形,适合于siloti的 ...