作者:劉耀
博客: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()