摘要:子程序執(zhí)行將在新進(jìn)程中完成。要在上執(zhí)行子程序,該類將使用該函數(shù)。如果是字符串,則字符串指定要通過執(zhí)行的命令。如果是任何其他負(fù)值,則表示完全緩沖。它用于通過網(wǎng)絡(luò)進(jìn)行系統(tǒng)管理和應(yīng)用程序部署。
來源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
愿碼Slogan | 連接每個(gè)程序員的故事
網(wǎng)站 | http://chaindesk.cn
愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費(fèi)課程,助力小白用戶、初級(jí)工程師0成本免費(fèi)系統(tǒng)學(xué)習(xí)、低成本進(jìn)階,幫助BAT一線資深工程師成長并利用自身優(yōu)勢創(chuàng)造睡后收入。
官方公眾號(hào) | 愿碼 | 愿碼服務(wù)號(hào) | 區(qū)塊鏈部落
免費(fèi)加入愿碼全思維工程師社群 | 任一公眾號(hào)回復(fù)“愿碼”兩個(gè)字獲取入群二維碼
本文閱讀時(shí)長:13min
在本文中,你將學(xué)習(xí)如何在配置了Telnet和SSH的服務(wù)器上執(zhí)行基本配置。我們將首先使用Telnet模塊,之后我們將使用首選方法實(shí)現(xiàn)相同的配置:使用Python中的不同模塊進(jìn)行SSH,了解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模塊的工作。
telnetlib()模塊在本節(jié)中,我們將了解Telnet協(xié)議,然后我們將通過遠(yuǎn)程服務(wù)器上的telnetlib模塊執(zhí)行Telnet操作。
Telnet是一種允許用戶與遠(yuǎn)程服務(wù)器通信的網(wǎng)絡(luò)協(xié)議。它主要由網(wǎng)絡(luò)管理員用于遠(yuǎn)程訪問和管理設(shè)備。要訪問設(shè)備,請(qǐng)使用終端中遠(yuǎn)程服務(wù)器的IP地址或主機(jī)名運(yùn)行Telnet命令。
Telnet在默認(rèn)端口號(hào)上使用TCP 23。要使用Telnet,請(qǐng)確保它已安裝在你的系統(tǒng)上。如果沒有,請(qǐng)運(yùn)行以下命令進(jìn)行安裝:
$ sudo apt-get install telnetd
要使用簡單的終端運(yùn)行Telnet,您只需輸入以下命令:
$ telnet ip_address_of_your_remote_server
Python具有telnetlib通過Python腳本執(zhí)行Telnet功能的模塊。在telnet遠(yuǎn)程設(shè)備或路由器之前,請(qǐng)確保它們已正確配置,如果沒有,則可以使用路由器終端中的以下命令進(jìn)行基本配置:
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
現(xiàn)在,讓我們看一下Telnet遠(yuǎn)程設(shè)備的示例。為此,創(chuàng)建一個(gè)telnet_example.py腳本并在其中編寫以下內(nèi)容:
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") )
運(yùn)行腳本,獲得如下輸出:
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路由器。在此腳本中,首先,我們從用戶那里獲取用戶名和密碼,以初始化與遠(yuǎn)程設(shè)備的Telnet連接。建立連接后,我們?cè)谶h(yuǎn)程設(shè)備上進(jìn)行了進(jìn)一步配置。遠(yuǎn)程登錄后,我們將能夠訪問遠(yuǎn)程服務(wù)器或設(shè)備。但是這個(gè)Telnet協(xié)議有一個(gè)非常重要的缺點(diǎn),即所有數(shù)據(jù),包括用戶名和密碼,都是以文本方式通過網(wǎng)絡(luò)發(fā)送的,這可能會(huì)帶來安全風(fēng)險(xiǎn)。因此,如今Telnet很少被使用,并且被稱為Secure Shell的非常安全的協(xié)議所取代,稱為SSH。
通過在終端中運(yùn)行以下命令來安裝SSH:
$ sudo apt install ssh
此外,在用戶想要通信的遠(yuǎn)程服務(wù)器上,必須安裝并運(yùn)行SSH服務(wù)器。SSH使用TCP協(xié)議,22默認(rèn)使用端口號(hào)。
您可以ssh通過終端運(yùn)行 命令,如下所示:
$ ssh host_name@host_ip_address
現(xiàn)在來學(xué)習(xí)使用Python中的不同模塊來執(zhí)行SSH,例如subprocess,fabric,Netmiko和Paramiko。現(xiàn)在,我們將逐一看到這些模塊。
subprocess.Popen()模塊此模塊的底層的進(jìn)程創(chuàng)建與管理由 Popen 類處理。它提供了很大的靈活性,因此開發(fā)者能夠處理未被便利函數(shù)覆蓋的不常見用例。子程序執(zhí)行將在新進(jìn)程中完成。要在Unix / Linux上執(zhí)行子程序,該類將使用該 os.execvp()函數(shù)。要在Windows中執(zhí)行子程序,該類將使用CreateProcess()函數(shù)。
現(xiàn)在,讓我們看一些有用的參數(shù)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)
讓我們看看每個(gè)論點(diǎn):
· args: 它可以是一系列程序參數(shù)或單個(gè)字符串。如果args是序列,則執(zhí)行args中的第一項(xiàng)。如果args是一個(gè)字符串,它建議將args作為序列傳遞。
· shell:shell參數(shù)默認(rèn)設(shè)置為False,它指定是否使用shell執(zhí)行程序。如果是shell True,則建議將args作為字符串傳遞。在 Linux中,如果shell=True,shell默認(rèn)為/bin/sh。如果args是字符串,則字符串指定要通過shell執(zhí)行的命令。
· bufsize:如果bufsize是0(默認(rèn)情況下是0),則表示無緩沖,如果bufsize是1,則表示行緩沖。如果bufsize是任何其他正值,請(qǐng)使用給定大小的緩沖區(qū)。如果bufsize是任何其他負(fù)值,則表示完全緩沖。
· executable:它指定要執(zhí)行的替換程序。
· stdin,, stdout和stderr:這些參數(shù)分別定義標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。
· preexec_fn: 這被設(shè)置為可調(diào)用對(duì)象,將在子進(jìn)程中執(zhí)行子進(jìn)程之前調(diào)用。
· close_fds: 在Linux中,如果close_fds是真的,所有的文件描述符,除了0,1和2執(zhí)行子進(jìn)程之前,將被關(guān)閉。在Windows中,如果close_fds是,true那么子進(jìn)程將繼承沒有句柄。
· env: 如果值不是None,則映射將為新進(jìn)程定義環(huán)境變量。
· universal_newlines: 如果該值True則stdout和stderr將被打開,在新行模式下的文本文件。
現(xiàn)在,我們將看到一個(gè)例子subprocess.Popen()。為此,創(chuàng)建一個(gè) ssh_using_sub.py 腳本并在其中寫入以下內(nèi)容:
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)
運(yùn)行腳本,您將獲得如下輸出:
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 "]
在前面的示例中,首先,我們導(dǎo)入了子進(jìn)程模塊,然后我們定義了要建立SSH連接的主機(jī)地址。之后,我們給出了一個(gè)通過遠(yuǎn)程設(shè)備執(zhí)行的簡單命令。完成所有這些后,我們將此信息放在 subprocess.Popen()函數(shù)中。此函數(shù)執(zhí)行該函數(shù)內(nèi)定義的參數(shù)以創(chuàng)建與遠(yuǎn)程設(shè)備的連接。建立SSH連接后,執(zhí)行我們定義的命令并提供結(jié)果。然后我們?cè)诮K端上打印SSH的結(jié)果,如輸出中所示。
SSH使用Fabric模塊Fabric是一個(gè)Python庫,也是一個(gè)使用SSH的命令行工具。它用于通過網(wǎng)絡(luò)進(jìn)行系統(tǒng)管理和應(yīng)用程序部署。我們也可以通過SSH執(zhí)行shell命令。
要使用結(jié)構(gòu)模塊,首先必須使用以下命令安裝它:
$ pip3 install fabric3
現(xiàn)在,我們將看到一個(gè)例子。創(chuàng)建一個(gè) fabfile.py腳本并在其中寫入以下內(nèi)容:
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")
運(yùn)行腳本,您將獲得如下輸出:
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.
在前面的示例中,首先,我們導(dǎo)入了fabric.api模塊,然后設(shè)置主機(jī)名和密碼以與主機(jī)網(wǎng)絡(luò)連接。之后,我們?cè)O(shè)置了一個(gè)不同的任務(wù)來執(zhí)行SSH。因此,為了執(zhí)行我們的程序而不是Python3 fabfile.py,我們使用了fabutility(fab dir),之后我們聲明所需的任務(wù)應(yīng)該從我們的執(zhí)行fabfile.py。在我們的例子中,我們執(zhí)行了dir任務(wù),該任務(wù)"fabric"在遠(yuǎn)程網(wǎng)絡(luò)上創(chuàng)建了一個(gè)名稱目錄。您可以在Python文件中添加特定任務(wù)。它可以使用fab結(jié)構(gòu)模塊的實(shí)用程序執(zhí)行。
SSH使用Paramiko庫Paramiko是一個(gè)實(shí)現(xiàn)SSHv2協(xié)議的庫,用于與遠(yuǎn)程設(shè)備的安全連接。Paramiko是一個(gè)圍繞SSH的純Python界面。
在使用Paramiko之前,請(qǐng)確保已在系統(tǒng)上正確安裝。如果未安裝,可以通過在終端中運(yùn)行以下命令來安裝它:
$ sudo pip3 install paramiko
現(xiàn)在,我們將看到一個(gè)使用示例paramiko。對(duì)于此paramiko連接,我們使用的是Cisco設(shè)備。Paramiko支持基于密碼和基于密鑰對(duì)的身份驗(yàn)證,以實(shí)現(xiàn)與服務(wù)器的安全連接。在我們的腳本中,我們使用基于密碼的身份驗(yàn)證,這意味著我們檢查密碼,如果可用,則使用普通用戶名/密碼身份驗(yàn)證嘗試進(jìn)行身份驗(yàn)證。在我們要對(duì)你的遠(yuǎn)程設(shè)備或多層路由器進(jìn)行SSH連接之前,請(qǐng)確保它們已正確配置,如果沒有,可以在多層路由器終端中使用以下命令進(jìn)行基本配置:
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
現(xiàn)在,創(chuàng)建一個(gè)pmiko.py腳本并在其中編寫以下內(nèi)容:
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
運(yùn)行腳本,您將獲得如下輸出:
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
在前面的示例中,首先,我們導(dǎo)入了paramiko模塊,然后我們定義了連接遠(yuǎn)程設(shè)備所需的SSH憑據(jù)。提供憑證后,我們創(chuàng)建一個(gè)實(shí)例"c"的paramiko.SSHclient(),它是用于與遠(yuǎn)程設(shè)備建立連接和執(zhí)行命令或操作主客戶端。創(chuàng)建SSHClient對(duì)象允許我們使用該.connect()函數(shù)建立遠(yuǎn)程連接。然后,我們?cè)O(shè)置策略paramiko連接,因?yàn)槟J(rèn)情況下, paramiko.SSHclient將SSH策略設(shè)置為拒絕策略狀態(tài)。這會(huì)導(dǎo)致策略在沒有任何驗(yàn)證的情況下拒絕任何SSH連接。在我們的腳本中,我們忽略了SSH連接丟失的可能性 AutoAddPolicy()在不提示的情況下自動(dòng)添加服務(wù)器主機(jī)密鑰的功能。我們可以將此策略用于測試目的,但出于安全目的,這在生產(chǎn)環(huán)境中不是一個(gè)好的選擇。
建立SSH連接后,你可以在設(shè)備上執(zhí)行所需的任何配置或操作。在這里,我們?cè)谶h(yuǎn)程設(shè)備上創(chuàng)建了一些虛擬LAN。創(chuàng)建VLAN后,我們只關(guān)閉了連接。
SSH使用Netmiko庫在本節(jié)中,我們將了解Netmiko。Netmiko庫是Paramiko的高級(jí)版本。這是一個(gè)multi_vendor基于Paramiko 的圖書館。Netmiko簡化了與網(wǎng)絡(luò)設(shè)備的SSH連接,并對(duì)設(shè)備進(jìn)行了特殊操作。在對(duì)遠(yuǎn)程設(shè)備或多層路由器進(jìn)行SSH連接之前,請(qǐng)確保它們已正確配置,如果沒有,則可以通過Paramiko部分中提到的命令進(jìn)行基本配置。
現(xiàn)在,讓我們看一個(gè)例子。創(chuàng)建一個(gè) 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)
運(yùn)行腳本,您將獲得如下輸出:
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庫來執(zhí)行SSH,而不是Paramiko。在這個(gè)腳本中,首先,我們ConnectHandler從Netmiko庫導(dǎo)入,我們通過傳入設(shè)備字典來建立與遠(yuǎn)程網(wǎng)絡(luò)設(shè)備的SSH連接。在我們的例子中,那個(gè)詞典是remote_device。建立連接后,我們執(zhí)行配置命令以使用該send_config_set()功能創(chuàng)建多個(gè)虛擬LAN 。
當(dāng)我們使用這種類型.send_config_set()的函數(shù)來傳遞遠(yuǎn)程設(shè)備上的命令時(shí),它會(huì)自動(dòng)將我們的設(shè)備設(shè)置為配置模式。發(fā)送配置命令后,我們還傳遞了一個(gè)簡單的命令來獲取有關(guān)已配置設(shè)備的信息。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43570.html
摘要:在堡壘機(jī)內(nèi)僅保存主機(jī)名稱和,不添加賬戶。管理員權(quán)限管理員權(quán)限雙人授權(quán)可以設(shè)置哪些人為授權(quán)人雙人授權(quán)可以設(shè)置哪些人為授權(quán)人雙人授權(quán)可以設(shè)置哪些人為授權(quán)人答工單設(shè)置可以設(shè)置本部門的部門管理員及上級(jí)管理員。 功能問題(授權(quán)和賬戶)本篇目錄1、僅授權(quán)主機(jī)和授權(quán)主機(jī)賬戶的區(qū)別?2、資源組是不是全局的,主要作用是?3、如何通過堡壘機(jī)中新建一個(gè)主機(jī)的SSH-Key賬戶,并在堡壘機(jī)中通過秘鑰登錄主機(jī)?4、為...
閱讀 3820·2021-10-12 10:12
閱讀 1453·2021-10-11 10:58
閱讀 2290·2021-10-09 10:01
閱讀 2597·2021-09-24 09:48
閱讀 2699·2021-09-09 11:38
閱讀 3526·2019-08-30 15:44
閱讀 1724·2019-08-30 14:22
閱讀 518·2019-08-29 12:42