资讯专栏INFORMATION COLUMN

如何通过Telnet和SSH远程监控主机

BothEyes1993 / 1641人阅读

摘要:子程序执行将在新进程中完成。要在上执行子程序,该类将使用该函数。如果是字符串,则字符串指定要通过执行的命令。如果是任何其他负值,则表示完全缓冲。它用于通过网络进行系统管理和应用程序部署。

</>复制代码

  1. 来源 | 愿码(ChainDesk.CN)内容编辑

  2. 愿码Slogan | 连接每个程序员的故事

  3. 网站 | http://chaindesk.cn

  4. 愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。

  5. 官方公众号 | 愿码 | 愿码服务号 | 区块链部落

  6. 免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码


本文阅读时长:13min

在本文中,你将学习如何在配置了Telnet和SSH的服务器上执行基本配置。我们将首先使用Telnet模块,之后我们将使用首选方法实现相同的配置:使用Python中的不同模块进行SSH,了解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模块的工作。

telnetlib()模块

在本节中,我们将了解Telnet协议,然后我们将通过远程服务器上的telnetlib模块执行Telnet操作。

Telnet是一种允许用户与远程服务器通信的网络协议。它主要由网络管理员用于远程访问和管理设备。要访问设备,请使用终端中远程服务器的IP地址或主机名运行Telnet命令。

Telnet在默认端口号上使用TCP 23。要使用Telnet,请确保它已安装在你的系统上。如果没有,请运行以下命令进行安装:

</>复制代码

  1. $ sudo apt-get install telnetd

要使用简单的终端运行Telnet,您只需输入以下命令:

</>复制代码

  1. $ telnet ip_address_of_your_remote_server

Python具有telnetlib通过Python脚本执行Telnet功能的模块。在telnet远程设备或路由器之前,请确保它们已正确配置,如果没有,则可以使用路由器终端中的以下命令进行基本配置:

</>复制代码

  1. configure terminal
  2. enable password "set_Your_password_to_access_router"
  3. username "set_username" password "set_password_for_remote_access"
  4. line vty 0 4
  5. login local
  6. transport input all
  7. interface f0/0
  8. ip add "set_ip_address_to_the_router" "put_subnet_mask"
  9. no shut
  10. end
  11. show ip interface brief

现在,让我们看一下Telnet远程设备的示例。为此,创建一个telnet_example.py脚本并在其中编写以下内容:

