1. 程式人生 > >paramiko修改本分源碼

paramiko修改本分源碼

div brush linux 服務 data itl 使用 pass bsp

一、獲取paramiko源碼

  環境:Python3

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

  使用的是 demos這個文件夾

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

  2.1 windwos使用paramiko

  切換到demos文件夾下 

G:\python\untitled\study13\demos>python demo.py


#報錯
File "G:\python\untitled\study13\demos\interactive.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(‘\r\n*** EOF ***\r\n\r\n‘)
                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!\n‘)
    interactive.interactive_shell(chan)
    chan.close()
    t.close()


# 可以看到  print(‘*** Here we go!\n‘) 後面
# 運行的一個函數 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(‘\r\n*** EOF\r\n‘)
                        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 == "\r":   # 回車表示一條命令輸入完成
                    cmd_str = "".join(cmd)  # 拼接命令
                    print(‘\n‘ + ‘-->‘ + cmd_str)
                    cmd = []  # 清空cmd列表
                else:
                    cmd.append(x)  # 記錄輸入的字符
                chan.send(x)

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

  在linux服務器上測試

  技術分享圖片

  這樣輸入的命令已經可以看到了。

paramiko修改本分源碼