Python 2.7 如何设置pexpect ssh会话的列宽?
我正在编写一个简单的python脚本,通过SSH连接到SAN,运行一组命令。最终,每个命令都将与时间戳一起记录到单独的日志中,然后退出。这是因为我们连接到的设备不支持证书ssh连接,并且在其当前固件版本上没有良好的日志记录功能 我似乎遇到的问题是,创建的SSH会话似乎被限制为78个字符宽。每个命令生成的结果都要宽得多—155个字符。这引起了一系列有趣的事情 首先,当前状态下的结果更难解析。其次,由于缓冲区明显较小,最终的volume命令无法正确执行,因为pexpect启动的SSH会话实际上会被提示“按任意键继续” 如何更改pexpect会话的列宽 以下是当前代码(它可以工作,但不完整): 预期产出:Python 2.7 如何设置pexpect ssh会话的列宽?,python-2.7,ssh,pexpect,Python 2.7,Ssh,Pexpect,我正在编写一个简单的python脚本,通过SSH连接到SAN,运行一组命令。最终,每个命令都将与时间戳一起记录到单独的日志中,然后退出。这是因为我们连接到的设备不支持证书ssh连接,并且在其当前固件版本上没有良好的日志记录功能 我似乎遇到的问题是,创建的SSH会话似乎被限制为78个字符宽。每个命令生成的结果都要宽得多—155个字符。这引起了一系列有趣的事情 首先,当前状态下的结果更难解析。其次,由于缓冲区明显较小,最终的volume命令无法正确执行,因为pexpect启动的SSH会话实际上会被提
# show controller-statistics
Durable ID CPU Load Power On Time (Secs) Bytes per second IOPS Number of Reads Number of Writes Data Read Data Written
---------------------------------------------------------------------------------------------------------------------------------------------------------
controller_A 0 45963169 1573.3KB 67 386769785 514179976 6687.8GB 5750.6GB
controller_B 20 45963088 4627.4KB 421 3208370173 587661282 63.9TB 5211.2GB
---------------------------------------------------------------------------------------------------------------------------------------------------------
Success: Command completed successfully.
# show vdisk-statistics
Name Serial Number Bytes per second IOPS Number of Reads Number of Writes Data Read Data Written
------------------------------------------------------------------------------------------------------------------------------------------------
CRS 00c0ff13349e000006d5c44f00000000 0B 0 45861 26756 3233.0MB 106.2MB
DATA 00c0ff1311f300006dd7c44f00000000 2282.4KB 164 23229435 76509765 5506.7GB 1605.3GB
DATA1 00c0ff1311f3000087d8c44f00000000 2286.5KB 167 23490851 78314374 5519.0GB 1603.8GB
DATA2 00c0ff1311f30000c2f8ce5700000000 0B 0 26 4 1446.9KB 65.5KB
FRA 00c0ff13349e000001d8c44f00000000 654.8KB 5 3049980 15317236 1187.3GB 1942.1GB
FRA1 00c0ff13349e000007d9c44f00000000 778.7KB 6 3016569 15234734 1179.3GB 1940.4GB
------------------------------------------------------------------------------------------------------------------------------------------------
Success: Command completed successfully.
# show volume-statistics
Name Serial Number Bytes per second IOPS Number of Reads Number of Writes Data Read Data Written
-----------------------------------------------------------------------------------------------------------------------------------------------------
CRS_v001 00c0ff13349e0000fdd6c44f01000000 14.8KB 5 239611146 107147564 1321.1GB 110.5GB
DATA1_v001 00c0ff1311f30000d0d8c44f01000000 2402.8KB 218 1701488316 336678620 33.9TB 3184.6GB
DATA2_v001 00c0ff1311f3000040f9ce5701000000 0B 0 921 15 2273.7KB 2114.0KB
DATA_v001 00c0ff1311f30000bdd7c44f01000000 2303.4KB 209 1506883611 250984824 30.0TB 2026.6GB
FRA1_v001 00c0ff13349e00001ed9c44f01000000 709.1KB 28 25123082 161710495 1891.0GB 2230.0GB
FRA_v001 00c0ff13349e00001fd8c44f01000000 793.0KB 34 122052720 245322281 3475.7GB 3410.0GB
-----------------------------------------------------------------------------------------------------------------------------------------------------
Success: Command completed successfully.
打印到终端的输出(如前所述,第三个命令在其当前状态下不会执行):
作为起点:,SAN有一个禁用寻呼机的命令。请参阅关闭设置cli参数寻呼机的文档
。执行该命令可能就足够了。它可能还有一个命令来设置用于格式化输出的终端行和列,尽管我找不到
回答您的问题:当ssh客户端连接到服务器并请求交互式会话时,它可以选择为会话的服务器端请求PTY(伪tty)。当它这样做时,它会通知服务器TTY应该使用的行、列和终端类型。您的SAN可能会接受PTY请求,并使用行和列值格式化其输出。也可能不是
ssh客户机从TTY获取PTY请求的行和列作为其标准输入。这是pexpect用来与ssh通信的PTY。
讨论如何设置pexpect会话的终端大小。据我所知,Ssh不支持行或列环境变量,因此我怀疑这是否可行。但是,在生成ssh之后,它应该可以工作:
child = pexpect.spawn(cmd)
child.setwinsize(400,400)
如果您对此有问题,可以尝试在ssh之前在本地调用stty
来设置终端大小:
child=pexpect.spawn('stty rows x cols y; ssh user@host')
最后,您需要确保ssh确实请求会话的PTY。在某些情况下,默认情况下它会这样做,这应该包括您运行它的方式。但是它有一个命令行选项-tt
,强制它分配一个PTY。您可以将该选项添加到ssh命令行,以确保:
child=pexpect.spawn('ssh -tt user@host')
or
child=pexpect.spawn('stty rows x cols y; ssh -tt user@host')
这些建议效果很好。剧本现在正在顺利地进行着。非常感谢!
child = pexpect.spawn(cmd)
child.setwinsize(400,400)
child=pexpect.spawn('stty rows x cols y; ssh user@host')
child=pexpect.spawn('ssh -tt user@host')
or
child=pexpect.spawn('stty rows x cols y; ssh -tt user@host')