zoukankan      html  css  js  c++  java
  • 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服务器上测试

      

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

  • 相关阅读:
    linux sysfs (2)
    微软——助您启动云的力量网络虚拟盛会
    Windows Azure入门教学系列 全面更新啦!
    与Advanced Telemetry创始人兼 CTO, Tom Naylor的访谈
    Windows Azure AppFabric概述
    Windows Azure Extra Small Instances Public Beta版本发布
    DataMarket 一月内容更新
    和Steve, Wade 一起学习如何使用Windows Azure Startup Tasks
    现实世界的Windows Azure:与eCraft的 Nicklas Andersson(CTO),Peter Löfgren(项目经理)以及Jörgen Westerling(CCO)的访谈
    正确使用Windows Azure 中的VM Role
  • 原文地址:https://www.cnblogs.com/bigberg/p/8393649.html
Copyright © 2011-2022 走看看