Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 如何设置pexpect ssh会话的列宽?_Python 2.7_Ssh_Pexpect - Fatal编程技术网

Python 2.7 如何设置pexpect ssh会话的列宽?

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会话实际上会被提

我正在编写一个简单的python脚本,通过SSH连接到SAN,运行一组命令。最终,每个命令都将与时间戳一起记录到单独的日志中,然后退出。这是因为我们连接到的设备不支持证书ssh连接,并且在其当前固件版本上没有良好的日志记录功能

我似乎遇到的问题是,创建的SSH会话似乎被限制为78个字符宽。每个命令生成的结果都要宽得多—155个字符。这引起了一系列有趣的事情

首先,当前状态下的结果更难解析。其次,由于缓冲区明显较小,最终的volume命令无法正确执行,因为pexpect启动的SSH会话实际上会被提示“按任意键继续”

如何更改pexpect会话的列宽

以下是当前代码(它可以工作,但不完整):

预期产出:

# 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')