<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Netmiko on HiDa</title><link>https://www.0niu.cn/tags/netmiko/</link><description>Recent content in Netmiko on HiDa</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Wed, 19 Nov 2025 19:44:31 +0800</lastBuildDate><atom:link href="https://www.0niu.cn/tags/netmiko/index.xml" rel="self" type="application/rss+xml"/><item><title>Netmiko：Python多厂商网络设备SSH自动化库</title><link>https://www.0niu.cn/posts/netmiko-python-network-automation/</link><pubDate>Wed, 19 Nov 2025 19:44:31 +0800</pubDate><guid>https://www.0niu.cn/posts/netmiko-python-network-automation/</guid><description>&lt;p>Netmiko 是一个基于 Paramiko 的 Python 库，专门用于简化网络设备的 SSH 管理。它支持 Cisco、Juniper、Arista、HP、华为、Fortinet 等 100+ 平台，提供统一的 API 接口，让网络工程师可以用一套代码管理不同厂商的设备。&lt;/p>
&lt;h2 id="安装">安装&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install netmiko
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="基本用法">基本用法&lt;/h2>
&lt;h3 id="建立-ssh-连接">建立 SSH 连接&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>device &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.1&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(net_connect&lt;span style="color:#f92672">.&lt;/span>find_prompt()) &lt;span style="color:#75715e"># 输出: cisco5#&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>device_type&lt;/code> 指定设备厂商和型号，常见值包括：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>device_type&lt;/th>
&lt;th>厂商/平台&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>cisco_ios&lt;/td>
&lt;td>Cisco IOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cisco_xe&lt;/td>
&lt;td>Cisco IOS XE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cisco_nxos&lt;/td>
&lt;td>Cisco NX-OS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>juniper_junos&lt;/td>
&lt;td>Juniper JunOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>arista_eos&lt;/td>
&lt;td>Arista EOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>huawei&lt;/td>
&lt;td>华为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>hp_comware&lt;/td>
&lt;td>H3C Comware&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>fortinet&lt;/td>
&lt;td>Fortinet&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="执行-show-命令">执行 show 命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show ip arp&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(output)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Netmiko 会自动处理输出分页（terminal length 0），并去除命令回显和提示符，只返回纯净的命令输出。&lt;/p>
&lt;p>对于耗时较长的命令，可以指定超时时间：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show tech-support&amp;#39;&lt;/span>, delay_factor&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>, max_loops&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">500&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="执行配置命令">执行配置命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>config_commands &lt;span style="color:#f92672">=&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;interface GigabitEthernet0/1&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;description Uplink-to-Core&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;ip address 10.0.0.1 255.255.255.0&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;no shutdown&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_config_set(config_commands)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(output)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 保存配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect&lt;span style="color:#f92672">.&lt;/span>save_config()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>send_config_set()&lt;/code> 会自动进入配置模式、逐条执行命令、退出配置模式。&lt;/p>
&lt;h3 id="批量管理多台设备">批量管理多台设备&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>devices &lt;span style="color:#f92672">=&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass1&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.2&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass2&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.3&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass3&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> device &lt;span style="color:#f92672">in&lt;/span> devices:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output &lt;span style="color:#f92672">=&lt;/span> conn&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show version&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>device[&lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>output[:&lt;span style="color:#ae81ff">100&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>disconnect()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">except&lt;/span> &lt;span style="color:#a6e22e">Exception&lt;/span> &lt;span style="color:#66d9ef">as&lt;/span> e:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>device[&lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: 连接失败 - &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>e&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><content>&lt;p>Netmiko 是一个基于 Paramiko 的 Python 库，专门用于简化网络设备的 SSH 管理。它支持 Cisco、Juniper、Arista、HP、华为、Fortinet 等 100+ 平台，提供统一的 API 接口，让网络工程师可以用一套代码管理不同厂商的设备。&lt;/p>
&lt;h2 id="安装">安装&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pip install netmiko
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="基本用法">基本用法&lt;/h2>
&lt;h3 id="建立-ssh-连接">建立 SSH 连接&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>device &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.1&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(net_connect&lt;span style="color:#f92672">.&lt;/span>find_prompt()) &lt;span style="color:#75715e"># 输出: cisco5#&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>device_type&lt;/code> 指定设备厂商和型号，常见值包括：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>device_type&lt;/th>
&lt;th>厂商/平台&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>cisco_ios&lt;/td>
&lt;td>Cisco IOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cisco_xe&lt;/td>
&lt;td>Cisco IOS XE&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>cisco_nxos&lt;/td>
&lt;td>Cisco NX-OS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>juniper_junos&lt;/td>
&lt;td>Juniper JunOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>arista_eos&lt;/td>
&lt;td>Arista EOS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>huawei&lt;/td>
&lt;td>华为&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>hp_comware&lt;/td>
&lt;td>H3C Comware&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>fortinet&lt;/td>
&lt;td>Fortinet&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="执行-show-命令">执行 show 命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show ip arp&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(output)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Netmiko 会自动处理输出分页（terminal length 0），并去除命令回显和提示符，只返回纯净的命令输出。&lt;/p>
&lt;p>对于耗时较长的命令，可以指定超时时间：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show tech-support&amp;#39;&lt;/span>, delay_factor&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>, max_loops&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">500&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="执行配置命令">执行配置命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>config_commands &lt;span style="color:#f92672">=&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;interface GigabitEthernet0/1&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;description Uplink-to-Core&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;ip address 10.0.0.1 255.255.255.0&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#39;no shutdown&amp;#39;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>output &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_config_set(config_commands)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>print(output)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 保存配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect&lt;span style="color:#f92672">.&lt;/span>save_config()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>send_config_set()&lt;/code> 会自动进入配置模式、逐条执行命令、退出配置模式。&lt;/p>
&lt;h3 id="批量管理多台设备">批量管理多台设备&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>devices &lt;span style="color:#f92672">=&lt;/span> [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.1&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass1&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.2&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass2&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> {&lt;span style="color:#e6db74">&amp;#39;device_type&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;cisco_xe&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;192.168.1.3&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;username&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;admin&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;password&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;pass3&amp;#39;&lt;/span>},
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> device &lt;span style="color:#f92672">in&lt;/span> devices:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">try&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output &lt;span style="color:#f92672">=&lt;/span> conn&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show version&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>device[&lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>output[:&lt;span style="color:#ae81ff">100&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>disconnect()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">except&lt;/span> &lt;span style="color:#a6e22e">Exception&lt;/span> &lt;span style="color:#66d9ef">as&lt;/span> e:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>device[&lt;span style="color:#e6db74">&amp;#34;host&amp;#34;&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: 连接失败 - &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>e&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="高级用法">高级用法&lt;/h2>
&lt;h3 id="使用配置文件管理设备信息">使用配置文件管理设备信息&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> yaml
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(&lt;span style="color:#e6db74">&amp;#39;devices.yaml&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> devices &lt;span style="color:#f92672">=&lt;/span> yaml&lt;span style="color:#f92672">.&lt;/span>safe_load(f)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> device &lt;span style="color:#f92672">in&lt;/span> devices:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show running-config&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>disconnect()
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>devices.yaml 示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#f92672">device_type&lt;/span>: &lt;span style="color:#ae81ff">cisco_xe&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">192.168.1.1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">admin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">password&lt;/span>: &lt;span style="color:#ae81ff">secret&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>- &lt;span style="color:#f92672">device_type&lt;/span>: &lt;span style="color:#ae81ff">juniper_junos&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">192.168.1.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">admin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">password&lt;/span>: &lt;span style="color:#ae81ff">secret&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="配置回滚">配置回滚&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 备份当前配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>backup &lt;span style="color:#f92672">=&lt;/span> net_connect&lt;span style="color:#f92672">.&lt;/span>send_command(&lt;span style="color:#e6db74">&amp;#39;show running-config&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 应用新配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect&lt;span style="color:#f92672">.&lt;/span>send_config_set(new_config)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 如果出错，回滚&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>net_connect&lt;span style="color:#f92672">.&lt;/span>send_config_set(backup&lt;span style="color:#f92672">.&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#ae81ff">\n&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>))
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="多线程批量操作">多线程批量操作&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> concurrent.futures &lt;span style="color:#f92672">import&lt;/span> ThreadPoolExecutor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">from&lt;/span> netmiko &lt;span style="color:#f92672">import&lt;/span> ConnectHandler
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">def&lt;/span> &lt;span style="color:#a6e22e">run_command&lt;/span>(device, command):
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn &lt;span style="color:#f92672">=&lt;/span> ConnectHandler(&lt;span style="color:#f92672">**&lt;/span>device)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> output &lt;span style="color:#f92672">=&lt;/span> conn&lt;span style="color:#f92672">.&lt;/span>send_command(command)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> conn&lt;span style="color:#f92672">.&lt;/span>disconnect()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> device[&lt;span style="color:#e6db74">&amp;#39;host&amp;#39;&lt;/span>], output
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> ThreadPoolExecutor(max_workers&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">10&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> executor:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> futures &lt;span style="color:#f92672">=&lt;/span> [executor&lt;span style="color:#f92672">.&lt;/span>submit(run_command, d, &lt;span style="color:#e6db74">&amp;#39;show version&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">for&lt;/span> d &lt;span style="color:#f92672">in&lt;/span> devices]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> future &lt;span style="color:#f92672">in&lt;/span> futures:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> host, output &lt;span style="color:#f92672">=&lt;/span> future&lt;span style="color:#f92672">.&lt;/span>result()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> print(&lt;span style="color:#e6db74">f&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&lt;/span>&lt;span style="color:#e6db74">{&lt;/span>host&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">: &lt;/span>&lt;span style="color:#e6db74">{&lt;/span>output[:&lt;span style="color:#ae81ff">80&lt;/span>]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">...&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="最佳实践">最佳实践&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>始终使用 try/except 处理连接异常&lt;/strong>：网络环境不稳定，设备可能不可达&lt;/li>
&lt;li>&lt;strong>使用配置文件管理设备信息&lt;/strong>：不要硬编码 IP 和密码&lt;/li>
&lt;li>&lt;strong>批量操作使用多线程&lt;/strong>：串行执行效率低，多线程可大幅提升速度&lt;/li>
&lt;li>&lt;strong>操作前备份配置&lt;/strong>：配置变更前先 &lt;code>show running-config&lt;/code> 保存&lt;/li>
&lt;li>&lt;strong>合理设置超时参数&lt;/strong>：大设备或复杂命令需要增加 &lt;code>delay_factor&lt;/code> 和 &lt;code>max_loops&lt;/code>&lt;/li>
&lt;li>&lt;strong>及时断开连接&lt;/strong>：操作完成后调用 &lt;code>disconnect()&lt;/code> 释放资源&lt;/li>
&lt;/ol>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>Netmiko 是网络自动化的利器，用 Python 替代手工 SSH 登录设备执行命令，大幅提升运维效率。配合配置文件管理和多线程，可以轻松实现数百台设备的批量配置和巡检。&lt;/p></content></item></channel></rss>