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服务器上测试

  

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

原文地址:https://www.cnblogs.com/bigberg/p/8393649.html