Python3学习之路~13.2 oldboy-4 paramiko demo源码解析及修改

1.github下载paramiko-master.zip。

https://github.com/paramiko/paramiko

2.解压,我们要用的是demos文件夹下的代码,可以将demos文件夹拷贝到pycharm下查看。

3.测试一下demo.py。首先启动一个虚拟机,然后打开本地命令行:

D:\python-study\s14\Day13\demos>python3 demo.py
Hostname: 192.168.198.128
*** Unable to open host keys file
*** WARNING: Unknown host key!
Username [zhengna]: root
Auth by (p)assword, (r)sa key, or (d)ss key? [p] p
Password for root@192.168.198.128:
*** Here we go!

Line-buffered terminal emulation. Press F6 or ^Z to send EOF.

Exception in thread Thread-3:
Traceback (most recent call last):
  File "D:\software\Python3.6.5\lib\threading.py", line 916, in _bootstrap_inner

    self.run()
  File "D:\software\Python3.6.5\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "D:\python-study\s14\Day13\demos\interactive.py", line 87, in writeall
    sys.stdout.write(data)
TypeError: write() argument must be str, not bytes
View Code

如上图所示,连接虚拟机失败,说明demo.py目前不支持python3,Python2情况下应该是可以连接成功的。

没关系,我们可以修改一下源代码,使其支持Python3,根据报错信息,我们可以修改interactive.py文件的第87行为:

sys.stdout.write(data.decode())

保存,重新连接试一下:

D:\python-study\s14\Day13\demos>python3 demo.py
Hostname: 192.168.198.128
*** Unable to open host keys file
*** WARNING: Unknown host key!
Username [zhengna]: root
Auth by (p)assword, (r)sa key, or (d)ss key? [p] p
Password for root@192.168.198.128:
*** Here we go!

Line-buffered terminal emulation. Press F6 or ^Z to send EOF.

Last login: Tue Aug 20 00:39:41 2019 from 192.168.198.1
[root@hadoop ~]# 
View Code

成功。

3.连接到linux虚拟机后还存在问题,比如

如上图所示,显示乱码,是因为linux终端有颜色,而我们现在使用的是windows下的命令行没有颜色,如果我们现在也使用的是linux就完美了。

再者,我们可以试一下top命令,在linux下会实时刷新,在windows下非常不好用,交互很不好(显示乱七八糟,Ctrl+C也无法停止,一直在刷新)。

没办法,还是得在linux下测试。

1.在linux下安装Python3和paramiko模块,安装完后检查:

[root@hadoop ~]# python3
Python 3.6.1 (default, Mar  8 2019, 04:32:18) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>> 

如上说明已安装。

2.将paramiko-master.zip拷贝到/root/下,解压,连接,测试top,均正常。

[root@hadoop ~]# unzip paramiko-master.zip 
[root@hadoop ~]# ll
drwxr-xr-x  7 root root    4096 Jun 23 18:56 paramiko-master
-rw-r--r--  1 root root  382671 Aug 20 01:21 paramiko-master.zip
[root@hadoop ~]# cd paramiko-master/demos/
[root@hadoop demos]# ll
total 64
-rwxr-xr-x 1 root root 4757 Jun 23 18:56 demo_keygen.py
-rwxr-xr-x 1 root root 5449 Jun 23 18:56 demo.py
-rw-r--r-- 1 root root 5910 Jun 23 18:56 demo_server.py
-rw-r--r-- 1 root root 4072 Jun 23 18:56 demo_sftp.py
-rw-r--r-- 1 root root 3360 Jun 23 18:56 demo_simple.py
-rw-r--r-- 1 root root 7250 Jun 23 18:56 forward.py
-rw-r--r-- 1 root root 2776 Jun 23 18:56 interactive.py
-rwxr-xr-x 1 root root 6363 Jun 23 18:56 rforward.py
-rw-r--r-- 1 root root  883 Jun 23 18:56 test_rsa.key
-rw-r--r-- 1 root root  887 Jun 23 18:56 user_rsa_key
-rw-r--r-- 1 root root  229 Jun 23 18:56 user_rsa_key.pub
[root@hadoop demos]# python3 demo.py
Hostname: 192.168.198.129
*** Unable to open host keys file
*** WARNING: Unknown host key!
Username [root]: root
Auth by (p)assword, (r)sa key, or (d)ss key? [p] p
Password for root@192.168.198.129: 
*** Here we go!

Last login: Tue Aug 20 13:12:03 2019 from 192.168.198.1
[root@localhost ~]# top #显示正常
top - 13:27:54 up 17 min,  3 users,  load average: 0.00, 0.01, 0.05
Tasks:  83 total,   1 running,  82 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997960 total,   716064 free,   132208 used,   149688 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.   698724 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND     
  1357 root      20   0  161840   2156   1548 R  0.3  0.2   0:00.05 top         
     1 root      20   0  127780   6408   4076 S  0.0  0.6   0:01.38 systemd     
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd    
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.05 ksoftirqd/0 
     5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:+ 
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0 
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh      
     9 root      20   0       0      0      0 S  0.0  0.0   0:00.46 rcu_sched   
    10 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 lru-add-dr+ 
    11 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 watchdog/0  
    13 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs   
    14 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns       
    15 root      20   0       0      0      0 S  0.0  0.0   0:00.00 khungtaskd  
    16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback   
    17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd 
    18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset      
    19 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kblockd     
View Code

3.我们尝试一下修改文件。

你会发现,在屏幕上方好像又出现了一个小屏幕,两个屏幕重合。

这个是paramiko模拟SSH的一个bug,本来vi test.txt进入编辑界面,这个界面大小应该是可以随着屏幕放大缩小而自动放大缩小的,但是现在不行,只有一个小屏幕(应该是因为paramiko给它定义了固定大小)。

所有,使用paramiko来操作SSH还是不够智能,anyway,它已经可以实现交互了。

那么现在我们需要做的就是把每条输入的命令记录下来就可以了。

它是一个python模拟的ssh,基于socket实现的,所以它的命令交互就是它的socket发一条数据,然后返回一条结果。所以我们只需要在socket发送之前,将命令同时记录在数据库中即可。

现在我们只需要找到这个socket发送之前的代码。

我们想要修改源代码,首先先找到一个切入点。

如下图所示

当我们第一次进入ssh时,首先显示了一行“Here we go!”,说明主程序是从这里开始进入。

首先研读一下源码,接着尝试修改代码,在interactive.py加入如下代码:

测试可以看出,输入的命令都抓到了

现在我们已经拿到命令记录了,只需要将命令写到数据库记录里就可以了。

现在我们要设计数据库。

……

 

traceback模块没讲,一个可以抓取异常的模块。

 getpass.getuser模块

[root@hadoop demos]# python3
Python 3.6.1 (default, Mar 8 2019, 04:32:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import getpass
>>> getpass.getuser()
'root'
>>>

 

posted @ 2024-07-02 19:39  zhengna  阅读(23)  评论(0编辑  收藏  举报