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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM