Expect脚本远程获取Cisco Nexus交换机ARP表输出截断问题求助
问题描述
我编写了一段简单的Expect脚本,用于连接Cisco Nexus交换机以获取ARP表(执行show ip arp命令),脚本代码如下:
log_user 0 spawn sshpass -p $password ssh -o StrictHostKeyChecking=no -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc -o HostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 "$user\@$host" log_user 1 expect "# " { send "show ip arp | no-more\r" } expect "# " { send "exit\r"}
直接在交换机上执行show ip arp | no-more可得到完整输出,但通过远程主机执行该脚本时,输出被截断(仅显示前80行)。请问如何获取完整输出?是否可通过spawn或SSH的相关参数解决?
解决方法
1. 强制调整终端行数
输出截断的核心原因是SSH连接时默认终端行数为80,交换机据此限制了输出长度,可通过两种方式修改:
- 登录后设置终端参数
在执行ARP查询前,先发送终端行数列数配置命令:log_user 0 spawn sshpass -p $password ssh -o StrictHostKeyChecking=no -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc -o HostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 "$user\@$host" log_user 1 expect "# " { send "stty rows 1000 columns 200\r" } expect "# " { send "show ip arp | no-more\r" } expect "# " { send "exit\r"} - SSH命令中直接指定终端配置
通过SSH的-t参数强制分配伪终端,并预执行终端设置:log_user 0 spawn sshpass -p $password ssh -o StrictHostKeyChecking=no -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc -o HostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 -t -t "$user\@$host" "stty rows 1000; show ip arp | no-more" log_user 1 expect eof
2. 使用非交互式SSH执行命令
跳过交互式登录流程,直接通过SSH远程执行命令,完全规避终端尺寸限制:
log_user 0 spawn sshpass -p $password ssh -o StrictHostKeyChecking=no -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc -o HostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 "$user\@$host" "show ip arp | no-more" log_user 1 expect eof
这种方式无需处理交换机提示符,直接获取完整命令输出,稳定性更高。
3. 配置Expect的终端初始化参数
在spawn前设置Expect的终端环境,强制指定大尺寸终端:
set env(TERM) xterm set stty_init "rows 1000 columns 200" log_user 0 spawn sshpass -p $password ssh -o StrictHostKeyChecking=no -o Ciphers=+aes128-cbc,3des-cbc,aes192-cbc,aes256-cbc -o HostKeyAlgorithms=+ssh-rsa -oKexAlgorithms=+diffie-hellman-group-exchange-sha1 "$user\@$host" log_user 1 expect "# " { send "show ip arp | no-more\r" } expect "# " { send "exit\r"}
通过stty_init定义终端行和列数,让交换机返回完整ARP表内容。
内容的提问来源于stack exchange,提问作者pacionet
相关产品推荐
相关产品推荐

