You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 03:07:34