您的位置:首页 > 编程语言 > Python开发

python实现ssh自动化登录遇到的坑

2015-10-19 17:20 387 查看
最近用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时不会修改系统的变量。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: