• paramiko修改本分源码


    一、获取paramiko源码

      环境:Python3

      下载地址:https://github.com/paramiko/paramiko

      使用的是 demos这个文件夹

    二、修改部分源码用以登入

      2.1 windwos使用paramiko

      切换到demos文件夹下 

    G:pythonuntitledstudy13demos>python demo.py
    
    
    #报错
    File "G:pythonuntitledstudy13demosinteractive.py", line 84, in writeall
    sys.stdout.write(data)
    
    TypeError: write() argument must be str, not bytes
    
    
    # python3中socket传输是bytes类型,而这边接收的是str类型
    

      修改报错的  interactive.py , line 84

        def writeall(sock):
            while True:
                data = sock.recv(256)
                if not data:
                    sys.stdout.write('
    *** EOF ***
    
    ')
                    sys.stdout.flush()
                    break
                sys.stdout.write(data.decode())  # 将原本的data 解码
                sys.stdout.flush()
    
    # data.decode() 即可
    

      改完之后,输入ip 和 密码可以登入了

      

     三、修改部分源码以记录输入的命令

      从上图可以看出,通过paramiko中的demo.py 连接服务器,执行的命令是从“Here we go” 后面正式开始的,也就是在此之后的命令是通过paramiko封装的,用以发往不同的服务器。所以我们需要找到这个位置,查看它们的源码。

     chan = t.open_session()
        chan.get_pty()
        chan.invoke_shell()
        print('*** Here we go!
    ')
        interactive.interactive_shell(chan)
        chan.close()
        t.close()
    
    
    # 可以看到  print('*** Here we go!
    ') 后面
    # 运行的一个函数 interactive.interactive_shell(chan)
    # 所以要去看这个函数写的什么
    

      修改interactive_shell(chan) 中 posix_shell(chan)函数, 以记录所有输入的字符(命令)

            cmd = []  # 定义一个空列表,记录所有输入的字符
            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)
                    if len(x) == 0:
                        break
                    if x == "
    ":   # 回车表示一条命令输入完成
                        cmd_str = "".join(cmd)  # 拼接命令
                        print('
    ' + '-->' + cmd_str)
                        cmd = []  # 清空cmd列表
                    else:
                        cmd.append(x)  # 记录输入的字符
                    chan.send(x)
    
        finally:
            termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
    

      在linux服务器上测试

      

      这样输入的命令已经可以看到了。

  • 相关阅读:
    12.3
    团队项目第一阶段冲刺第一天
    4.22
    4.21 re重要功能
    12.1
    12.2
    4.17
    4.16
    css设置子元素相对于父元素保持位置不变(含有滚动条的父元素)
    git操作和npm操作清单
  • 原文地址:https://www.cnblogs.com/bigberg/p/8393649.html
Copyright © 2020-2023  润新知