from netmiko import ConnectHandler,NetmikoTimeoutException,NetmikoAuthenticationException
import logging
import getpass
import time
#class Login:
# password = getpass.getpass('Password:')
host={
'172.20.20.67',
'172.20.20.66',
};
commands = input('请输入命令:')
for huawei in host:
{
'device_type': "huawei",
'ip': huawei,
'port': '22',
'username': 'ttsx',
'password': 'password',
}
logging.basicConfig(filename="test.log", level=logging.DEBUG)
huawei = {'device_type': 'huawei', 'ip': huawei,'username': 'ttsx', 'password': 'password','port': 22}
net_connect = ConnectHandler(**huawei)
sshConfirm = net_connect.find_prompt()
print('login ' + sshConfirm)
output = net_connect.send_config_set(commands)
print(output)
登录设备后发生了什么?
netmiko 可以通过 ssh 配置网络设备,那么它登录到设备之后,做了什么动作呢?
我们可以从网络设备的 LOG 中看到相关信息,以下为本次实验中的一些 LOG:
在这里插入图片描述
send_command
从 LOG 的第二部分可以看到,当执行 send_command 方法时,netmiko 先输入了取消分屏的命令 screen-length disable ,在进行了对应的命令,这样在有大量输出时,可以保证输出内容是完整的。
其实不仅是华三设备,netmiko 对其他设备如思科、华为等都做了适配,登录设备之后,都会先执行对应的取消分屏的命令。
所以,这里可以总结一个注意点,即:
设备登录使用的用户名需要有执行取消分屏命令的权限(比如 level 0 用户可能无该命令,则无法收集信息)。
send_config_set
从 LOG 的第一部分可以看到,当执行send_config_set 方法时,netmiko 不但输入了取消分屏的命令,还执行了system-view进入了系统视图下,之后才执行了我们输入的命令。
从这个方法的名字 send_config_set 可以看出,netmiko 认为此时输入的是一系列配置命令,所以直接帮我们进入了系统视图下。
对比其他设备 cisco,netmiko 则会帮我们执行 config terminal进入配置模式,读者可以自行进行验证。
当命令执行完成,netmiko 帮我们退出了系统视图,之后中断了 SSH 连接。
这里第二个注意点:
使用 send_config_set 方法时,需要用户具有配置权限。
常用方法
-
net_connect.send_command() # 向下发送命令,返回输出(基于模式)
-
net_connect.send_command_timing() # 沿通道发送命令,返回输出(基于时序)
-
net_connect.send_config_set() # 将配置命令发送到远程设备,此模式默认进到交换机里为全局配置模式,非用户模式,如果要执行用户模式下的某些命令,需要使用上一条方法。
-
net_connect.send_config_from_file() # 发送从文件加载的配置命令
-
net_connect.save_config() # 将running#config保存到startup#config
-
net_connect.enable() # 输入启用模式 net_connect.find_prompt() # 返回当前路由器提示符
-
net_connect.commit() # 在Juniper和IOS#XR上执行提交操作
-
net_connect.disconnect() # 关闭连接 net_connect.write_channel() # 通道的低级写入
-
net_connect.read_channel() # 通道的低级写入
根据方法,选择相应命令,否则无法得到想要的结果