• python day13



    课程大纲

    一、ORM
       
        连表
            一对多
           
            1、创建表,主动指定外键约束
            2、操作
                    类:repr
                   单表
                       
                   连表
                        session.query(表1).join(表2).all()
           
           
            多对多
                1、创建表,额外的关系表
                2、filter()
                        ==
                        int_( 都可以是另外一个查询)
                3、relationship
               
                    A
                    AB ==> fk, 关系
                    B
                4、简单
                   
                    A   关系(B,ABTable对象)
                    AB ==>fk,
                    B
                    操作时,简单
               
                    Table对象:
                       
                        A   关系(B,Table对象方法)
                        Table对象方法 AB ==>fk,
                        B
                        操作时,简单
               
               
                   
                        A   关系(B,AB.__table__)
                        AB ==>fk,
                        B
                        操作时,简单
               
        1、创建表
        2、操作表
            #单表
           
            #连表
                .join
                关系:
                    一对多
                        fk,关系
                    多对多,
                        多一张表 fk,fk
                        1、 关系表:关系
                       
                        2、A:关系,(B,AB)
                       
                   
    二、paramiko模块

        SSHClient
            用户名、密码:
                SSHClient,Tranport
        SFTPClient:
            用户名、密码
                Tranport

        需求:
            命令、上传文件、命令
            import paramiko
      
      
       Tranport
       
       Tranport关闭
            # 创建SSH对象
            ssh = paramiko.SSHClient()
            # 允许连接不在know_hosts文件中的主机
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 连接服务器
            ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')
              
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command('ls')
            # 获取命令结果
            result = stdout.read()
              
            # 关闭连接
            ssh.close()

            import paramiko
             
            transport = paramiko.Transport(('hostname',22))
            transport.connect(username='wupeiqi',password='123')
             
            sftp = paramiko.SFTPClient.from_transport(transport)
            # 将location.py 上传至服务器 /tmp/test.py
            sftp.put('/tmp/location.py', '/tmp/test.py')
            # 将remove_path 下载到本地 local_path
            sftp.get('remove_path', 'local_path')
             
            transport.close()


            ssh = paramiko.SSHClient()
            # 允许连接不在know_hosts文件中的主机
            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            # 连接服务器
            ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')
              
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command('ls')
            # 获取命令结果
            result = stdout.read()
              
            # 关闭连接
            ssh.close()
        连接:
            堡垒机
           
    三、前端:HTMl


    sqlalchemy  使用

    1. 单表操作
    2. join 连接操作,多表

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author:Minghu Wang

    """
    目的: 创建用于存储主机用户和组,和其对应的关系,其用户属于那个组
    实现: sqlalchemy orm框架
    1.创建三张表,user,group,test(用户存储组和用户的对应关系,用外键实现)
    2.pymysql实现连接,class类实现创建表,session实现增删改查
    3.__repl__实现格式化字符串打印,默认以类原始数据输出,用此方法以列表形式的字符串输出
    """


    from sqlalchemy import create_engine                                         #创建表模块
    from sqlalchemy.ext.declarative import declarative_base                      #对象的基类
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index     #支持数据类型的模块
    from sqlalchemy.orm import sessionmaker, relationship                        #格式化查询模块
    engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)      # 初始化数据库连接

    Base = declarative_base()     # 创建对象的基类
    # 单表
    class Test(Base):                                                 #创建表必须生成类
        __tablename__ = 'test'                                        #表名
        nid = Column(Integer, primary_key=True,autoincrement=True)   #Integer整型,primary_key主键,autoincrement自增ID
        name = Column(String(32))                                     #定义列
    # 一对多
    class Group(Base):
        __tablename__ = 'group'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        caption = Column(String(32))
            def __repr__(self):                                  # 只用于格式化打印,针对调取
                #temp1 = "%s - %s" %(self.nid, self.caption)     #打印组id和名对应的职位关系,调取那个值都可以
                temp1 = "%s" %(self.caption)     #打印组id和名对应的职位关系,调取那个值都可以
                return temp1
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        username = Column(String(32))
        group_id = Column(Integer, ForeignKey('group.nid'))        #ForeignKey外键,是group的外键

        # 以列表方式输出,便于以后分隔,否则将以原始对像出
        def __repr__(self):                                         # 只用于格式化打印,针对调取
            temp = "%s - %s: %s" %(self.nid, self.username, self.group_id)     #打印用户的id和名,组id,调取那个值都可以
            return temp

    def init_db():
        Base.metadata.create_all(engine)                           #创建表

    def drop_db():
        Base.metadata.drop_all(engine)                            #删除表

    # 第一步,创建表结构
    # init_db()

    # 第二步 , 1.创建会话
    Session = sessionmaker(bind=engine)
    session = Session()

    # 第二步, 2.在group表中添加数据
    # session.add(Group(caption='dba'))            #给列caption添加数据
    # session.add(Group(caption='ops'))
    # session.commit()                             #提交数据


    # 第二步,3.在user表表添加数据,加外键码
    # session.add_all([
    #     User(username='alex1',group_id=1),       #给user表的列添加数据,并指定外键,指定了类型,就有了限制,如果外键表group中没有对应的ID是无法添加的
    #     User(username='alex2',group_id=2)
    # ])
    # session.commit()

    # 第三步,1.获取单表数据
    # 只是获取用户
    #  单个针对查询
    # ret = session.query(User).filter(User.username == '1').all()       #query为事务操作,filter为指定条件语句,使用的是__repl__方法
    # print(ret)

    #  查询表所有数据及单独抓取
    # ret = session.query(User).all()           #查看user表的所有数据
    # obj = ret[0]                              #获取第一行数据,ret[1]为第二行数据,依此类推
    # print(ret)
    # print(obj)
    # print(obj.nid)                #获取用户id
    # print(obj.username)           #获取用户
    # print(obj.group_id)           #获取组id

    # 第三步,2.联表查询,同时查user和gruop数据
    ret = session.query(User.username).all()                          #只查用户
    print(ret)
    sql = session.query(User,Group).join(Group, isouter=True)        #没有加.all()为显示sql数句
    print(sql)
    ret = session.query(User,Group).join(Group, isouter=True).all()  #打印用户所属组id及对应的组
    print(ret)

    在group表中创始虚拟字段,用于查询把外键相同的数据


    """
    功能:查询一条user表信息
    1.使用relationship('Group',backref='uuu') 定义正反向查询,正向从user到Group的group表,反向是在Group中的虚拟表uuu查user中数据
    2.反向调用为 print(obj.uuu)
    """
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)

    Base = declarative_base()
    # 单表
    class Test(Base):
        __tablename__ = 'test'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        name = Column(String(32))
    # 一对多
    class Group(Base):
        __tablename__ = 'group'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        caption = Column(String(32))
        def __repr__(self):
            temp1 = "%s" %(self.caption)     #打印组id和名对应的职位关系,调取那个值都可以
            return temp1
    class User(Base):
        __tablename__ = 'user'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        username = Column(String(32))
        group_id = Column(Integer, ForeignKey('group.nid'))
        # 新方式查询,便利的调用关系模块,提供正向调用和反向调用(backref为反向)
        group = relationship('Group',backref='uuu')    #在group表中创始虚拟字段,用于查询外键相同的数据


        def __repr__(self):
            temp = "%s - %s: %s" %(self.nid, self.username, self.group_id)
            return temp

    def init_db():
        Base.metadata.create_all(engine)

    def drop_db():
        Base.metadata.drop_all(engine)

    # 第一步,创建表结构
    # init_db()


    # 第二步 , 1.表操作
    Session = sessionmaker(bind=engine)
    session = Session()

    # 第二步, 2.在group中添加数据
    # session.add(Group(caption='dba'))
    # session.add(Group(caption='ddd'))
    # session.commit()

    # 第二步,3.在User表添加数据,加外键码
    # session.add_all([
    #     User(username='alex1',group_id=1),
    #     User(username='alex2',group_id=2)
    # ])
    # session.commit()

    # 第三步,1.获取单表数据
    # 只是获取用户
    # ret = session.query(User).filter(User.username == 'alex1').all()
    # print(ret)
    # ret = session.query(User).all()
    # obj = ret[0]
    # print(ret)
    # print(obj)
    # print(obj.nid)
    # print(obj.username)
    # print(obj.group_id)


    # 第三步,2.联表查询,同时查user和gruop数据
    # ret = session.query(User.username).all()
    # print(ret)
    # sql = session.query(User,Group).join(Group, isouter=True)
    # print(sql)
    # ret = session.query(User,Group).join(Group, isouter=True).all()
    # print(ret)


    #  新方式的两种查询,由于一个用户对应的关系的所有信息,展示在一行
    # 新方式(正向查询) , 从User 到group
    # ret = session.query(User).all()
    # for obj in ret:
    #     # obj 代指user表的一行数据
    #     # obj.group 代指group对象
    #     print(obj.nid,obj.username,obj.group_id,obj.group,obj.group.nid,obj.group.caption)

    # 原始方式
    # ret = session.query(User.username,Group.caption).join(Group,isouter=True).filter(Group.caption == 'DBA').all()
    # print(ret)

    # 新方式(反向查询)  从Group的uuu 到User,查询是DBA都有谁
    obj = session.query(Group).filter(Group.caption == 'DBA').first()
    print(obj.nid)
    print(obj.caption)
    print(obj.uuu)     #使用uuu,查询出一条user表信息

    ---------结果
    1
    dba
    [1 - alex1: 1]      #使用uuu,查询出一条user表信息


    查询一个主机对应的用户


    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)

    Base = declarative_base()

    # 创建表结构,   host ,host_user,host_to_host_user(主机,用户,主机用户的对应关系)
    class Host(Base):
        __tablename__ = 'host'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        hostname = Column(String(32))
        port = Column(String(32))
        ip = Column(String(32))

    class HostUser(Base):
        __tablename__ = 'host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        username = Column(String(32))
        password = Column(String(32))

    class HostToHostUser(Base):
        __tablename__ = 'host_to_host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)

        host_id = Column(Integer,ForeignKey('host.nid'))                    #外键1
        host_user_id = Column(Integer,ForeignKey('host_user.nid'))         #外键2


    def init_db():
        Base.metadata.create_all(engine)

    def drop_db():
        Base.metadata.drop_all(engine)

    #第一步,执行创建表结构
    # init_db()
    # drop_db()

    # 第二步 , 1.表操作
    Session = sessionmaker(bind=engine)
    session = Session()


    # 第三步 1.插入数据   host表,主机信息
    # session.add_all([
    #     Host(hostname='c1',port='22',ip='172.16.0.3'),
    #     Host(hostname='c2',port='22',ip='172.16.0.4'),
    #     Host(hostname='c3',port='22',ip='172.16.0.5'),
    #     Host(hostname='c4',port='22',ip='172.16.0.6'),
    #     Host(hostname='c5',port='22',ip='172.16.0.7'),
    # ])
    # session.commit()

    # 第三步 2.插入数据   User表,用户信息
    # session.add_all([
    #     HostUser(username='root',password='pwd@123'),
    #     HostUser(username='db',password='pwd@123'),
    #     HostUser(username='nb',password='pwd@123'),
    #     HostUser(username='sb',password='pwd@123'),
    # ])
    # session.commit()


    # 第三步 3.插入数据  HostToHostUser表,主机和用户对应关系
    # session.add_all([
    #     HostToHostUser(host_id=1,host_user_id=1),
    #     HostToHostUser(host_id=1,host_user_id=2),
    #     HostToHostUser(host_id=1,host_user_id=3),
    #     HostToHostUser(host_id=2,host_user_id=2),
    #     HostToHostUser(host_id=2,host_user_id=4),
    #     HostToHostUser(host_id=2,host_user_id=3),
    # ])
    # session.commit()


    # 第四步,获取主机1中所有用户,使用查出主机对应的ID和用户ID,相等则输出
    #  取c1主机信息,在hosttohostuser对应关系表中找和c1中的nid相等的host_id即输出,不相等则不输出,"输出的是对应关系表中条件符合的nid号,从而判断有几个"
    host_obj = session.query(Host).filter(Host.hostname == 'c1').first()
    # # host_obj.nid
    host_2_host_user = session.query(HostToHostUser.host_user_id).filter(HostToHostUser.host_id == host_obj.nid).all()
    # print(host_2_host_user)
    #  输出结果[(1,),(2,),(3,)] ,"输出的是对应关系表中条件符合的nid号,从而判断有几个“”
    r = zip(*host_2_host_user)    #zip为转化数据为元组输出
    # print(list(r)[0])
    #输出结果 (1, 2, 3)
    users = session.query(HostUser.username).filter(HostUser.nid.in_(list(r)[0])).all()      #查询c1主机有多少个对应用户
    print(users)


    -------结果
    [('root',), ('db',), ('nb',)]

    多对多,简化查询代码


    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author:Minghu Wang

    '''
    简化查询,给出一个主机条件,就可以查到对应有多少用户,利用relationship实现
    '''

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)

    Base = declarative_base()

    # 创建表结构,   host ,host_user,host_to_host_user(主机,用户,主机用户的对应关系)
    class Host(Base):
        __tablename__ = 'host'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        hostname = Column(String(32))
        port = Column(String(32))
        ip = Column(String(32))

    class HostUser(Base):
        __tablename__ = 'host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        username = Column(String(32))
        password = Column(String(32))

    class HostToHostUser(Base):
        __tablename__ = 'host_to_host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)

        host_id = Column(Integer,ForeignKey('host.nid'))                   #外键1
        host_user_id = Column(Integer,ForeignKey('host_user.nid'))        #外键2

        host = relationship("Host",backref='h')                           # 创建虚拟表 ,多对多,简化查询
        host_user = relationship("HostUser",backref='u')

    def init_db():
        Base.metadata.create_all(engine)

    def drop_db():
        Base.metadata.drop_all(engine)

    # 第一步,执行创建表结构
    # init_db()
    # drop_db()


    # 第二步 , 1.表操作
    Session = sessionmaker(bind=engine)
    session = Session()

    # 第三步 1.插入数据   host表,主机信息
    # session.add_all([
    #     Host(hostname='c1',port='22',ip='172.16.0.3'),
    #     Host(hostname='c2',port='22',ip='172.16.0.4'),
    #     Host(hostname='c3',port='22',ip='172.16.0.5'),
    #     Host(hostname='c4',port='22',ip='172.16.0.6'),
    #     Host(hostname='c5',port='22',ip='172.16.0.7'),
    # ])
    # session.commit()

    # 第三步 2.插入数据   User表,用户信息
    # session.add_all([
    #     HostUser(username='root',password='pwd@123'),
    #     HostUser(username='db',password='pwd@123'),
    #     HostUser(username='nb',password='pwd@123'),
    #     HostUser(username='sb',password='pwd@123'),
    # ])
    # session.commit()


    # 第三步 3.插入数据  HostToHostUser表,主机和用户对应关系
    # session.add_all([
    #     HostToHostUser(host_id=1,host_user_id=1),
    #     HostToHostUser(host_id=1,host_user_id=2),
    #     HostToHostUser(host_id=1,host_user_id=3),
    #     HostToHostUser(host_id=2,host_user_id=2),
    #     HostToHostUser(host_id=2,host_user_id=4),
    #     HostToHostUser(host_id=2,host_user_id=3),
    # ])
    # session.commit()


    # 原始查询,一行语句
    # session.query(HostUser.name).filter(HostUser.nid.in_(session.query(HostToHostUser.host_user_id).filter(HostToHostUser.host_id == session.query(Host.nid).filter(Host.hostname == 'c1'))))

    # 多对多,简化查询,只要给出一个条件就可以查到结果(内部实现多条语句判断,使用relationship实现)
    # 第三步,获取主机1中所有用户,使用查出主机对应的ID和用户ID,相等则输出
    host_obj = session.query(Host).filter(Host.hostname == 'c1').first()
    for item in host_obj.h:
        print(item.host_user.username)

       
       
    ---------结果
    root
    db
    nb

       
       

    最简单的方法查询

    '''
    需要改变class的关系表顺序
    '''

    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)

    Base = declarative_base()


    class HostToHostUser(Base):
        __tablename__ = 'host_to_host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)

        host_id = Column(Integer,ForeignKey('host.nid'))                   #外键1
        host_user_id = Column(Integer,ForeignKey('host_user.nid'))         #外键2

        # host = relationship("Host",backref='h')                          # 多对多,简化查询
        # host_user = relationship("HostUser",backref='u')


    # 创建表结构,   host ,host_user,host_to_host_user(主机,用户,主机用户的对应关系)
    class Host(Base):
        __tablename__ = 'host'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        hostname = Column(String(32))
        port = Column(String(32))
        ip = Column(String(32))

        host_user = relationship('HostUser',secondary=HostToHostUser.__table__,backref='h')

    class HostUser(Base):
        __tablename__ = 'host_user'
        nid = Column(Integer, primary_key=True,autoincrement=True)
        username = Column(String(32))
        password = Column(String(32))

    def init_db():
        Base.metadata.create_all(engine)

    def drop_db():
        Base.metadata.drop_all(engine)

    # 第一步,执行创建表结构
    # init_db()

    # 第二步 , 1.表操作
    Session = sessionmaker(bind=engine)
    session = Session()

    # 多对多,简化查询
    # 第三步,获取主机1中所有用户,使用查出主机对应的ID和用户ID,相等则输出
    host_obj = session.query(Host).filter(Host.hostname == 'c1').first()
    print(host_obj.host_user)
    for item in host_obj.host_user:
        print(item.username)


       
    最最简单的查询,加lambda

    '''
    不需要改变class的关系表顺序
    '''

        from sqlalchemy import create_engine
        from sqlalchemy.ext.declarative import declarative_base
        from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
        from sqlalchemy.orm import sessionmaker, relationship
        engine = create_engine("mysql+pymysql://root:123456@172.16.0.2:3306/s13", max_overflow=5)

        Base = declarative_base()


        # 创建表结构,   host ,host_user,host_to_host_user(主机,用户,主机用户的对应关系)
        class Host(Base):
            __tablename__ = 'host'
            nid = Column(Integer, primary_key=True,autoincrement=True)
            hostname = Column(String(32))
            port = Column(String(32))
            ip = Column(String(32))

            host_user = relationship('HostUser',secondary = lambda: HostToHostUser.__table__,backref='h')        #最重要的一句

        class HostUser(Base):
            __tablename__ = 'host_user'
            nid = Column(Integer, primary_key=True,autoincrement=True)
            username = Column(String(32))
            password = Column(String(32))


        class HostToHostUser(Base):
            __tablename__ = 'host_to_host_user'
            nid = Column(Integer, primary_key=True,autoincrement=True)

            host_id = Column(Integer,ForeignKey('host.nid'))                   #外键1
            host_user_id = Column(Integer,ForeignKey('host_user.nid'))        #外键2

            # host = relationship("Host",backref='h')                           # 多对多,简化查询
            # host_user = relationship("HostUser",backref='u')


        def init_db():
            Base.metadata.create_all(engine)

        def drop_db():
            Base.metadata.drop_all(engine)

        # 第一步,执行创建表结构
        # init_db()

        # 第二步 , 1.表操作
        Session = sessionmaker(bind=engine)
        session = Session()

        # 多对多,简化查询
        # 第三步,获取主机1中所有用户,使用查出主机对应的ID和用户ID,相等则输出
        host_obj = session.query(Host).filter(Host.hostname == 'c1').first()
        print(host_obj.host_user)
        for item in host_obj.host_user:
            print(item.username)

       
       
    ----------结果
    [<__main__.HostUser object at 0x00000000036F4978>, <__main__.HostUser object at 0x00000000036F47B8>, <__main__.HostUser object at 0x00000000036F42E8>]
    root
    db
    nb


    一个连接transport执行多个操作

    import paramiko
    import uuid

    class SSHConnection(object):

        def __init__(self, host='172.16.0.2', port=22, username='root',pwd='pwd@123'):
            self.host = host
            self.port = port
            self.username = username
            self.pwd = pwd
            self.__k = None

        def run(self):
            self.connect()
            pass
            self.close()
       
        #一个连接transport执行多个操作
        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, command):
            ssh = paramiko.SSHClient()
            ssh._transport = self.__transport
            # 执行命令
            stdin, stdout, stderr = ssh.exec_command(command)
            # 获取命令结果
            result = stdout.read()
            return result

        def upload(self,local_path, target_path):
            # 连接,上传
            sftp = paramiko.SFTPClient.from_transport(self.__transport)
            # 将location.py 上传至服务器 /tmp/test.py
            sftp.put(local_path, target_path)

    ssh = SSHConnection()
    ssh.connect()                             #执行创建连接

    #执行命令
    r1 = ssh.cmd('df')                          #第一次操作  执行命令
    print(r1)


    #上传文件
    ssh.upload('s2.py', "/opt/s7.py")          #第二次操作  上传文件
    ssh.close()                                  #执行关闭连接

    利用本地终端操作远端,回车输出,版本1,监听一行

    import paramiko
    import sys
    import os
    import socket
    import select
    import getpass
    from paramiko.py3compat import u
     
    tran = paramiko.Transport(('10.211.55.4', 22,))
    tran.start_client()
    tran.auth_password('wupeiqi', '123')
     
    # 打开一个通道
    chan = tran.open_session()
    # 获取一个终端
    chan.get_pty()
    # 激活器
    chan.invoke_shell()
     
    while True:
        # 监视用户输入和服务器返回数据
        # sys.stdin 处理用户输入
        # chan 是之前创建的通道,用于接收服务器返回信息
        readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)
        if chan in readable:
            try:
                x = u(chan.recv(1024))
                if len(x) == 0:
                    print(' *** EOF ')
                    break
                sys.stdout.write(x)
                sys.stdout.flush()
            except socket.timeout:
                pass
        if sys.stdin in readable:
            inp = sys.stdin.readline()
            chan.sendall(inp)
     
    chan.close()
    tran.close()

    肆意妄为(二),利用本地终端操作远端,带tab版,监听一个字符
    python3.0 代码

    import paramiko
    import sys
    import os
    import socket
    import select
    import getpass
    import termios
    import tty
    from paramiko.py3compat import u
     
    tran = paramiko.Transport(('localhost', 22,))
    tran.start_client()
    tran.auth_password('root', 'pwd@123')
     
    # 打开一个通道
    chan = tran.open_session()
    # 获取一个终端
    chan.get_pty()
    # 激活器
    chan.invoke_shell()
     
     
    # 获取原tty属性
    oldtty = termios.tcgetattr(sys.stdin)             #实现可TAB方法
    try:
        # 为tty设置新属性
        # 默认当前tty设备属性:
        #   输入一行回车,执行
        #   CTRL+C 进程退出,遇到特殊字符,特殊处理。
     
        # 这是为原始模式,不认识所有特殊符号
        # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
        tty.setraw(sys.stdin.fileno())
        chan.settimeout(0.0)
     
        while True:
            # 监视 用户输入 和 远程服务器返回数据(socket)
            # 阻塞,直到句柄可读
            r, w, e = select.select([chan, sys.stdin], [], [], 1)
            if chan in r:
                try:
                    x = u(chan.recv(1024))
                    if len(x) == 0:
                        print(' *** EOF ')
                        break
                    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r:
                x = sys.stdin.read(1)
                if len(x) == 0:
                    break
                chan.send(x)
     
    finally:
        # 重新设置终端属性
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
     
     
    chan.close()
    tran.close()

    肆意妄为(二),利用本地终端操作远端,带tab版,监听一个字符
    python2.0 代码

    import paramiko
    import sys
    import os
    import socket
    import select
    import getpass
    import termios
    import tty
    # from paramiko.py3compat import u
     
    tran = paramiko.Transport(('192.168.11.61', 22,))
    tran.start_client()
    tran.auth_password('audit', '123')
     
    # 打开一个通道
    chan = tran.open_session()
    # 获取一个终端
    chan.get_pty()
    # 激活器
    chan.invoke_shell()
     
     
    # 获取原tty属性
    oldtty = termios.tcgetattr(sys.stdin)
    try:
        # 为tty设置新属性
        # 默认当前tty设备属性:
        #   输入一行回车,执行
        #   CTRL+C 进程退出,遇到特殊字符,特殊处理。
     
        # 这是为原始模式,不认识所有特殊符号
        # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
        tty.setraw(sys.stdin.fileno())
        chan.settimeout(0.0)
     
        while True:
            # 监视 用户输入 和 远程服务器返回数据(socket)
            # 阻塞,直到句柄可读
            r, w, e = select.select([chan, sys.stdin], [], [], 1)
            if chan in r:
                try:
                    x = chan.recv(1024)
                    if len(x) == 0:
                        print(' *** EOF ')
                        break
                    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r:
                x = sys.stdin.read(1)
                if len(x) == 0:
                    break
                chan.send(x)
     
    finally:
        # 重新设置终端属性
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
     
     
    chan.close()
    tran.close()

    -----堡垒机
    1. 堡垒机操作
    (1) useradd wmh       #创建用户
        password wmh

    (2)  vi   .bashrc     #加入终端脚本内容
    /usr/bin/env python3 s7.py
    logout


    (3)登录堡垒机(wmh用户)
    # 会自动执行.bashrc的/usr/bin/env python3 s7.py程序
        提示输入远程的机器用户名,密码


       
       
       

    终极,模拟终端,windows,linux都可以用-------python3.0版本

    import paramiko
    import sys
    import os
    import socket
    import getpass

    from paramiko.py3compat import u

    # windows does not have termios...
    try:
        import termios
        import tty
        has_termios = True
    except ImportError:
        has_termios = False


    def interactive_shell(chan):
        if has_termios:
            posix_shell(chan)
        else:
            windows_shell(chan)


    def posix_shell(chan):
        import select

        oldtty = termios.tcgetattr(sys.stdin)
        try:
            tty.setraw(sys.stdin.fileno())
            tty.setcbreak(sys.stdin.fileno())
            chan.settimeout(0.0)
            log = open('handle.log', 'a+', encoding='utf-8')
            flag = False
            temp_list = []
            while True:
                r, w, e = select.select([chan, sys.stdin], [], [])
                if chan in r:
                    try:
                        x = u(chan.recv(1024))
                        if len(x) == 0:
                            sys.stdout.write(' *** EOF ')
                            break
                        if flag:
                            if x.startswith(' '):
                                pass
                            else:
                                temp_list.append(x)
                            flag = False
                        sys.stdout.write(x)
                        sys.stdout.flush()
                    except socket.timeout:
                        pass
                if sys.stdin in r:
                    x = sys.stdin.read(1)
                    import json

                    if len(x) == 0:
                        break

                    if x == ' ':
                        flag = True
                    else:
                        temp_list.append(x)
                    if x == ' ':
                        log.write(''.join(temp_list))
                        log.flush()
                        temp_list.clear()
                    chan.send(x)

        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)


    def windows_shell(chan):
        import threading

        sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF. ")

        def writeall(sock):
            while True:
                data = sock.recv(256)
                if not data:
                    sys.stdout.write(' *** EOF *** ')
                    sys.stdout.flush()
                    break
                sys.stdout.write(data)
                sys.stdout.flush()

        writer = threading.Thread(target=writeall, args=(chan,))
        writer.start()

        try:
            while True:
                d = sys.stdin.read(1)
                if not d:
                    break
                chan.send(d)
        except EOFError:
            # user hit ^Z or F6
            pass


    def run():
        default_username = getpass.getuser()
        username = input('Username [%s]: ' % default_username)
        if len(username) == 0:
            username = default_username


        hostname = input('Hostname: ')
        if len(hostname) == 0:
            print('*** Hostname required.')
            sys.exit(1)

        tran = paramiko.Transport((hostname, 22,))
        tran.start_client()

        default_auth = "p"
        auth = input('Auth by (p)assword or (r)sa key[%s] ' % default_auth)
        if len(auth) == 0:
            auth = default_auth

        if auth == 'r':
            default_path = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
            path = input('RSA key [%s]: ' % default_path)
            if len(path) == 0:
                path = default_path
            try:
                key = paramiko.RSAKey.from_private_key_file(path)
            except paramiko.PasswordRequiredException:
                password = getpass.getpass('RSA key password: ')
                key = paramiko.RSAKey.from_private_key_file(path, password)
            tran.auth_publickey(username, key)
        else:
            pw = getpass.getpass('Password for %s@%s: ' % (username, hostname))
            tran.auth_password(username, pw)

        # 打开一个通道
        chan = tran.open_session()
        # 获取一个终端
        chan.get_pty()
        # 激活器
        chan.invoke_shell()

        interactive_shell(chan)

        chan.close()
        tran.close()


    if __name__ == '__main__':
        run()

       
       
       
       
       
       
       
       
       
       
       
    终极,模拟终端,windows,linux都可以用---------python2.0版本   
    import paramiko
    import sys
    import os
    import socket
    import getpass

    from paramiko.py3compat import u

    # windows does not have termios...
    try:
        import termios
        import tty
        has_termios = True
    except ImportError:
        has_termios = False


    def interactive_shell(chan):
        if has_termios:
            posix_shell(chan)
        else:
            windows_shell(chan)


    def posix_shell(chan):
        import select

        oldtty = termios.tcgetattr(sys.stdin)
        try:
            tty.setraw(sys.stdin.fileno())
            tty.setcbreak(sys.stdin.fileno())
            chan.settimeout(0.0)
           
            flag = False
            temp_list = []
            while True:
                r, w, e = select.select([chan, sys.stdin], [], [])
                if chan in r:
                    try:
                        x = u(chan.recv(1024))
                        if len(x) == 0:
                            sys.stdout.write(' *** EOF ')
                            break
                        sys.stdout.write(x)
                        sys.stdout.flush()
                    except socket.timeout:
                        pass
                if sys.stdin in r:
                    x = sys.stdin.read(1)
                    import json

                    if len(x) == 0:
                        break
                    chan.send(x)

        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)


    def windows_shell(chan):
        import threading

        sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF. ")

        def writeall(sock):
            while True:
                data = sock.recv(256)
                if not data:
                    sys.stdout.write(' *** EOF *** ')
                    sys.stdout.flush()
                    break
                sys.stdout.write(data)
                sys.stdout.flush()

        writer = threading.Thread(target=writeall, args=(chan,))
        writer.start()

        try:
            while True:
                d = sys.stdin.read(1)
                if not d:
                    break
                chan.send(d)
        except EOFError:
            # user hit ^Z or F6
            pass


    def run():
        # 获取当前登录用户
        username = raw_input('Username ')
        hostname = raw_input('Hostname: ')
        pwd = raw_input('password: ')
       
        tran = paramiko.Transport((hostname, 22,))
        tran.start_client()
        tran.auth_password(username, pwd)
       
        # 打开一个通道
        chan = tran.open_session()
        # 获取一个终端
        chan.get_pty()
        # 激活器
        chan.invoke_shell()

        interactive_shell(chan)

        chan.close()
        tran.close()


    if __name__ == '__main__':
        run()


    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # auth : pangguoping
    import paramiko
    import sys
    import os
    import socket
    import select
    import getpass
    import termios
    import tty
    from paramiko.py3compat import u

    #在mac 执行 python3 脚本.py

    tran = paramiko.Transport(('192.168.11.139', 22,))
    tran.start_client()
    tran.auth_password('oldboy', '123')

    # 打开一个通道
    chan = tran.open_session()
    # 获取一个终端
    chan.get_pty()
    # 激活器
    chan.invoke_shell()
    # 获取原tty属性
    oldtty = termios.tcgetattr(sys.stdin)
    try:
        # 为tty设置新属性
        # 默认当前tty设备属性:
        #   输入一行回车,执行
        #   CTRL+C 进程退出,遇到特殊字符,特殊处理。

        # 这是为原始模式,不认识所有特殊符号
        # 放置特殊字符应用在当前终端,如此设置,将所有的用户输入均发送到远程服务器
        tty.setraw(sys.stdin.fileno())
        chan.settimeout(0.0)

        while True:
            # 监视 用户输入 和 远程服务器返回数据(socket)
            # 阻塞,直到句柄可读
            r, w, e = select.select([chan, sys.stdin], [], [], 1)
            if chan in r:
                try:
                    x = u(chan.recv(1024))
                    if len(x) == 0:
                        print(' *** EOF ')
                        break
                    sys.stdout.write(x)
                    sys.stdout.flush()
                except socket.timeout:
                    pass
            if sys.stdin in r:
                x = sys.stdin.read(1)
                if len(x) == 0:
                    break
                chan.send(x)

    finally:
        # 重新设置终端属性
        termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)

    chan.close()
    tran.close()


    更改后的版本


    # coding:utf-8
    # Author:Alex Li
    import paramiko
    import sys
    import os
    import socket
    import getpass

    # from paramiko.py3compat import u

    # windows does not have termios...
    try:
        import termios
        import tty
        has_termios = True
    except ImportError:
        has_termios = False

    def interactive_shell(chan):
        if has_termios:
            posix_shell(chan)
        else:
            windows_shell(chan)


    def posix_shell(chan):
        import select

        oldtty = termios.tcgetattr(sys.stdin)
        try:
            tty.setraw(sys.stdin.fileno())
            tty.setcbreak(sys.stdin.fileno())
            chan.settimeout(0.0)
            f = open('handle.log','a+')
            tab_flag = False
            temp_list = []
            while True:
                r, w, e = select.select([chan, sys.stdin], [], [])
                if chan in r:
                    try:
                        x = chan.recv(1024)
                        if len(x) == 0:
                            sys.stdout.write(' *** EOF ')
                            break
                        if tab_flag:
                            if x.startswith(' '):
                                pass
                            else:
                                f.write(x)
                                f.flush()
                            tab_flag = False
                        sys.stdout.write(x)
                        sys.stdout.flush()
                    except socket.timeout:
                        pass
                if sys.stdin in r:
                    x = sys.stdin.read(1)
                    if len(x) == 0:
                        break
                    if x == ' ':
                        tab_flag = True
                    else:
                        f.write(x)
                        f.flush()
                    chan.send(x)

        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)


    def windows_shell(chan):
        import threading

        sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF. ")

        def writeall(sock):
            while True:
                data = sock.recv(256)
                if not data:
                    sys.stdout.write(' *** EOF *** ')
                    sys.stdout.flush()
                    break
                sys.stdout.write(data)
                sys.stdout.flush()

        writer = threading.Thread(target=writeall, args=(chan,))
        writer.start()

        try:
            while True:
                d = sys.stdin.read(1)
                if not d:
                    break
                chan.send(d)
        except EOFError:
            # user hit ^Z or F6
            pass


    def run():
        # 获取当前登录用户


        host_list = [
            {'host': "192.168.11.139", 'username': 'oldboy', 'pwd': "123"},
            {'host': "192.168.11.61", 'username': 'alex', 'pwd': "alex3714"},
            {'host': "192.168.11.137", 'username': 'oldboy', 'pwd': "123"},
        ]
        for key,item in enumerate(host_list, 1):
            print(key,item['host'])

        num = raw_input('序号:')
        sel_host = host_list[int(num) -1]
        hostname = sel_host['host']
        username = sel_host['username']
        pwd = sel_host['pwd']

        tran = paramiko.Transport((hostname, 22,))
        tran.start_client()
        tran.auth_password(username, pwd)
        # 打开一个通道
        chan = tran.open_session()
        # 获取一个终端
        chan.get_pty()
        # 激活器
        chan.invoke_shell()

        interactive_shell(chan)

        chan.close()
        tran.close()


    if __name__ == '__main__':
        run()
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       


       
       
       
       
       
       
       
    更改后的3.0版本   
       
    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    # Author:Minghu Wang


    import paramiko
    import sys
    import os
    import socket
    import getpass

    #from paramiko.py3compat import u

    # windows does not have termios...
    try:
        import termios
        import tty
        has_termios = True
    except ImportError:
        has_termios = False


    def interactive_shell(chan):
        if has_termios:
            posix_shell(chan)
        else:
            windows_shell(chan)


    def posix_shell(chan):
        import select

        oldtty = termios.tcgetattr(sys.stdin)
        try:
            tty.setraw(sys.stdin.fileno())
            tty.setcbreak(sys.stdin.fileno())
            chan.settimeout(0.0)
            f = open('handle.log','a+')
            tab_flag = False
            temp_list = []
            while True:
                r, w, e = select.select([chan, sys.stdin], [], [])
                if chan in r:
                    try:
                        x = chan.recv(1024)
                        if len(x) == 0:
                            sys.stdout.write(' *** EOF ')
                            break
                        if tab_flag:
                            if x.startswith(' '):
                                pass
                            else:
                                f.write(x)
                                f.flush()
                            tab_flag = False
                        sys.stdout.write(x)
                        sys.stdout.flush()
                    except socket.timeout:
                        pass
                if sys.stdin in r:
                    x = sys.stdin.read(1)
                    if len(x) == 0:
                        break
                    if x == ' ':
                        tab_flag = True
                    else:
                        f.write(x)
                        f.flush()
                    chan.send(x)

        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)


    def windows_shell(chan):
        import threading

        sys.stdout.write("Line-buffered terminal emulation. Press F6 or ^Z to send EOF. ")

        def writeall(sock):
            while True:
                data = str(sock.recv(256))
                if not data:
                    sys.stdout.write(' *** EOF *** ')
                    sys.stdout.flush()
                    break
                sys.stdout.write(data)
                sys.stdout.flush()

        writer = threading.Thread(target=writeall, args=(chan,))
        writer.start()

        try:
            while True:
                d = sys.stdin.read(1)
                if not d:
                    break
                chan.send(d)
        except EOFError:
            # user hit ^Z or F6
            pass


    def run():
        host_list = [
            {'host': "172.16.0.2", 'username': 'root', 'pwd': "pwd@123"},
            {'host': "192.168.11.61", 'username': 'alex', 'pwd': "alex3714"},
            {'host': "192.168.11.137", 'username': 'oldboy', 'pwd': "123"},
        ]
        for key,item in enumerate(host_list, 1):
            print(key,item['host'])

        num = input('序号:')
        sel_host = host_list[int(num) -1]
        hostname = sel_host['host']
        username = sel_host['username']
        pwd = sel_host['pwd']
        tran = paramiko.Transport((hostname, 22,))
        tran.start_client()
        tran.auth_password(username, pwd)
        # 打开一个通道
        chan = tran.open_session()
        # 获取一个终端
        chan.get_pty()
        # 激活器
        chan.invoke_shell()

        interactive_shell(chan)

        chan.close()
        tran.close()

    if __name__ == '__main__':
        run()

  • 相关阅读:
    C#多线程编程
    div水平垂直居中方法及优缺点
    Socket网络编程(TCP/IP/端口/类)和实例
    LINQ to SQL语句大全
    SQL Server修改表结构后批量更新所有视图
    SQL Server修改表结构后批量更新所有视图
    SQL Server修改表结构后批量更新所有视图
    开源Asp.Net Core小型社区系统DotNetClub
    CkEditor 4.1.3 + CkFinder 2.4
    文本编辑器-->CKEditor+CKFinder使用与配置
  • 原文地址:https://www.cnblogs.com/wangminghu/p/5733762.html
Copyright © 2020-2023  润新知