14.python笔记之paramiko

作者:刘耀

博客:www.liuyao.me

博客园:www.cnblogs.com/liu-yao

转载请注明

一,介绍

1.使用paramiko可以很好的解决以上问题,比起前面的方法,它仅需要在本地上安装相应的软件(python以及PyCrypto),对远程服务器没有配置要求,对于连接多台服务器,进行复杂的连接操作特别有帮助。

二,安装

1. window7(64位):

	1.pip install --use-wheel --no-index --find-links=https://github.com/
	sfbahr/PyCrypto-Wheels/raw/master/pycrypto-2.6.1-cp35-none-win_amd64.whl pycrypto
	2.pip install paramiko
	3.修改python解释器目录下的\Lib\site-packages\Crypto\Random\OSRNG\nt.py
	第28行
	import winrandom 修改成 from Crypto.Random.OSRNG import winrandom 
	注:参考http://www.cnblogs.com/liwenzhou/p/5246622.html

2.linux(centos):

	1.yum -y install gcc python-devel
	2.安装pycrypto
		pip install pycrypto
	3.安装paramiko
		pip install paramiko

三,操作

1. 基于用户和密码链接执行命令

    import paramiko
	# 创建SSH对象
	ssh = paramiko.SSHClient()	
	# 允许连接不在know_hosts文件中的主机
	ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	# 连接服务器	
	ssh.connect(hostname='115.29.51.8', port=22, username='liuyao', password='123456')
	# 或
	#ssh.connect("某IP地址",22,"用户名", "口令")
	# 执行命令
	stdin, stdout, stderr = ssh.exec_command('df')
	# 获取命令结果
	result = stdout.read()
	# 关闭连接
	ssh.close()
	# 打印结果
	print(result)

2.封装用户和密码链接执行命令

	import paramiko
	transport = paramiko.Transport(('115.29.51.8', 22))
	transport.connect(username='root', password='123456')
	ssh = paramiko.SSHClient()
	ssh._transport = transport
	stdin, stdout, stderr = ssh.exec_command('df -h')
	transport.close()
	print (stdout.read())

3.基于公钥链接执行命令

import paramiko
file_key = '/home/auto/.ssh/id_rsa'
private_key = paramiko.RSAKey.from_private_key_file(file_key)
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='115.29.51.8', port=22, username='root', key=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
print(result)

4.封装公钥链接执行命令

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport = paramiko.Transport(('你的主机名', 22))
transport.connect(username='你的用户名', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('df -h')
transport.close()
print (stdout.read())

5.基于用户名密码上传下载

import paramiko
_link = paramiko.Transport(('你的主机',22))
_link.connect(username='你的用户名',password='123')
sftp = paramiko.SFTPClient.from_transport(_link)
# 将你目录/本地文件 上传至服务器 目录/文件
sftp.put('你本地文件', 目标服务器文件')
# 将目标服务器文件 下载到本地 指定目录
sftp.get('目标服务器文件', '你本地目录')
#关闭链接
_link.close()

6.基于公钥链接上传下载

import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='你的用户名', pkey=private_key )
sftp = paramiko.SFTPClient.from_transport(transport)
# 将你目录/本地文件 上传至服务器 目录/文件
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将目标服务器文件 下载到本地 指定目录
sftp.get('remove_path', 'local_path')
# 关闭链接
transport.close()

四,案例

多线程执行批量主机执行命令
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
import paramiko
class Anstack(object):
	def __init__(self,host,cmd):
		#host为变量
   		self.host = host
		self.cmd = cmd
    	self.port = 22
    	self.username = 'root'
    	self.pwd = '123456'
		self.run()
	def run(self):
		#执行方法
    	self.connect()
    	self._cmd()
    	self.close()
	def connect(self):
		#链接方法
    	transport = paramiko.Transport((self.host,self.port))
    	transport.connect(username=self.username,password=self.pwd)
    	self.__transport = transport
	def close(self):
		#关闭方法
		self.__transport.close()
	def _cmd(self):
		ssh = paramiko.SSHClient()
    	ssh._transport = self.__transport
    	# 执行命令
    	stdin, stdout, stderr = ssh.exec_command(self.cmd)
    	# 获取命令结果
    	result = stdout.read()
		print(result)

if __name__ == '__main__':
	args = ['192.168.1.1','192.168.1.2','192.168.1.3','192.168.1.4']
	cmd = input('您要执行的命令')
	for i in args:
		Execcmd = threading.Thread(target=Anstack, args=(i,cmd,))
    	Execcmd.start()
posted @ 2016-07-17 10:45  刘耀  阅读(2339)  评论(0编辑  收藏  举报