Python3学习之路~13.2 oldboy-4 paramiko demo源码解析及修改
1.github下载paramiko-master.zip。
https://github.com/paramiko/paramiko
2.解压,我们要用的是demos文件夹下的代码,可以将demos文件夹拷贝到pycharm下查看。
3.测试一下demo.py。首先启动一个虚拟机,然后打开本地命令行:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
如上图所示,连接虚拟机失败,说明demo.py目前不支持python3,Python2情况下应该是可以连接成功的。
没关系,我们可以修改一下源代码,使其支持Python3,根据报错信息,我们可以修改interactive.py文件的第87行为:
sys.stdout.write(data.decode())
保存,重新连接试一下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ~]#
成功。
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,均正常。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
[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
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'
>>>