</>复制代码

  1. import telnetlib
  2. import getpass
  3. import sys
  4. HOST_IP = "your host ip address"
  5. host_user = input("Enter your telnet username: ")
  6. password = getpass.getpass()
  7. t = telnetlib.Telnet(HOST_IP)
  8. t.read_until(b"Username:")
  9. t.write(host_user.encode("ascii") + b"
  10. ")
  11. if password:
  12. t.read_until(b"Password:")
  13. t.write(password.encode("ascii") + b"
  14. ")
  15. t.write(b"enable
  16. ")
  17. t.write(b"enter_remote_device_password
  18. ") #password of your remote device
  19. t.write(b"conf t
  20. ")
  21. t.write(b"int loop 1
  22. ")
  23. t.write(b"ip add 10.1.1.1 255.255.255.255
  24. ")
  25. t.write(b"int loop 2
  26. ")
  27. t.write(b"ip add 20.2.2.2 255.255.255.255
  28. ")
  29. t.write(b"end
  30. ")
  31. t.write(b"exit
  32. ")
  33. print(t.read_all().decode("ascii") )

运行脚本,获得如下输出:

</>复制代码

  1. student@ubuntu:~$ python3 telnet_example.py
  2. Output:
  3. Enter your telnet username: student
  4. Password:
  5. server>enable
  6. Password:
  7. server#conf t
  8. Enter configuration commands, one per line. End with CNTL/Z.
  9. server(config)#int loop 1
  10. server(config-if)#ip add 10.1.1.1 255.255.255.255
  11. server(config-if)#int loop 23
  12. server(config-if)#ip add 20.2.2.2 255.255.255.255
  13. server(config-if)#end
  14. server#exit

在前面的示例中,我们使用该telnetlib模块访问和配置了Cisco路由器。在此脚本中,首先,我们从用户那里获取用户名和密码,以初始化与远程设备的Telnet连接。建立连接后,我们在远程设备上进行了进一步配置。远程登录后,我们将能够访问远程服务器或设备。但是这个Telnet协议有一个非常重要的缺点,即所有数据,包括用户名和密码,都是以文本方式通过网络发送的,这可能会带来安全风险。因此,如今Telnet很少被使用,并且被称为Secure Shell的非常安全的协议所取代,称为SSH。

通过在终端中运行以下命令来安装SSH:

</>复制代码

  1. $ sudo apt install ssh

此外,在用户想要通信的远程服务器上,必须安装并运行SSH服务器。SSH使用TCP协议,22默认使用端口号。

您可以ssh通过终端运行 命令,如下所示:

</>复制代码

  1. $ ssh host_name@host_ip_address

现在来学习使用Python中的不同模块来执行SSH,例如subprocess,fabric,Netmiko和Paramiko。现在,我们将逐一看到这些模块。

subprocess.Popen()模块

此模块的底层的进程创建与管理由 Popen 类处理。它提供了很大的灵活性,因此开发者能够处理未被便利函数覆盖的不常见用例。子程序执行将在新进程中完成。要在Unix / Linux上执行子程序,该类将使用该 os.execvp()函数。要在Windows中执行子程序,该类将使用CreateProcess()函数。

现在,让我们看一些有用的参数subprocess.Popen():

</>复制代码

  1. class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None,
  2. stderr=None, preexec_fn=None, close_fds=False, shell=False,
  3. cwd=None, env=None, universal_newlines=False,
  4. 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 脚本并在其中写入以下内容:

</>复制代码

  1. import subprocess
  2. import sys
  3. HOST="your host username@host ip"
  4. COMMAND= "ls"
  5. ssh_obj = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],
  6. shell=False,
  7. stdout=subprocess.PIPE,
  8. stderr=subprocess.PIPE)
  9. result = ssh_obj.stdout.readlines()
  10. if result == []:
  11. err = ssh_obj.stderr.readlines()
  12. print(sys.stderr, "ERROR: %s" % err)
  13. else:
  14. print(result)

运行脚本,您将获得如下输出:

</>复制代码

  1. student@ubuntu:~$ python3 ssh_using_sub.py
  2. Output :
  3. student@192.168.0.106"s password:
  4. [b"Desktop
  5. ", b"Documents
  6. ", b"Downloads
  7. ", b"examples.desktop
  8. ", b"Music
  9. ", b"Pictures
  10. ", b"Public
  11. ", b"sample.py
  12. ", b"spark
  13. ", b"spark-2.3.1-bin-hadoop2.7
  14. ", b"spark-2.3.1-bin-hadoop2.7.tgz
  15. ", b"ssh
  16. ", b"Templates
  17. ", b"test_folder
  18. ", b"test.txt
  19. ", b"Untitled1.ipynb
  20. ", b"Untitled.ipynb
  21. ", b"Videos
  22. ", b"work
  23. "]

在前面的示例中,首先,我们导入了子进程模块,然后我们定义了要建立SSH连接的主机地址。之后,我们给出了一个通过远程设备执行的简单命令。完成所有这些后,我们将此信息放在 subprocess.Popen()函数中。此函数执行该函数内定义的参数以创建与远程设备的连接。建立SSH连接后,执行我们定义的命令并提供结果。然后我们在终端上打印SSH的结果,如输出中所示。

SSH使用Fabric模块

Fabric是一个Python库,也是一个使用SSH的命令行工具。它用于通过网络进行系统管理和应用程序部署。我们也可以通过SSH执行shell命令。

要使用结构模块,首先必须使用以下命令安装它:

</>复制代码

  1. $ pip3 install fabric3

现在,我们将看到一个例子。创建一个 fabfile.py脚本并在其中写入以下内容:

</>复制代码

  1. from fabric.api import *
  2. env.hosts=["host_name@host_ip"]
  3. env.password="your password"
  4. def dir():
  5. run("mkdir fabric")
  6. print("Directory named fabric has been created on your host network")
  7. def diskspace():
  8. run("df")

运行脚本,您将获得如下输出:

</>复制代码

  1. student@ubuntu:~$ fab dir
  2. Output:
  3. [student@192.168.0.106] Executing task "dir"
  4. [student@192.168.0.106] run: mkdir fabric
  5. Done.
  6. 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之前,请确保已在系统上正确安装。如果未安装,可以通过在终端中运行以下命令来安装它:

</>复制代码

  1. $ sudo pip3 install paramiko

现在,我们将看到一个使用示例paramiko。对于此paramiko连接,我们使用的是Cisco设备。Paramiko支持基于密码和基于密钥对的身份验证,以实现与服务器的安全连接。在我们的脚本中,我们使用基于密码的身份验证,这意味着我们检查密码,如果可用,则使用普通用户名/密码身份验证尝试进行身份验证。在我们要对你的远程设备或多层路由器进行SSH连接之前,请确保它们已正确配置,如果没有,可以在多层路由器终端中使用以下命令进行基本配置:

</>复制代码

  1. configure t
  2. ip domain-name cciepython.com
  3. crypto key generate rsa
  4. How many bits in the modulus [512]: 1024
  5. interface range f0/0 - 1
  6. switchport mode access
  7. switchport access vlan 1
  8. no shut
  9. int vlan 1
  10. ip add "set_ip_address_to_the_router" "put_subnet_mask"
  11. no shut
  12. exit
  13. enable password "set_Your_password_to_access_router"
  14. username "set_username" password "set_password_for_remote_access"
  15. username "username" privilege 15
  16. line vty 0 4
  17. login local
  18. transport input all
  19. end

现在,创建一个pmiko.py脚本并在其中编写以下内容:

</>复制代码

  1. import paramiko
  2. import time
  3. ip_address = "host_ip_address"
  4. usr = "host_username"
  5. pwd = "host_password"
  6. c = paramiko.SSHClient()
  7. c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  8. c.connect(hostname=ip_address,username=usr,password=pwd)
  9. print("SSH connection is successfully established with ", ip_address)
  10. rc = c.invoke_shell()
  11. for n in range (2,6):
  12. print("Creating VLAN " + str(n))
  13. rc.send("vlan database
  14. ")
  15. rc.send("vlan " + str(n) + "
  16. ")
  17. rc.send("exit
  18. ")
  19. time.sleep(0.5)
  20. time.sleep(1)
  21. output = rc.recv(65535)
  22. print(output)
  23. c.close

运行脚本,您将获得如下输出:

</>复制代码

  1. student@ubuntu:~$ python3 pmiko.py
  2. Output:
  3. SSH connection is successfuly established with 192.168.0.70
  4. Creating VLAN 2
  5. Creating VLAN 3
  6. Creating VLAN 4
  7. 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脚本并在其中编写以下代码:

</>复制代码

  1. from netmiko import ConnectHandler
  2. remote_device={
  3. "device_type": "cisco_ios",
  4. "ip": "your remote_device ip address",
  5. "username": "username",
  6. "password": "password",
  7. }
  8. remote_connection = ConnectHandler(**remote_device)
  9. #net_connect.find_prompt()
  10. for n in range (2,6):
  11. print("Creating VLAN " + str(n))
  12. commands = ["exit","vlan database","vlan " + str(n), "exit"]
  13. output = remote_connection.send_config_set(commands)
  14. print(output)
  15. command = remote_connection.send_command("show vlan-switch brief")
  16. print(command)

运行脚本,您将获得如下输出:

</>复制代码

  1. student@ubuntu:~$ python3 nmiko.py
  2. Output:
  3. Creating VLAN 2
  4. config term
  5. Enter configuration commands, one per line. End with CNTL/Z.
  6. server(config)#exit
  7. server #vlan database
  8. server (vlan)#vlan 2
  9. VLAN 2 modified:
  10. server (vlan)#exit
  11. APPLY completed.
  12. Exiting....
  13. server #
  14. ..
  15. ..
  16. ..
  17. ..
  18. switch#
  19. Creating VLAN 5
  20. config term
  21. Enter configuration commands, one per line. End with CNTL/Z.
  22. server (config)#exit
  23. server #vlan database
  24. server (vlan)#vlan 5
  25. VLAN 5 modified:
  26. server (vlan)#exit
  27. APPLY completed.
  28. Exiting....
  29. VLAN Name Status Ports
  30. ---- -------------------------------- --------- -------------------------------
  31. 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
  32. 2 VLAN0002 active
  33. 3 VLAN0003 active
  34. 4 VLAN0004 active
  35. 5 VLAN0005 active
  36. 1002 fddi-default active
  37. 1003 token-ring-default active
  38. 1004 fddinet-default active
  39. 1005 trnet-default active

在前面的示例中,我们使用Netmiko库来执行SSH,而不是Paramiko。在这个脚本中,首先,我们ConnectHandler从Netmiko库导入,我们通过传入设备字典来建立与远程网络设备的SSH连接。在我们的例子中,那个词典是remote_device。建立连接后,我们执行配置命令以使用该send_config_set()功能创建多个虚拟LAN 。

当我们使用这种类型.send_config_set()的函数来传递远程设备上的命令时,它会自动将我们的设备设置为配置模式。发送配置命令后,我们还传递了一个简单的命令来获取有关已配置设备的信息。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43570.html

相关文章

  • 堡垒机 功能问题(授权账户) UAuditHost

    摘要:在堡垒机内仅保存主机名称和,不添加账户。管理员权限管理员权限双人授权可以设置哪些人为授权人双人授权可以设置哪些人为授权人双人授权可以设置哪些人为授权人答工单设置可以设置本部门的部门管理员及上级管理员。 功能问题(授权和账户)本篇目录1、仅授权主机和授权主机账户的区别?2、资源组是不是全局的,主要作用是?3、如何通过堡垒机中新建一个主机的SSH-Key账户,并在堡垒机中通过秘钥登录主机?4、为...

    ernest.wang 评论0 收藏3247

发表评论

0条评论

最新活动
阅读需要支付1元查看
<