pythonsshparamikoswitchingvlan

How do I run multiple configuration commands in Dell EMC OS10 with Paramiko?


I am trying to run a series of commands to configure a vlan on a Dell EMC OS10 server using Paramiko. However I am running into a rather frustrating problem.

I want to run the following

# configure terminal
(config)# interface vlan 3
(conf-if-vl-3)# description VLAN-TEST
(conf-if-vl-3)# end

However, I can't seem to figure out how to achieve this with paramiko.SSHClient().

When I try to use sshclient.exec_command("show vlan") it works great, it runs this command and exits. However, I don't know how to run more than one command with a single exec_command.

If I run sshclient.exec_command("configure") to access the configuration shell, the command completes and I believe the channel is closed, since my next command sshclient.exec_command("interface vlan ...") is not successful since the switch is no longer in configure mode.

If there is a way to establish a persistent channel with exec_command that would be ideal.

Instead I have resorted to a function as follows

chan = sshClient.invoke_shell()
chan.send("configure\n")
chan.send("interface vlan 3\n")
chan.send("description VLAN_TEST\n")
chan.send("end\n")

Oddly, this works when I run it from a Python terminal one command at a time.

However, when I call this function from my Python main, it fails. Perhaps the channel is closed too soon when it goes out of scope from the function call?

Please advise if there is a more reasonable way to do this


Solution

  • Regarding sending commands to the configure mode started with SSHClient.exec_commmand, see:
    Execute (sub)commands in secondary shell/command on SSH server in Python Paramiko

    Though it's quite common that "devices" do not support the "exec" channel at all:
    Executing command using Paramiko exec_command on device is not working


    Regarding your problem with invoke_shell, it's quite possible that the server needs some time to get ready for the next command.

    Quick-and-dirty solution is to "sleep" shortly between the individual send calls.

    Better solution to is to wait for command prompt before sending the next command.