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
error
2.从远程机器上下载文件(夹)到本地
import
os
import
sys
from
stat
import
S_ISDIR as isdir
def
_check_local(local):
if
not
os.path.exists(local):
try
:
os.mkdir(local)
except
IOError as err:
print
err
def
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,
'<=='
,remote
3.从本地拷贝文件(夹)到远程机器
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的机器,输入:“ ...
随机推荐
- 产品设计教程:利用“系列位置效应”优化UI
任何博得人们喜欢的产品都在一定程度上契合了用户的心理需求.设计和心理学息息相关,掌握一些基本心理学知识,设计师的作品更能在潜意识中抓住用户的心. 系列位置效应 “系列位置效应”(The Serial ...
- MJExtension代码解释
Runtime 是什么? objective-C会把函数调用的转换为消息发送,objc_MsgSend(receiver, msg), 注意,recevier指的是消息的接受者.那么self, sup ...
- myloader原理介绍
myloader恢复主要流程 1.首先由myloader主线程完成建库建表,依次将备份目录下建库和建表文件执行应用到目标数据库实例中: 2.接着myloader主线程会生成多个工作线程,由这些 ...
- [文摘]那些一心想要离开 BAT 的人,后来怎么样了?
人心是个无底洞,填不满也掏不空 <Working at Google seemed like a dream job. The reality has been a tedious, point ...
- VirtualBox如何扩展虚拟机Ubuntu的硬盘容量-转
https://blog.csdn.net/ouyang_peng/article/details/53261599 摘录要点: 扩展 VBoxManage modifyhd YOUR_HARD_DI ...
- Docker ssh server
这个话题真让我气愤啊,在家里的mac上我已经全部摆平了,结果在公司的Linux上就给堵住了 原因不祥,但最后在错误提示里,有个移除(remove)信息,我照做了,就没问题了,全通了 大概是linux里 ...
- springmvc注解式开发
搭建环境 后端控制器无需实现接口,添加相应的注解 springmvc配置文件中无需注册controller springmvc配置文件中添加组件扫描器.注解驱动 涉及常用的注解 @controller ...
- LA 4992 Jungle Outpost(半平面交)
Jungle Outpost [题目链接]Jungle Outpost [题目类型]半平面交 &题解: 蓝书282 我自己写的代码居然AC了!!! 刘汝佳的说要right要-3什么的,还要特判 ...
- C# Dapper 简单实例
/// <summary> /// 分页信息 /// </summary> public class PageInfo<T> { /// & ...
- SQL Server 创建索引(index)
索引的简介: 索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书. 索引主要目的是提高了SQL Server系统的性能,加快数 ...