乐趣区

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

来源 | 愿码 (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”\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。
通过在终端中运行以下命令来安装 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()的函数来传递远程设备上的命令时,它会自动将我们的设备设置为配置模式。发送配置命令后,我们还传递了一个简单的命令来获取有关已配置设备的信息。

退出移动版