如何經過Telnet和SSH遠程監控主機

  • 來源 | 願碼(ChainDesk.CN)內容編輯
  • 願碼Slogan | 鏈接每一個程序員的故事
  • 網站 | http://chaindesk.cn
  • 願碼願景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長並利用自身優點創造睡後收入。
  • 官方公衆號 | 願碼 | 願碼服務號 | 區塊鏈部落
  • 免費加入願碼全思惟工程師社羣 | 任一公衆號回覆「願碼」兩個字獲取入羣二維碼

本文閱讀時長:13minpython

在本文中,你將學習如何在配置了Telnet和SSH的服務器上執行基本配置。咱們將首先使用Telnet模塊,以後咱們將使用首選方法實現相同的配置:使用Python中的不一樣模塊進行SSH,瞭解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模塊的工做。ios

telnetlib()模塊


在本節中,咱們將瞭解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。如今,咱們將逐一看到這些模塊。

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\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的結果,如輸出中所示。

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\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後,咱們只關閉了鏈接。

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()的函數來傳遞遠程設備上的命令時,它會自動將咱們的設備設置爲配置模式。發送配置命令後,咱們還傳遞了一個簡單的命令來獲取有關已配置設備的信息。

相關文章
相關標籤/搜索