欢迎来到Felix的博客

雨恨云愁,江南依旧称佳丽。水村渔市。一缕孤烟细。天际征鸿,遥认行如缀。平生事。此时凝睇。谁会凭阑意
返回顶部

python连接工具的三方库

工作中,在做一些提效的脚本开发时,总会连接一些常用的工具,包括ssl、redis、zookeeper、dubbo、jenkins等
下边我整理了自己的常用的三方库

ssl连接服务器,进行文件交互

import paramiko

#方式一:命令行交互
ssh = paramiko.SSHClient()      #创建连接对象
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect("xx.xx.xx.xx", 22, "xxx", "xxx")      #ip、端口号、用户、密码;建立链接
stdin, stdout, stderr = ssh.exec_command("pwd")   #命令行执行命令
result = stdout.read().decode('utf-8')            #返回输出结果
print(result)
ssh.close()      #关闭链接

#方式二:文件交互
transport = paramiko.Transport(('ip', 22))      #ip/port
transport.connect(username='xxx', password='xxx') #user/pwd 建立链接
ssh = paramiko.SSHClient()
ssh._transport = transport
sftp = paramiko.SFTPClient.from_transport(transport)      #sftp连接
sftp.put(localpath, remotepath)      #localpath:本地路径 remotepath:远程路径      上传文件
sftp.get(remotepath, localpath)      #localpath:本地路径 remotepath:远程路径      下载文件
stdin, stdout, stderr = ssh.exec_command()
result = stdout.read().decode('utf-8')
print(result)
transport.close()

连zk,获取dubbo服务列表

# -*- coding: utf-8 -*-
__author__ = 'felix'
from kazoo.client import KazooClient
import urllib, sys

host = {
    "evn1": "10.6.64.96:2181",
    "evn2": "172.17.12.253:2181",
    "evn3": "172.17.253.253:2181"
}

def get_dubbo_full(evn, serviceName):            #返回某服务信息,字典类型{'ip:port': ['serviceName']}
    Host = host[evn]      #获取不同环境zk地址
    zk = KazooClient(hosts="{}".format(Host))      #建立实例
    zk.start()            #连接
    urls = []
    list = zk.get_children("dubbo")      #获取子节点

    for i in list:
        if serviceName in i:  # 关键字过滤      #查看某个服务
            try:
                gg = zk.get_children("/dubbo/{}/providers".format(i))
                if gg:
                    for j in gg:
                        url = urllib.parse.unquote(j)
                        if url.startswith('dubbo:'):
                            urls.append(url.split('?')[0].split('dubbo://')[1])
            except Exception as e:
                print(e)
                print(i)
    services = {}
    for i in urls:
        try:
            path, service = i.split('/')
            if not services.get(path):
                services.update({path: []})
            services[path].append(service)
        except Exception as e:
            print(e)
    # print(json.dumps(services, indent=4))
    return services


def get_service(evn, servicename):            #返回某服务信息,字符串类型'ip:port'
    services = get_dubbo_full(evn, servicename)
    for k, v in services.items():
        if servicename in v:
            return k
    return False

def get_service_ip_port(evn, servicename):      #返回某服务所在的ip与端口,数组类型['ip', 'port']
    ip_port = get_service(evn, servicename)
    if ip_port:
        return str(ip_port).split(":")
    else:
        return "no service"

调用dubbo服务方法(需要自己学习telnet调用dubbo服务)

# -*- coding: utf-8 -*-
__author__ = 'felix'

import socket
import telnetlib
import os

class Dubbo(telnetlib.Telnet):
    prompt = 'dubbo>'
    coding = 'utf-8'
    serv = ''
    def __init__(self, ip, port, service, timeout=socket._GLOBAL_DEFAULT_TIMEOUT):
        self.serv = service
        super().__init__(ip, port)
        self.write(b'\n')

    def command(self, flag, str_=""):
        data = self.read_until(flag.encode())
        self.write(str_.encode() + b"\n")
        return data

    def invoke(self, method_name, arg):      
        command_str = "invoke {0}.{1}({2})".format(self.serv, method_name, arg)
        self.command(Dubbo.prompt, command_str)
        data = self.command(Dubbo.prompt, "")
        data = data.decode(Dubbo.coding,errors='ignore').split('\n')[0]
        return data

    def do(self, arg):
        command_str = arg
        self.command(Dubbo.prompt, command_str)
        data = self.command(Dubbo.prompt, command_str)
        data = data.decode(Dubbo.coding,errors='ignore').split('\n')[0]
        # for i in data:
        #     print (i.strip())
        return data


    def ls_l_all(self):
        command_str = "ls -l {0}".format(self.serv)
        self.command(Dubbo.prompt, command_str)
        data = self.command(Dubbo.prompt, "")
        data = data.decode(Dubbo.coding,errors='ignore').split('\n')
        for i in data:
            print(i)

    def ls_l_func(self, func_name):
        command_str = "ls -l {0}".format(self.serv)
        self.command(Dubbo.prompt, command_str)
        data = self.command(Dubbo.prompt, "")
        data = data.decode(Dubbo.coding,errors='ignore').split('\n')
        for i in data:
            if func_name in i:
                print(i)
                break

连接redis(redis相关命令语法、具体操作需要自行学习)

#方式一:直连
import redis
conn = redis.Redis(host=host, port=port)
result = conn.get(key) #获取key信息

#方式二:集群
from rediscluster import StrictRedisCluster
startup_nodes = [            #集群节点
    {'host': 'xxx', 'port': 6379},
    {'host': 'xxx', 'port': 6379},
    {'host': 'xxx', 'port': 6379},
    {'host': 'xxx', 'port': 6379},
    {'host': 'xxx', 'port': 6379},
    {'host': 'xxx', 'port': 6379},
]
rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
result = rc.get(key)
posted @ 2021-01-19 15:47  felixtester  阅读(227)  评论(0)    收藏  举报