一、获取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服务器上测试

  

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

最新文章

  1. 夺命雷公狗-----React_native---4---初始化项目
  2. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!
  3. Hadoop生态系统
  4. jsp_属性范围_application
  5. C语言 复杂的栈(链表栈)
  6. ios网站,博客
  7. setTimeout与setInterval方法的区别
  8. 极光推送 PHP sdk
  9. 使用pycharm以及用pycharm句子切分调试
  10. WCF兼容WebAPI输出Json格式数据,从此WCF一举两得
  11. print 与标准输出
  12. hive中的几个参数:元数据配置、仓库位置、打印表字段相关参数
  13. 进阶之路(中级篇) - 018 基于arduino的简易版智能衣架
  14. Docker常用命令<转>
  15. css修改select默认样式
  16. WPF 元素的查找
  17. en_a
  18. linux 利用cat写入一段文件
  19. 〖Linux〗Shell脚本修改输出文字颜色
  20. Maven新建项目产生Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resource

热门文章

  1. oracle安装出错/runInstaller
  2. 第10讲:利用SQL语言实现关系代数操作
  3. Linux环境下Web环境搭建——Nginx
  4. linux 常用命令-ps命令
  5. Wpf+数据库代码封装+策略模式封装
  6. Codeforces Round #258 (Div. 2) 容斥+Lucas
  7. Keil MDK中的Code, RO-data , RW-data, ZI-data分别代表什么意思?(转)
  8. 蜗牛慢慢爬 LeetCode 9. Palindrome Number [Difficulty: Easy]
  9. pxe前期网络准备
  10. php单例模式 (转