paramiko模块的安装和使用(含上传本地文件或文件夹到服务器,以及下载服务器文件到本地)
安装和使用分两步介绍:
介绍一下,本文的运行环境是win7 64位 和python 2.7 。
安装:
WIN7_64位 安装python-ssh访问模块(paramiko)的安装教程,本人亲测下面教程没问题的,所以可以放心按步骤进行操作
参考地址:
http://jingyan.baidu.com/article/fdbd4277c629c9b89e3f4828.html
使用:
1. paramiko连接
使用paramiko模块有两种连接方式,一种是通过paramiko.SSHClient()函数,另外一种是通过paramiko.Transport()函数。
方法一:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("某IP地址",22,"用户名", "口令")
方法二:
import paramiko
t = paramiko.Transport(("主机","端口"))
t.connect(username = "用户名", password = "口令")
如果连接远程主机需要提供密钥,上面第二行代码可改成:
t.connect(username = "用户名", password = "口令", hostkey="密钥")
2. 上传本地文件到服务器:
#!/usr/bin/python
# -*- coding:utf-8 -*- import paramiko if __name__ == '__main__':
host_ip = '10.*.*.*'
port = ''
username1 = '***'
password1 = '***'
t = paramiko.Transport(host_ip, port)
t.connect(username=username1, password=password1)
sftp = paramiko.SFTPClient.from_transport(t)
remotepath = r'/home/temp/b.txt'
localpath = r'D:\aaa\a.txt'
sftp.put(localpath, remotepath)
t.close()
3. 下载服务器文件到本地:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import paramiko
import os def remote_scp(host_ip, port, remote_path, local_path, username, password):
port= port or 22
t = paramiko.Transport((host_ip, port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
src = remote_path
des = local_path
sftp.get(src, des)
t.close() if __name__ == '__main__':
host_ip = '10.*.*.*'
remote_path = '/home/temp/a.txt'
local_path = r'D:\aaa\a.txt'
part_path= os.path.dirname(local_path)
if not os.path.exists(part_path):
os.makedirs(part_path)
username = '***'
password = '****'
remote_scp(host_ip, 22, remote_path, local_path, username, password)
4. ssh连接服务器:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import paramiko def ssh2(ip, username, passwd, cmd):
try:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, 22, username, passwd, timeout=50)
stdin, stdout, stderr = ssh.exec_command(cmd)
# stdin.write("Y") #简单交互,输入 ‘Y’
print stdout.read()
# for x in stdout.readlines():
# print x.strip("\n")
print '%s\tOK\n' % (ip)
ssh.close()
except:
print '%s\tError\n' % (ip) if __name__ == '__main__':
host_ip = '10.*.*.*'
port = ''
username1 = '***'
password1 = '***'
ssh2(host_ip, username1, password1, 'less /home/temp/a.txt')
5. 目录下多个文件的上传下载:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko, datetime, os host_ip = '10.*.*.*'
username1 = '***'
password1 = '****'
port = 22
local_dir = 'd:/aaa'
remote_dir = '/home/temp/Templates'
try:
t = paramiko.Transport(host_ip, port)
t.connect(username=username1, password=password1)
sftp = paramiko.SFTPClient.from_transport(t)
files = os.listdir(local_dir) # 上传多个文件
# files = sftp.listdir(remote_dir) # 下载多个文件
for f in files:
print ''
print '#########################################'
print 'Beginning to download file from %s %s ' % (host_ip, datetime.datetime.now())
print 'Downloading file:', (remote_dir + '/' + f)
# sftp.get(remote_dir + '/' + f, os.path.join(local_dir, f)) # 下载多个文件
sftp.put(os.path.join(local_dir, f), remote_dir + '/' + f) # 上传多个文件
print 'Download file success %s ' % datetime.datetime.now()
print ''
print '##########################################'
t.close()
except Exception:
print "connect error!"
6. 递归上传目录里面的文件或是文件夹到多个服务器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
import datetime
import os def upload(local_dir, remote_dir, hostname, port, username, password):
try:
t = paramiko.Transport((hostname, port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
print('upload file start %s ' % datetime.datetime.now())
for root, dirs, files in os.walk(local_dir):
print('[%s][%s][%s]' % (root, dirs, files))
for filespath in files:
local_file = os.path.join(root, filespath)
print(11, '[%s][%s][%s][%s]' % (root, filespath, local_file, local_dir))
a = local_file.replace(local_dir, '').replace('\\', '/').lstrip('/')
print('', a, '[%s]' % remote_dir)
remote_file = os.path.join(remote_dir, a).replace('\\', '/')
print(22, remote_file)
try:
sftp.put(local_file, remote_file)
except Exception as e:
sftp.mkdir(os.path.split(remote_file)[0])
sftp.put(local_file, remote_file)
print("66 upload %s to remote %s" % (local_file, remote_file))
for name in dirs:
local_path = os.path.join(root, name)
print(0, local_path, local_dir)
a = local_path.replace(local_dir, '').replace('\\', '/').lstrip('/')
print(1, a)
print(1, remote_dir)
# remote_path = os.path.join(remote_dir, a).replace('\\', '/')
remote_path = remote_dir + a
print(33, remote_path)
try:
sftp.mkdir(remote_path)
print(44, "mkdir path %s" % remote_path)
except Exception as e:
print(55, e)
print('77,upload file success %s ' % datetime.datetime.now())
t.close()
except Exception as e:
print(88, e) if __name__ == '__main__':
# 选择上传到那个服务器
serverlist = ['服务器00', '服务器01', '服务器02']
for i in range(len(serverlist)):
print ("序号:%s 对应的服务器为:%s" % (i, serverlist[i]))
num = raw_input("请输入对应服务器的序号:")
num = int(num)
hostname = ['10.*.*.*', '10.*.*.*', '10.*.*.*']
username = ['root', 'root', 'root']
password = ['***', '***', '***']
port = [22, 22, 22] local_dir = r'D:\aaa'
remote_dir = '/home/temp/dd/'
upload(local_dir, remote_dir, hostname=hostname[num], port=port[num], username=username[num],
password=password[num])
7. 利用paramiko实现ssh的交互式连接
以下是通过paramiko模块直接用ssh协议登陆到远程服务器的操作代码,这里先定义一个interactive模块(即 interactive.py),
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import sys # windows does not have termios...
try:
import termios
import tty has_termios = True
except ImportError:
has_termios = False def interactive_shell(chan):
if has_termios:
posix_shell(chan)
else:
windows_shell(chan) def posix_shell(chan):
import select
oldtty = termios.tcgetattr(sys.stdin)
try:
tty.setraw(sys.stdin.fileno())
tty.setcbreak(sys.stdin.fileno())
chan.settimeout(0.0)
while True:
r, w, e = select.select([chan, sys.stdin], [], [])
if chan in r:
try:
x = chan.recv(1024)
if len(x) == 0:
print '\r\n*** EOF\r\n',
break
sys.stdout.write(x)
sys.stdout.flush()
except socket.timeout:
pass
if sys.stdin in r:
x = sys.stdin.read(1)
if len(x) == 0:
break
chan.send(x)
finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty) # thanks to Mike Looijmans for this code
def windows_shell(chan):
import threading
sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF.\r\n\r\n") def writeall(sock):
while True:
data = sock.recv(256)
if not data:
sys.stdout.write('\r\n*** EOF ***\r\n\r\n')
sys.stdout.flush()
break
sys.stdout.write(data)
sys.stdout.flush() writer = threading.Thread(target=writeall, args=(chan,))
writer.start()
try:
while True:
d = sys.stdin.read(1)
if not d:
break
chan.send(d)
except EOFError:
# user hit ^Z or F6
pass
写一个ssh_inter.py的交互主程序调用interactive模块,代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import paramiko
import interactive if __name__ == '__main__':
host_ip = '10.*.*.*'
username1 = '***'
password1 = '***'
port = 22
# 记录日志写到本地文件中
paramiko.util.log_to_file(r'D:/aaa/wu.txt')
# 建立ssh连接
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host_ip, port=22, username=username1, password=password1, compress=True)
# 建立交互式shell连接
channel = ssh.invoke_shell()
# 建立交互式管道
interactive.interactive_shell(channel)
# 关闭连接
channel.close()
ssh.close()
总结:
paramiko模块是一个比较强大的ssh连接模块,以上的示例只是列出了该模块的一些简单的使用方法,还可以使用threading模块加块程序并发的速度;也可以使用configparser模块处理配置文件,而我们将所有IP、用户信息操作都放入配置文件;使用setproctitle模块为执行的程序加一个容易区分的title等。
同样,虽然连fabric这样大名鼎鼎的软件使用的ssh都是用paramiko模块进行的封装,不过你依然可以选择不使用它,你也可以选择pexpect模块实现封装一个简易的ssh连接工具、或者使用同样比较火的salt-ssh模块。
参考文章:
paramiko模块的安装和使用(含上传本地文件或文件夹到服务器,以及下载服务器文件到本地)的更多相关文章
- python paramiko模拟ssh登录,实现sftp上传或者下载文件
Python Paramiko模块的安装与使用详解 paramiko是短链接,不是持续链接,只能执行你设定的shell命令,可以加分号执行两次命令. http://www.111cn.net/phpe ...
- Windows下GIT安装与使用(上传远程端)
Windows下GIT安装与使用(上传远程服务器) 1. 登陆http://msysgit.github.io/并下载Git 2. 打开下载的exe文件,一路默认(路径可以去修改).有可能电脑需要 ...
- Git安装配置及第一次上传项目到GitHub
平时的学习工作少不了保存自己的Code到代码库,这里必须要使用到Git与GitHub. 1. 关于Git的安装 下载Git:下载地址:https://git-scm.com/downloads ...
- 微信小程序云函数中有以下未安装的依赖,如果未安装即全量上传
云函数中有以下未安装的依赖,如果未安装即全量上传 在新建的云函数,右击终端打开->cmd,安装依赖 npm install --production 依赖安装成功之后,文件里面会出现 packa ...
- python selectors模块实现 IO多路复用机制的上传下载
import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...
- spring mvc 图片上传,图片压缩、跨域解决、 按天生成文件夹 ,删除,限制为图片代码等相关配置
spring mvc 图片上传,跨域解决 按天生成文件夹 ,删除,限制为图片代码,等相关配置 fs.root=data/ #fs.root=/home/dev/fs/ #fs.root=D:/fs/ ...
- python的paramiko模块的安装与使用
一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...
- paramiko模块的安装
1.找到自己python安装的目录(默认路径:C:\Users\zhangliyuan\AppData\Local\Programs\Python\Python35) 注:cmd中所有命令 2.进入S ...
- python在windows下安装paramiko模块和安装pycrypto模块(3步搞定)(转)
Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypto模块,因此要在Python中使用SSH,我们需要先安装pycr ...
随机推荐
- java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和总结
在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date.java.sql.Date.java.sql.Time.java.sq ...
- 【MySQL】20个经典面试题(转)
原文链接:http://bbs.51cto.com/thread-1470880-1.html Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.my ...
- 使用LaTeX按IEEE模板写论文时的参考文献管理方法(BibTeX使用小结)
之前用LaTeX写论文时,参考文献都是手动添加管理的,真是让人很抓狂.所以这次趁着假期,简单看了一下怎么使用BibTeX对参考文献进行管理,这里以IEEE的最新模板为例. 首先说明,我之前用的是MiK ...
- TCP/IP 笔记 1.1 概 述
四个层次 每一层负责不同的功能:1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物理接口细节.2) ...
- sqlserver 查询int类型 in (字符串) 报转换int类型出错的问题
, , '') ) AS c_departNames FROM t_user AS A LEFT JOIN t_role AS B ON A.c_roleId=B.c_roleId 用 CHARIND ...
- zabbix启动web界面提示:Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
问题 zabbix启动web界面提示: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' ( ...
- 如何判断一个字符串是否是UTF8编码
UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中. ...
- java8的十大新特性
推荐学习的博客: http://blog.csdn.net/renfufei/article/details/24600507/-------讲解的非常通俗易懂 http://blog.csdn.ne ...
- C++笔记--指针数组和结构
指针 类型为T*的变量能保存一个类型T对象的地址 Char c=‘a’:Char * p=& c://保存了c的地址 指针的操作一般都是间接的引用,就是相当于引用指针所指的对象. 0是一个特殊 ...
- spring、spring mvc以及IOC的阅读
spring vs spring-mvc spring是应用级框架 spring mvc只是一个mvc框架 spring现在包含很多子模块,我们用的最多的是依赖注入. spring模块可分为以下: C ...