在SSH Session中回滚长命令导致显示问题
问题
在使用NE40e后,SSH Session中通过“上”、”下”回滚长命令总会遇到显示问题,必须多按几个回车才能刷掉显示乱的屏幕,如下所示:

此问题困扰我很长时间了,一直没仔细研究过,这次趁着有些时间想彻底把这个问题解决下。下面是整个ssh的过程:
SCRT ----- 1st 跳板机 ----- 2nd 跳板机 ----- NE40E
解决
通过对比发现只有当通过脚本登录NE40E时才会有此问题,如果直接SSH登录NE40E就不会有问题,那么问题跟脚本相关么?
2nd 跳板机 ---python script--- NE40E
2nd 跳板机 ---ssh--- NE40E
我把此段Python脚本复制下来,放到Lab中,发现可以通过同样的脚本在NE40E的模拟器中复现此问题,如果不用脚本,那么就没问题,所以问题出在脚本上,脚本很简单,没有什么特别的,如下:
import pexpect
import getpass,os
import re
login = pexpect.spawn('ssh [email protected]')
index = login.expect([
'continue',
'word:',
])
if index == 0:
login.sendline('yes')
time.sleep(1)
login.sendline('test123')
elif index == 1:
login.sendline('test123')
login.interact()
经过查找且和同事讨论后,发现此问题是由于pexpect登录SSH session时窗口大小导致的,默认这个窗口大小是(24 rows, 80 cols),在这个大小中,当输入长命令时,超过了窗口大小,因此出现显示问题,需要通过增加“login.setwinsize(400,400)”来增加这个窗口大小,从而fix此问题,另外注意此命令只在python3中生效,python2中此命令不生效:
$ more test.py
import pexpect
import getpass,os
import re
login = pexpect.spawn('ssh [email protected]')
print(login.getwinsize())
login.setwinsize(400,400)
print(login.getwinsize())
index = login.expect([
'continue',
'word:',
])
if index == 0:
login.sendline('yes')
time.sleep(1)
login.sendline('[email protected]+Network')
elif index == 1:
login.sendline('[email protected]+Network')
login.interact()
$ python3 test.py
(24, 80)
(400, 400)
Info: The max number of VTY users is 21, the number of current VTY users online is 1, and total number of terminal users online is 1.
The current login time is 2022-12-27 19:55:28+08:00.
<SH-01>
虽然问题彻底解决了,但排障中发现NE40E无法针对当前SSH Session查看窗口大小等详细的参数,如果有命令可以展示更详细的session参数,问题应该更容易解决:
<SH-01>dis ssh server session
--------------------------------------------------------------------------------
Session : 1
Conn : VTY 1 <<< issue session
Version : 2.0
State : Started
Username : test
Retry : 1
CTOS Cipher : aes128-ctr
STOC Cipher : aes128-ctr
CTOS Hmac : hmac-sha2-256
STOC Hmac : hmac-sha2-256
CTOS Compress : none
STOC Compress : none
Kex : ecdh-sha2-nistp256
Public Key : ECC
Service Type : stelnet
Authentication Type : password
Connection Port Number : 22
Idle Time : 00:00:00
Total Packet Number : 124
Packet Number after Rekey : 124
Total Data(MB) : 0
Data after Rekey(MB) : 0
Time after Session Established(Minute) : 4
Time after Rekey(Minute) : 4
Session : 2
Conn : VTY 2 <<< good session
Version : 2.0
State : Started
Username : test
Retry : 2
CTOS Cipher : aes128-ctr
STOC Cipher : aes128-ctr
CTOS Hmac : hmac-sha2-256
STOC Hmac : hmac-sha2-256
CTOS Compress : none
STOC Compress : none
Kex : ecdh-sha2-nistp256
Public Key : ECC
Service Type : stelnet
Authentication Type : password
Connection Port Number : 22
Idle Time : 00:00:05
Total Packet Number : 202
Packet Number after Rekey : 202
Total Data(MB) : 0
Data after Rekey(MB) : 0
Time after Session Established(Minute) : 1
Time after Rekey(Minute) : 1
--------------------------------------------------------------------------------