paramiko修改本分源碼
阿新 • • 發佈:2018-01-31
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修改本分源碼