最近用python写了一个自动登录ssh命令的小工具,在所有功能都实现后,后来发现了一个小bug
就是登录之后的机器,在用vi或者是cat命令打开文件时发现会linux下屏幕只显示一半左右的问题
用的是pexpect模块,代码也是根据网上的例子改的,而且手动ssh的话也没有这个问题
在用一上午的时间排除是其他原因导致的问题后,就去网上找了下pexpect的源码
根据pexpect先调用了spawn函数,然后发现屏幕只显示了24行,。。。。Linux下可用stty size查看屏幕显示的大小
看到源码后,发现
,在调用spawn函数时有更改系统参数的地方,而且正好也是24,80
然后,就猜测可能跟这个有关系,然后在调用interact()函数之前就先调用一下setwinsize(row,column)函数,设置成自己想要的大小。。。。
然后再次登录用stty size就发现已更改生效。。。。
到这里本该结束了。。。。。。。。但是实际上应该是根据自己的本地的设置来显示,而不应该是固定大小。。。。。
然后又再次抱着摸索的精神,去查了下资料,发现python中有fcntl这个模块可以解决这个问题,在调用spawn之前先用fcntl.ioctl模块得到本地的环境中窗口的大小,保存起来后面再调用setwinsize恢复。。:需要导入termios,fcntl包
s= struct.pack("HHHH",0,0,0,0)
a= struct.unpack('hhhh', fcntl.ioctl(sys.stdout.fileno(), termios.TIOCGWINSZ , s))
其中a中存放了屏幕的大小,我们只需要其前两个参数即可。。。。在调用spawn函数之后再恢复即可:setwinsize(a[0],a[1])
这样就能够解决linux下终端只显示一半的问题。。。。。。。。。
其实说这么多。。。。告诉大家个干货。。。用shell实现不会有相关的问题。。。我分析应该是shell中调用spawn时不会修改系统的变量。。。。。