- 來源 | 願碼(ChainDesk.CN)內容編輯
- 願碼Slogan | 鏈接每一個程序員的故事
- 網站 | http://chaindesk.cn
- 願碼願景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長並利用自身優點創造睡後收入。
- 官方公衆號 | 願碼 | 願碼服務號 | 區塊鏈部落
- 免費加入願碼全思惟工程師社羣 | 任一公衆號回覆「願碼」兩個字獲取入羣二維碼
本文閱讀時長:13minpython
在本文中,你將學習如何在配置了Telnet和SSH的服務器上執行基本配置。咱們將首先使用Telnet模塊,以後咱們將使用首選方法實現相同的配置:使用Python中的不一樣模塊進行SSH,瞭解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模塊的工做。ios
在本節中,咱們將瞭解Telnet協議,而後咱們將經過遠程服務器上的telnetlib模塊執行Telnet操做。程序員
Telnet是一種容許用戶與遠程服務器通訊的網絡協議。它主要由網絡管理員用於遠程訪問和管理設備。要訪問設備,請使用終端中遠程服務器的IP地址或主機名運行Telnet命令。shell
Telnet在默認端口號上使用TCP 23。要使用Telnet,請確保它已安裝在你的系統上。若是沒有,請運行如下命令進行安裝:ubuntu
$ sudo apt-get install telnetd
要使用簡單的終端運行Telnet,您只需輸入如下命令:api
$ telnet ip_address_of_your_remote_server
Python具備telnetlib經過Python腳本執行Telnet功能的模塊。在telnet遠程設備或路由器以前,請確保它們已正確配置,若是沒有,則可使用路由器終端中的如下命令進行基本配置:安全
configure terminal enable password 'set_Your_password_to_access_router' username 'set_username' password 'set_password_for_remote_access' line vty 0 4 login local transport input all interface f0/0 ip add 'set_ip_address_to_the_router' 'put_subnet_mask' no shut end show ip interface brief
如今,讓咱們看一下Telnet遠程設備的示例。爲此,建立一個telnet_example.py腳本並在其中編寫如下內容:服務器
import telnetlib import getpass import sys HOST_IP = "your host ip address" host_user = input("Enter your telnet username: ") password = getpass.getpass() t = telnetlib.Telnet(HOST_IP) t.read_until(b"Username:") t.write(host_user.encode("ascii") + b"\n") if password: t.read_until(b"Password:") t.write(password.encode("ascii") + b"\n") t.write(b"enable\n") t.write(b"enter_remote_device_password\n") #password of your remote device t.write(b"conf t\n") t.write(b"int loop 1\n") t.write(b"ip add 10.1.1.1 255.255.255.255\n") t.write(b"int loop 2\n") t.write(b"ip add 20.2.2.2 255.255.255.255\n") t.write(b"end\n") t.write(b"exit\n") print(t.read_all().decode("ascii") )
運行腳本,得到以下輸出:網絡
student@ubuntu:~$ python3 telnet_example.py Output: Enter your telnet username: student Password: server>enable Password: server#conf t Enter configuration commands, one per line. End with CNTL/Z. server(config)#int loop 1 server(config-if)#ip add 10.1.1.1 255.255.255.255 server(config-if)#int loop 23 server(config-if)#ip add 20.2.2.2 255.255.255.255 server(config-if)#end server#exit
在前面的示例中,咱們使用該telnetlib模塊訪問和配置了Cisco路由器。在此腳本中,首先,咱們從用戶那裏獲取用戶名和密碼,以初始化與遠程設備的Telnet鏈接。創建鏈接後,咱們在遠程設備上進行了進一步配置。遠程登陸後,咱們將可以訪問遠程服務器或設備。可是這個Telnet協議有一個很是重要的缺點,即全部數據,包括用戶名和密碼,都是以文本方式經過網絡發送的,這可能會帶來安全風險。所以,現在Telnet不多被使用,而且被稱爲Secure Shell的很是安全的協議所取代,稱爲SSH。dom
經過在終端中運行如下命令來安裝SSH:
$ sudo apt install ssh
此外,在用戶想要通訊的遠程服務器上,必須安裝並運行SSH服務器。SSH使用TCP協議,22默認使用端口號。
您能夠ssh經過終端運行 命令,以下所示:
$ ssh host_name@host_ip_address
如今來學習使用Python中的不一樣模塊來執行SSH,例如subprocess,fabric,Netmiko和Paramiko。如今,咱們將逐一看到這些模塊。
此模塊的底層的進程建立與管理由 Popen 類處理。它提供了很大的靈活性,所以開發者可以處理未被便利函數覆蓋的不常見用例。子程序執行將在新進程中完成。要在Unix / Linux上執行子程序,該類將使用該 os.execvp()函數。要在Windows中執行子程序,該類將使用CreateProcess()函數。
如今,讓咱們看一些有用的參數subprocess.Popen():
class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)
讓咱們看看每一個論點:
· args: 它能夠是一系列程序參數或單個字符串。若是args是序列,則執行args中的第一項。若是args是一個字符串,它建議將args做爲序列傳遞。
· shell:shell參數默認設置爲False,它指定是否使用shell執行程序。若是是shell True,則建議將args做爲字符串傳遞。在 Linux中,若是shell=True,shell默認爲/bin/sh。若是args是字符串,則字符串指定要經過shell執行的命令。
· bufsize:若是bufsize是0(默認狀況下是0),則表示無緩衝,若是bufsize是1,則表示行緩衝。若是bufsize是任何其餘正值,請使用給定大小的緩衝區。若是bufsize是任何其餘負值,則表示徹底緩衝。
· executable:它指定要執行的替換程序。
· stdin,, stdout和stderr:這些參數分別定義標準輸入,標準輸出和標準錯誤。
· preexec_fn: 這被設置爲可調用對象,將在子進程中執行子進程以前調用。
· close_fds: 在Linux中,若是close_fds是真的,全部的文件描述符,除了0,1和2執行子進程以前,將被關閉。在Windows中,若是close_fds是,true那麼子進程將繼承沒有句柄。
· env: 若是值不是None,則映射將爲新進程定義環境變量。
· universal_newlines: 若是該值True則stdout和stderr將被打開,在新行模式下的文本文件。
如今,咱們將看到一個例子subprocess.Popen()。爲此,建立一個 ssh_using_sub.py 腳本並在其中寫入如下內容:
import subprocess import sys HOST="your host username@host ip" COMMAND= "ls" ssh_obj = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) result = ssh_obj.stdout.readlines() if result == []: err = ssh_obj.stderr.readlines() print(sys.stderr, "ERROR: %s" % err) else: print(result)
運行腳本,您將得到以下輸出:
student@ubuntu:~$ python3 ssh_using_sub.py Output : student@192.168.0.106's password: [b'Desktop\n', b'Documents\n', b'Downloads\n', b'examples.desktop\n', b'Music\n', b'Pictures\n', b'Public\n', b'sample.py\n', b'spark\n', b'spark-2.3.1-bin-hadoop2.7\n', b'spark-2.3.1-bin-hadoop2.7.tgz\n', b'ssh\n', b'Templates\n', b'test_folder\n', b'test.txt\n', b'Untitled1.ipynb\n', b'Untitled.ipynb\n', b'Videos\n', b'work\n']
在前面的示例中,首先,咱們導入了子進程模塊,而後咱們定義了要創建SSH鏈接的主機地址。以後,咱們給出了一個經過遠程設備執行的簡單命令。完成全部這些後,咱們將此信息放在 subprocess.Popen()函數中。此函數執行該函數內定義的參數以建立與遠程設備的鏈接。創建SSH鏈接後,執行咱們定義的命令並提供結果。而後咱們在終端上打印SSH的結果,如輸出中所示。
Fabric是一個Python庫,也是一個使用SSH的命令行工具。它用於經過網絡進行系統管理和應用程序部署。咱們也能夠經過SSH執行shell命令。
要使用結構模塊,首先必須使用如下命令安裝它:
$ pip3 install fabric3
如今,咱們將看到一個例子。建立一個 fabfile.py腳本並在其中寫入如下內容:
from fabric.api import * env.hosts=["host_name@host_ip"] env.password='your password' def dir(): run('mkdir fabric') print('Directory named fabric has been created on your host network') def diskspace(): run('df')
運行腳本,您將得到以下輸出:
student@ubuntu:~$ fab dir Output: [student@192.168.0.106] Executing task 'dir' [student@192.168.0.106] run: mkdir fabric Done. Disconnecting from 192.168.0.106... done.
在前面的示例中,首先,咱們導入了fabric.api模塊,而後設置主機名和密碼以與主機網絡鏈接。以後,咱們設置了一個不一樣的任務來執行SSH。所以,爲了執行咱們的程序而不是Python3 fabfile.py,咱們使用了fabutility(fab dir),以後咱們聲明所需的任務應該從咱們的執行fabfile.py。在咱們的例子中,咱們執行了dir任務,該任務'fabric'在遠程網絡上建立了一個名稱目錄。您能夠在Python文件中添加特定任務。它可使用fab結構模塊的實用程序執行。
Paramiko是一個實現SSHv2協議的庫,用於與遠程設備的安全鏈接。Paramiko是一個圍繞SSH的純Python界面。
在使用Paramiko以前,請確保已在系統上正確安裝。若是未安裝,能夠經過在終端中運行如下命令來安裝它:
$ sudo pip3 install paramiko
如今,咱們將看到一個使用示例paramiko。對於此paramiko鏈接,咱們使用的是Cisco設備。Paramiko支持基於密碼和基於密鑰對的身份驗證,以實現與服務器的安全鏈接。在咱們的腳本中,咱們使用基於密碼的身份驗證,這意味着咱們檢查密碼,若是可用,則使用普通用戶名/密碼身份驗證嘗試進行身份驗證。在咱們要對你的遠程設備或多層路由器進行SSH鏈接以前,請確保它們已正確配置,若是沒有,能夠在多層路由器終端中使用如下命令進行基本配置:
configure t ip domain-name cciepython.com crypto key generate rsa How many bits in the modulus [512]: 1024 interface range f0/0 - 1 switchport mode access switchport access vlan 1 no shut int vlan 1 ip add 'set_ip_address_to_the_router' 'put_subnet_mask' no shut exit enable password 'set_Your_password_to_access_router' username 'set_username' password 'set_password_for_remote_access' username 'username' privilege 15 line vty 0 4 login local transport input all end
如今,建立一個pmiko.py腳本並在其中編寫如下內容:
import paramiko import time ip_address = "host_ip_address" usr = "host_username" pwd = "host_password" c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(hostname=ip_address,username=usr,password=pwd) print("SSH connection is successfully established with ", ip_address) rc = c.invoke_shell() for n in range (2,6): print("Creating VLAN " + str(n)) rc.send("vlan database\n") rc.send("vlan " + str(n) + "\n") rc.send("exit\n") time.sleep(0.5) time.sleep(1) output = rc.recv(65535) print(output) c.close
運行腳本,您將得到以下輸出:
student@ubuntu:~$ python3 pmiko.py Output: SSH connection is successfuly established with 192.168.0.70 Creating VLAN 2 Creating VLAN 3 Creating VLAN 4 Creating VLAN 5
在前面的示例中,首先,咱們導入了paramiko模塊,而後咱們定義了鏈接遠程設備所需的SSH憑據。提供憑證後,咱們建立一個實例'c'的paramiko.SSHclient(),它是用於與遠程設備創建鏈接和執行命令或操做主客戶端。建立SSHClient對象容許咱們使用該.connect()函數創建遠程鏈接。而後,咱們設置策略paramiko鏈接,由於默認狀況下, paramiko.SSHclient將SSH策略設置爲拒絕策略狀態。這會致使策略在沒有任何驗證的狀況下拒絕任何SSH鏈接。在咱們的腳本中,咱們忽略了SSH鏈接丟失的可能性 AutoAddPolicy()在不提示的狀況下自動添加服務器主機密鑰的功能。咱們能夠將此策略用於測試目的,但出於安全目的,這在生產環境中不是一個好的選擇。
創建SSH鏈接後,你能夠在設備上執行所需的任何配置或操做。在這裏,咱們在遠程設備上建立了一些虛擬LAN。建立VLAN後,咱們只關閉了鏈接。
在本節中,咱們將瞭解Netmiko。Netmiko庫是Paramiko的高級版本。這是一個multi_vendor基於Paramiko 的圖書館。Netmiko簡化了與網絡設備的SSH鏈接,並對設備進行了特殊操做。在對遠程設備或多層路由器進行SSH鏈接以前,請確保它們已正確配置,若是沒有,則能夠經過Paramiko部分中提到的命令進行基本配置。
如今,讓咱們看一個例子。建立一個 nmiko.py腳本並在其中編寫如下代碼:
from netmiko import ConnectHandler remote_device={ 'device_type': 'cisco_ios', 'ip': 'your remote_device ip address', 'username': 'username', 'password': 'password', } remote_connection = ConnectHandler(**remote_device) #net_connect.find_prompt() for n in range (2,6): print("Creating VLAN " + str(n)) commands = ['exit','vlan database','vlan ' + str(n), 'exit'] output = remote_connection.send_config_set(commands) print(output) command = remote_connection.send_command('show vlan-switch brief') print(command)
運行腳本,您將得到以下輸出:
student@ubuntu:~$ python3 nmiko.py Output: Creating VLAN 2 config term Enter configuration commands, one per line. End with CNTL/Z. server(config)#exit server #vlan database server (vlan)#vlan 2 VLAN 2 modified: server (vlan)#exit APPLY completed. Exiting.... server # .. .. .. .. switch# Creating VLAN 5 config term Enter configuration commands, one per line. End with CNTL/Z. server (config)#exit server #vlan database server (vlan)#vlan 5 VLAN 5 modified: server (vlan)#exit APPLY completed. Exiting.... VLAN Name Status Ports ---- -------------------------------- --------- ------------------------------- 1 default active Fa0/0, Fa0/1, Fa0/2, Fa0/3, Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12, Fa0/13, Fa0/14, Fa0/15 2 VLAN0002 active 3 VLAN0003 active 4 VLAN0004 active 5 VLAN0005 active 1002 fddi-default active 1003 token-ring-default active 1004 fddinet-default active 1005 trnet-default active
在前面的示例中,咱們使用Netmiko庫來執行SSH,而不是Paramiko。在這個腳本中,首先,咱們ConnectHandler從Netmiko庫導入,咱們經過傳入設備字典來創建與遠程網絡設備的SSH鏈接。在咱們的例子中,那個詞典是remote_device。創建鏈接後,咱們執行配置命令以使用該send_config_set()功能建立多個虛擬LAN 。
當咱們使用這種類型.send_config_set()的函數來傳遞遠程設備上的命令時,它會自動將咱們的設備設置爲配置模式。發送配置命令後,咱們還傳遞了一個簡單的命令來獲取有關已配置設備的信息。