CISCO + Python + Paramiko
Python i biblioteka Paramiko umożliwiają korzystanie z połączeń SSH z urządzeniami CISCO. W poniższym wpisie pokaże jak wykonać dowolną komendę na urządzeniu z CISCO IOS przy pomocy skryptu Python z wykorzystaniem Paramiko.
Przy pomocy biblioteki Paramiko jesteśmy w stanie osiągnąć ten sam efekt który opisywałem we wpisie o bibliotece Netmiko. Jedyna różnica jest taka, że biblioteka Netmiko umożliwiała również połączenia telnet, natomiast Paramiko wspiera tylko SSH.
W celu zainstalowania biblioteki paramiko wykonujemy następującą komendę:
pip install paramiko
PIERWSZY SKRYPT
Najpierw musimy zaimportować bibliotekę paramiko, a następnie tworzymy obiekt SSHClient:
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import paramiko >>> ssh = paramiko.SSHClient()
W moim przypadku chcę się podłączyć przez ssh do routera R1 o adresie IP 192.168.174.200 korzystając z użytkownika admin o haśle cisco:
>>> ssh.connect('192.168.174.200',port=22,username='admin',password='cisco') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\site-packages\paramiko\client.py", line 395, in connect self, server_hostkey_name, server_key File "C:\Python27\lib\site-packages\paramiko\client.py", line 752, in missing_host_key raise SSHException('Server %r not found in known_hosts' % hostname) paramiko.ssh_exception.SSHException: Server '192.168.174.200' not found in known_hosts
Powyższa komenda zwróciła błąd, ponieważ przy używaniu metody connect paramiko sprawdza czy klucz publiczny hosta jest w pliku known_hosts, w tym przypadku go nie ma więc jest zwracany błąd. Możemy to obejść wykonując poniższą komendę:
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
Po wydaniu tej komendy klucz dodawany jest automatycznie do pliku known_hosts. Spróbujmy się teraz połączyć do urządzenia:
>>> ssh.connect('192.168.174.200',port=22,username='admin',password='cisco')
Komenda nie zwróciła błędu, czyli nastąpiło połączenie ssh do routera, można to zweryfikować logując się na urządzenie i wydając komendę: show users
R1#show users Line User Host(s) Idle Location * 0 con 0 idle 00:00:00 2 vty 0 admin idle 00:00:05 192.168.174.1 Interface User Mode Idle Peer Address
Teraz możemy wykonać dowolną komendę i wypisać ją na ekranie:
>> stdin, stdout, stderr = ssh.exec_command('show ip int brief') >>> output = stdout.readlines() >>> print output [u'\r\n', u'Interface IP-Address OK? Method Status Protocol\r\n', u'FastEthernet0/0 192.168.174.200 YES NVRAM up up \r\n', u'FastEthernet1/0 10.0.10.1 YES NVRAM up up \r\n', u'FastEthernet1/1 unassigned YES NVRAM administratively down down ']
W wyniku otrzymaliśmy listę, w celu wypisania jej w bardziej przystępnej postaci na ekranie musimy użyć funkcji join
>>> print ”.join(output)
Interface IP-Address OK? Method Status Protocol FastEthernet0/0 192.168.174.200 YES NVRAM up up FastEthernet1/0 10.0.10.1 YES NVRAM up up FastEthernet1/1 unassigned YES NVRAM administratively down down
W dalszych wpisach pokażę więcej możliwości i przykładowe skrypty z wykorzystaniem biblioteki paramiko.