我的第一个Python随笔

  自学Python也很长时间了,注册博客园写了第一篇随笔。之前想过很多次,但是始终不知道该怎么开始,内容如何,现在想想,随笔嘛,是自己的想法,也自己的实践,又是自己的锻炼。话不多说,开始今天的正式内容。

Python的paramiko模块。

  paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, BSD, MacOS X, Windows等,paramiko都可以支持,因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系列的操作时,paramiko是最佳工具之一。  

SSHClient

用于连接远程服务器并执行基本命令

基于用户名密码连接:

import paramiko
  
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.30.129', port=22, username='sunqi', password='43797189')
  
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
  
# 关闭连接
ssh.close()

 

示例代码:

 1 import paramiko
 2 
 3 ssh = paramiko.SSHClient()
 4 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
 5 ssh.connect(hostname='192.168.30.129',port=22,username='root',password='43797189')#测试机器为Linux虚拟机(CentOS 7)
 6 while True:
 7     cmd = input('>>:')
 8     stdin,stdout,stderr = ssh.exec_command(cmd)
 9     result = stdout.read()
10     if stdout:
11         print(str(result,'utf8'))
12     else:
13         print(str(stderr.read(),'utf8'))
14 
15 ssh.close()

SFTPClient

用于连接远程服务器并执行上传:

import paramiko

'''
从windows上传文件到Linux虚拟机
IP地址: 192.168.30.129
端口:22
'''
host = '192.168.30.129'
port = 22

t = paramiko.Transport((host,port))
t.connect(username="root",password='43797189',)
sftp = paramiko.SFTPClient.from_transport(t)
target_path = '/var/log/windows.log'
local_path = 'E:\sunqi.log'
sftp.put(local_path,target_path)
t.close()

最后将多线程和这个paramiko模块综合起来写了一个批量主机管理程序

请看到的朋友原谅我的混乱代码规范,我会加倍努力的!

批量主机管理系统远程连接主机实现命令的执行文件的上传下载:

主机列表:

示例代码:host_dir.py

host_dic = {
    'group1':{
            'C1':{'host':'192.168.30.129','port':22,'username':'root','password':'43797189'},
            'C2':{'host':'192.168.30.130','port':22,'username':'root','password':'43797189'},
            'C3':{'host':'192.168.30.131','port':22,'username':'root','password':'43797189'}
    },
    'group2':{
            'C4':{'host':'192.168.30.132','port':22,'username':'root','password':'43797189'},
            'C5':{'host':'192.168.30.134','port':22,'username':'root','password':'43797189'},
            'C6':{'host':'192.168.30.135','port':22,'username':'root','password':'43797189'},
    }
}

运行代码:run_code.py

import threading
import paramiko
import os
from paramiko模块.批量主机管理小项目.host_dir import host_dic

'''
主机批量管理程序
实现多个主机的同时管理
利用多线程以及paramiko模块
实现多个主机同时执行命令,上传或下载文件
'''
class host_manage():
    def __init__(self,host,port,username,password):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
    def command(self,cmd):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
        ssh.connect(hostname=self.host,port=self.port,username=self.username,password=self.password)
        #cmd = input(">>:")
        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        if stdout:
            print(str(result, 'utf8'))
        else:
            print(str(stderr.read(), 'utf8'))

    def upload(self):
        t = paramiko.Transport(self.host,self.port)
        t.connect(username=self.username,password=self.password)
        sftp = paramiko.SFTPClient.from_transport(t)
        target_path = '/var/log/windows.log'
        local_path = 'E:\sunqi.log'
        sftp.put(local_path,target_path)
        t.close()
        pass
    def download(self):
        pass
def choose_group():
    print('可管理主机分组')
    for k in host_dic:
        print(k)
        for i in host_dic[k]:
            print(host_dic[k][i])
    group_num = input('>>:选择主机编号')
    return  group_num
def run():
    num = choose_group()
    print('已选组号:%s' %num)
    selected = input(">>:输入即将进行的操作:command、upload、download")
    if selected =="command":
        cmd = input('>>:请输入要批量操作的命令:')
    thread_conut = []
    for i in host_dic[num]:
        func = host_manage(host=host_dic[num][i]['host'],port=host_dic[num][i]['port'],username=host_dic[num][i]['username'],password=host_dic[num][i]['password'])
        if hasattr(func,selected):
            p = threading.Thread(target=getattr(func,selected),args=(cmd,))
            thread_conut.append(p)
            p.start()
    for i in thread_conut:
        i.join()


if __name__ == '__main__':
    run()

  

原文地址:https://www.cnblogs.com/SunQi-Tony/p/8494908.html