摘要:子程序執行將在新進程中完成。要在上執行子程序,該類將使用該函數。如果是字符串,則字符串指定要通過執行的命令。如果是任何其他負值,則表示完全緩沖。它用于通過網絡進行系統管理和應用程序部署。
來源 | 愿碼(ChainDesk.CN)內容編輯
愿碼Slogan | 連接每個程序員的故事
網站 | http://chaindesk.cn
愿碼愿景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長并利用自身優勢創造睡后收入。
官方公眾號 | 愿碼 | 愿碼服務號 | 區塊鏈部落
免費加入愿碼全思維工程師社群 | 任一公眾號回復“愿碼”兩個字獲取入群二維碼
本文閱讀時長:13min
在本文中,你將學習如何在配置了Telnet和SSH的服務器上執行基本配置。我們將首先使用Telnet模塊,之后我們將使用首選方法實現相同的配置:使用Python中的不同模塊進行SSH,了解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模塊的工作。
telnetlib()模塊在本節中,我們將了解Telnet協議,然后我們將通過遠程服務器上的telnetlib模塊執行Telnet操作。
Telnet是一種允許用戶與遠程服務器通信的網絡協議。它主要由網絡管理員用于遠程訪問和管理設備。要訪問設備,請使用終端中遠程服務器的IP地址或主機名運行Telnet命令。
Telnet在默認端口號上使用TCP 23。要使用Telnet,請確保它已安裝在你的系統上。如果沒有,請運行以下命令進行安裝:
$ sudo apt-get install telnetd
要使用簡單的終端運行Telnet,您只需輸入以下命令:
$ 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" ") if password: t.read_until(b"Password:") t.write(password.encode("ascii") + b" ") t.write(b"enable ") t.write(b"enter_remote_device_password ") #password of your remote device t.write(b"conf t ") t.write(b"int loop 1 ") t.write(b"ip add 10.1.1.1 255.255.255.255 ") t.write(b"int loop 2 ") t.write(b"ip add 20.2.2.2 255.255.255.255 ") t.write(b"end ") t.write(b"exit ") 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。
通過在終端中運行以下命令來安裝SSH:
$ sudo apt install ssh
此外,在用戶想要通信的遠程服務器上,必須安裝并運行SSH服務器。SSH使用TCP協議,22默認使用端口號。
您可以ssh通過終端運行 命令,如下所示:
$ ssh host_name@host_ip_address
現在來學習使用Python中的不同模塊來執行SSH,例如subprocess,fabric,Netmiko和Paramiko。現在,我們將逐一看到這些模塊。
subprocess.Popen()模塊此模塊的底層的進程創建與管理由 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 ", b"Documents ", b"Downloads ", b"examples.desktop ", b"Music ", b"Pictures ", b"Public ", b"sample.py ", b"spark ", b"spark-2.3.1-bin-hadoop2.7 ", b"spark-2.3.1-bin-hadoop2.7.tgz ", b"ssh ", b"Templates ", b"test_folder ", b"test.txt ", b"Untitled1.ipynb ", b"Untitled.ipynb ", b"Videos ", b"work "]
在前面的示例中,首先,我們導入了子進程模塊,然后我們定義了要建立SSH連接的主機地址。之后,我們給出了一個通過遠程設備執行的簡單命令。完成所有這些后,我們將此信息放在 subprocess.Popen()函數中。此函數執行該函數內定義的參數以創建與遠程設備的連接。建立SSH連接后,執行我們定義的命令并提供結果。然后我們在終端上打印SSH的結果,如輸出中所示。
SSH使用Fabric模塊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結構模塊的實用程序執行。
SSH使用Paramiko庫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 ") rc.send("vlan " + str(n) + " ") rc.send("exit ") 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后,我們只關閉了連接。
SSH使用Netmiko庫在本節中,我們將了解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()的函數來傳遞遠程設備上的命令時,它會自動將我們的設備設置為配置模式。發送配置命令后,我們還傳遞了一個簡單的命令來獲取有關已配置設備的信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43570.html
摘要:在堡壘機內僅保存主機名稱和,不添加賬戶。管理員權限管理員權限雙人授權可以設置哪些人為授權人雙人授權可以設置哪些人為授權人雙人授權可以設置哪些人為授權人答工單設置可以設置本部門的部門管理員及上級管理員。 功能問題(授權和賬戶)本篇目錄1、僅授權主機和授權主機賬戶的區別?2、資源組是不是全局的,主要作用是?3、如何通過堡壘機中新建一個主機的SSH-Key賬戶,并在堡壘機中通過秘鑰登錄主機?4、為...
閱讀 3840·2021-10-12 10:12
閱讀 1471·2021-10-11 10:58
閱讀 2307·2021-10-09 10:01
閱讀 2620·2021-09-24 09:48
閱讀 2715·2021-09-09 11:38
閱讀 3538·2019-08-30 15:44
閱讀 1737·2019-08-30 14:22
閱讀 530·2019-08-29 12:42