Skip to the content.

Show commands that prompt for more information

In these cases, I generally use the send_command_timing() method (which doesn’t look for prompts)

For example, a CLI interaction that looks like this:

pynet-rtr1#copy running-config flash:test1.txt
Destination filename [test1.txt]? 
5587 bytes copied in 1.316 secs (4245 bytes/sec)

pynet-rtr1#
cmd1 = "copy running-config flash:test1.txt
output = net_connect.send_command_timing(cmd1)
if 'Destination filename' in output:
    output += net_connect.send_command_timing("\n")
print(output)

Enable Netmiko logging of all reads and writes of the communications channel

This will create a file named ‘test.log’ in the current working directory.

import logging
logging.basicConfig(filename='test.log', level=logging.DEBUG)
logger = logging.getLogger("netmiko")

Does Netmiko support connecting via a terminal server

There is a ‘terminal_server’ device_type that basically does nothing post SSH connect. This means you have to manually handle the interaction with the terminal server to connect to the end device. After you are fully connected to the end network device, you can then ‘redispatch’ and Netmiko will behave normally

from __future__ import unicode_literals, print_function
import time
from netmiko import ConnectHandler, redispatch

net_connect = ConnectHandler(
    device_type='terminal_server',        # Notice 'terminal_server' here
    ip='10.10.10.10', 
    username='admin', 
    password='admin123', 
    secret='secret123')

# Manually handle interaction in the Terminal Server 
# (fictional example, but hopefully you see the pattern)
# Send Enter a Couple of Times
net_connect.write_channel("\r\n")
time.sleep(1)
net_connect.write_channel("\r\n")
time.sleep(1)
output = net_connect.read_channel()
print(output)                             # Should hopefully see the terminal server prompt

# Login to end device from terminal server
net_connect.write_channel("connect 1\r\n")
time.sleep(1)

# Manually handle the Username and Password
max_loops = 10
i = 1
while i <= max_loops:
    output = net_connect.read_channel()
    
    if 'Username' in output:
        net_connect.write_channel(net_connect.username + '\r\n')
        time.sleep(1)
        output = net_connect.read_channel()

    # Search for password pattern / send password
    if 'Password' in output:
        net_connect.write_channel(net_connect.password + '\r\n')
        time.sleep(.5)
        output = net_connect.read_channel()
        # Did we successfully login
        if '>' in output or '#' in output:
            break

    net_connect.write_channel('\r\n')
    time.sleep(.5)
    i += 1

# We are now logged into the end device 
# Dynamically reset the class back to the proper Netmiko class
redispatch(net_connect, device_type='cisco_ios')

# Now just do your normal Netmiko operations
new_output = net_connect.send_command("show ip int brief")

Installing Netmiko develop branch (with Poetry support)

To install the Netmiko develop branch follow this process.

  1. Install Python poetry. This should be documented online.
  2. export PATH=”/home//.local/bin:$PATH" # make sure poetry is on your $PATH
  3. git clone https://github.com/ktbyers/netmiko
  4. cd netmiko # change dir into the base of the Netmiko repository.
  5. Create a new virtual environment
# Use the appropriate python3 for your machine
# This creates a virtual environment named .venv
python3.10 -m venv .venv
  1. source .venv/bin/activate # Activate virtual env
  2. poetry install # Install all of the Netmiko dependencies