Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

使用 Junos PyEZ 连接到 Junos 设备

总结 在 Junos PyEZ 应用程序中,使用不同的连接方法和协议连接到 Junos 设备或连接的控制台服务器。

Junos PyEZ 是一个适用于 Python 的微框架,可用于管理 Junos 设备。Junos PyEZ 将每个设备建模为 jnpr.junos.device.Device 类的一个实例。该 Device 类使您能够使用串行控制台连接、telnet 或通过 SSH 建立 NETCONF 会话来连接到 Junos 设备。此外,Junos PyEZ 还支持通过与控制台服务器的 telnet 或 SSH 连接连接到设备。控制台服务器(也称为终端服务器)是一种专用设备,它提供与设备的带外管理控制台端口的网络连接。

本主题概述了 Junos PyEZ 支持的连接方法,并说明如何使用不同的方法连接到 Junos 设备。Junos PyEZ 示例使用各种身份验证方法,但有关对用户进行身份验证的详细信息,请参阅 对 Junos PyEZ 用户进行身份验证

连接方法概述

Junos PyEZ 使您能够使用串行控制台连接、telnet 或通过 SSH 的 NETCONF 会话连接到 Junos 设备。当您物理连接到设备上的 CONSOLE 端口时,必须使用串行控制台连接。您可以使用 telnet 或 SSH 连接到设备的管理接口或连接到设备的 CONSOLE 端口的控制台服务器。此外,Junos PyEZ 支持出站 SSH 连接,其中 Junos 设备启动与客户端管理应用程序的连接。

具有出厂默认配置的新设备或零化设备需要通过控制台连接进行访问。因此,您可以使用 Junos PyEZ 来初始配置尚未配置为远程访问的设备,方法是在直接连接到设备时使用串行控制台连接,或者通过连接到设备的控制台服务器使用 telnet 或 SSH。

默认情况下,Junos PyEZ 使用 SSH 连接到设备 。若要指定其他连接类型,必须在参数列表中包含 mode 该参数 Device 。要远程登录到设备,请包含 mode='telnet' 参数。要使用串行控制台连接连接到设备,请包含 mode='serial' 参数。 表 1 汇总了 Junos PyEZ 连接方法、某些参数的默认值、所需的任何 Junos OS 配置以及首次引入对该连接方法支持的 Junos PyEZ 版本。

表 1:Junos PyEZ 连接模式

连接模式

参数的值mode

默认端口

必需的 Junos OS 配置

第一个受支持的 Junos PyEZ 版本

NETCONF over SSH(默认)

830

[edit system services]
netconf {
    ssh;
}

1.0.0

串行控制台连接

串行

/dev/ttyUSB0

2.0.0 (*尼克斯)

2.4.0 (视窗)

Telnet 到 Junos 设备

Telnet

23

[edit system services]
telnet;

2.0.0

通过控制台服务器进行远程登录

Telnet

23

2.0.0

通过控制台服务器的 SSH

22

2.2.0

出站 SSH

[edit system services]
outbound-ssh {     
    ...
}

2.2.0

注意:

必须先在 [edit system services] 层次结构级别启用相应的服务,然后才能使用 telnet 或 NETCONF over SSH 访问设备的管理接口。有关更多信息,请参阅 设置 Junos PyEZ 受管节点。由于 telnet 使用明文密码(因此会产生潜在的安全漏洞),因此建议您使用 SSH。

注意:

用户有责任以适合其环境的安全方式获取用户名和密码身份验证凭据。最佳做法是在每次调用脚本期间提示输入这些身份验证凭据,而不是以未加密的格式存储凭据。

Junos PyEZ 支持对所有连接方法使用上下文管理器(withas...语法)。使用上下文管理器时,Junos PyEZ 会自动调用 open()close() 方法来连接设备或断开与设备的连接。如果不使用上下文管理器,则必须在应用程序中显式调用open()close()方法。我们建议您对控制台连接使用上下文管理器,因为上下文管理器会自动处理关闭连接,并且未能关闭连接可能会导致不可预知的结果。

了解 Junos PyEZ 连接属性

连接到 Junos 设备时,Junos PyEZ 会将有关当前连接的信息存储为实例的属性 Device表 2 概述了可用的连接属性。

表 2:设备属性

财产

描述

connected

指定连接的当前状态的布尔值。连接时返回 True

hostname

指定应用程序所连接设备的主机名的字符串。

master

如果应用程序连接的路由引擎是主路由引擎,则返回 True 布尔值。

port

指定用于连接的端口的整数或字符串。

re_name

指定应用程序连接到的路由引擎名称的字符串。

timeout

指定 RPC 超时值(以秒为单位)的整数。

uptime

整数,表示自当前路由引擎启动以来的秒数。此属性从 Junos PyEZ 版本 2.1.5 开始可用。

user

指定访问 Junos 设备的用户的字符串。

例如,连接到设备后,可以查询connected属性以返回连接的当前状态。A SessionListener 监视会话,并通过引发TransportError异常并将属性False设置为 Device.connected 来响应传输错误。

以下示例代码在连接到 Junos 设备后以及关闭会话后再次打印属性的值 connected

执行程序时,该 connected 属性在应用程序连接到设备时返回 True ,并在连接关闭后返回 False

使用 SSH 连接到设备

Junos PyEZ Device 类支持使用 SSH 连接到 Junos 设备。您可以使用设备的管理接口通过 SSH 建立 NETCONF 会话,也可以与直接连接到设备的 CONSOLE 端口的控制台服务器建立 SSH 连接。SSH 服务器必须能够使用标准 SSH 身份验证机制对用户进行身份验证,如 验证 Junos PyEZ 用户中所述。要通过 SSH 建立 NETCONF 会话,还必须满足 设置 Junos PyEZ 受管节点中概述的要求。

Junos PyEZ 会自动查询默认的 SSH 配置文件 ~/.ssh/config(如果存在)。使用 SSH 连接到 Junos 设备或连接到该设备的控制台服务器时,Junos PyEZ 首先尝试基于 SSH 公钥的身份验证,然后再尝试基于密码的身份验证。使用基于密码的身份验证时,提供的密码将用作设备密码。使用 SSH 密钥时,提供的密码将用作解锁私钥的密码。如果 SSH 私钥的密码为空,则不需要密码。但是,不建议使用具有空密码短语的 SSH 私钥。

要使用 Python 3 通过 SSH 建立与 Junos 设备的 NETCONF 会话,并在 Junos PyEZ 应用程序中打印设备事实,请执行以下操作:

  1. Device导入类以及任务所需的任何其他模块或对象。
  2. 创建设备实例,并提供主机名、身份验证所需的任何参数以及任何可选参数。
  3. 通过调用 open() 方法连接到设备,例如:
  4. 打印设备事实。
  5. 执行任何必要的任务后,关闭与设备的连接。

此处提供了完整的示例程序:

或者,您可以在连接到设备时使用上下文管理器,它会自动调用 open()close() 方法。例如:

Junos PyEZ 还允许客户端通过与控制台服务器的 SSH 连接连接到 Junos 设备。在这种情况下,必须通过在参数列表中包括 和cs_usercs_passwd参数Device来指定控制台服务器的登录凭证。使用 SSH 密钥时,请将cs_passwd参数设置为包含私钥密码的变量。

控制台服务器通过串行连接连接到 Junos 设备,但串行连接速度可能很慢。通过控制台服务器的 Junos PyEZ 连接的默认连接超时值为 0.5 秒。因此,您可能需要通过包含Devicetimeout=seconds参数来增加连接超时间隔,以便为客户端应用程序留出足够的时间来建立连接。

以下 Python 3 示例先向控制台服务器进行身份验证,然后向 Junos 设备进行身份验证。连接超时设置为 6 秒,以便客户端有足够的时间来建立连接。

Junos PyEZ 会自动查询默认的 SSH 配置文件 ~/.ssh/config(如果存在)。但是,您可以在创建设备实例时通过在参数列表中包含 ssh_config 参数 Device 来指定不同的 SSH 配置文件。例如:

Junos PyEZ 还提供对 ProxyCommand 的支持,使您能够通过支持 netcat 的中间主机访问目标设备。当您只能通过中间主机登录到目标设备时,此功能非常有用。

要配置代理命令,请将相应的信息添加到 SSH 配置文件中。例如:

使用出站 SSH 连接到设备

您可以将 Junos 设备配置为启动与客户端管理应用程序的 TCP/IP 连接,如果客户端尝试启动连接(例如,如果设备位于防火墙后面),该应用程序将被阻止。该 outbound-ssh 配置指示设备创建与客户端管理应用程序的 TCP/IP 连接,并转发设备的标识。建立连接后,管理应用程序将充当客户端并启动 SSH 序列,Junos 设备将充当服务器并对客户端进行身份验证。

注意:

在 Junos 设备上配置并提交出站 SSH 后,设备将开始根据提交的配置启动出站 SSH 连接。设备会反复尝试创建此连接,直到成功。如果设备与客户端管理应用程序之间的连接断开,设备将再次尝试创建新的出站 SSH 连接,直到成功。在删除或停用出站 SSH 配置之前,将一直保持此连接。

要为 Junos 设备配置 SSH 出站 SSH 连接,请在层次结构级别包含 outbound-ssh 语句 [edit system services] 。在以下示例中,Junos 设备尝试在端口 2200 上的 198.51.100.101 处启动与主机的连接:

要使用出站 SSH 与 Junos 设备建立连接,Junos PyEZ 应用程序会在构造函数中Device将参数设置为sock_fd等于现有套接字的文件描述符,并省略该host参数或将其设置为 None.

以下 Junos PyEZ 示例在配置的 TCP 端口上侦听来自 Junos 设备的传入 SSH 会话。应用程序接受传入连接并检索该连接的套接字文件描述符,该描述符用于参数的值 sock_fd 。客户端应用程序与设备建立 SSH 连接,收集和打印设备事实,断开与设备的连接,然后等待更多连接。

有关在 Junos 设备上配置出站 SSH 的详细信息,请参阅 配置出站 SSH 服务

使用 Telnet 连接到设备

Junos PyEZ Device 类支持使用 telnet 连接到 Junos 设备,从而提供对网络设备的未加密访问。您可以远程登录到设备的管理界面或直接连接到设备的 CONSOLE 端口的控制台服务器。您必须在需要访问管理接口的所有设备上的层次结构级别配置 [edit system services] Telnet 服务。通过控制台服务器访问设备,您可以最初配置尚未配置为远程访问的新设备或零化设备。

要使用 Junos PyEZ 远程登录到 Junos 设备,必须包含在mode='telnet'Device参数列表中,并选择性地包括用于指定端口的port参数。如果指定mode='telnet'但省略参数port,则 的值port默认为 23。当应用程序通过控制台服务器连接时,请指定控制台服务器连接到 Junos 设备的端口。

要使用 Junos PyEZ 远程登录到 Junos 设备,并使用 Python 3 在 Junos PyEZ 应用程序中打印设备事实,请执行以下操作:

  1. Device导入类以及任务所需的任何其他模块或对象。
  2. 使用 mode='telnet' 参数创建设备实例,指定连接端口(如果与默认值不同),并提供主机名、身份验证所需的任何参数以及任何可选参数。
  3. 通过调用 open() 方法连接到设备。
  4. 打印设备事实。
  5. 执行任何必要的任务后,关闭与设备的连接。

此处提供了完整的示例程序:

或者,您可以在连接到设备时使用上下文管理器,该管理器处理连接的打开和关闭。例如:

在某些情况下,当您连接到发出横幅消息的控制台服务器时,可能需要在消息后按 Enter 才能到达登录提示。如果 Junos PyEZ 应用程序打开与控制台服务器的 Telnet 会话,而该会话要求用户在出现横幅消息后按 Enter 键,则应用程序可能无法收到登录提示,这可能会导致连接挂起。

从 Junos PyEZ 2.6.2 版开始,Junos PyEZ 会自动处理控制台服务器横幅。在 Junos PyEZ 版本 2.1.0 至 2.6.1 中,Junos PyEZ 应用程序可以包含在console_has_banner=TrueDevice参数列表中,以远程登录到发出横幅消息的控制台服务器。

如果包含该 console_has_banner=True 参数,并且应用程序在初始连接时未收到登录提示,则应用程序将等待 5 秒钟,然后发出换行符 (\n),以便控制台服务器发出登录提示。如果省略该参数并且连接挂起,则应用程序将改为发出 <close-session/> RPC 以终止连接。

使用串行控制台连接连接到设备

Junos PyEZ Device 类允许您使用串行控制台连接连接到 Junos 设备,这在最初必须配置尚未配置为远程访问的新设备或零化设备时非常有用。要使用此连接方法,必须通过 CONSOLE 端口物理连接到设备。有关连接到设备上的 CONSOLE 端口的详细说明,请参阅特定设备的硬件文档。

注意:

Junos PyEZ 支持使用上下文管理器进行串行控制台连接。我们建议您对控制台连接使用上下文管理器,因为上下文管理器会自动处理连接的打开和关闭。未能关闭连接可能会导致不可预知的结果。

要使用 Junos PyEZ 通过串行控制台连接连接到 Junos 设备,必须包含在mode='serial'Device参数列表中,并可以选择包括用于指定端口的port参数。指定mode='serial'但省port略参数时,的值port默认为 /dev/ttyUSB0

要使用串行控制台连接连接到 Junos 设备,并使用 Python 3 在 Junos PyEZ 应用程序中加载并提交设备上的配置,请执行以下操作:

  1. Device导入类以及任务所需的任何其他模块或对象。
  2. 使用 mode='serial' 参数创建设备实例,指定连接端口(如果与默认值不同),并提供身份验证所需的任何参数和任何可选参数。
    注意:

    默认情况下,运行 Junos OS 的所有平台仅配置 root 用户,没有任何密码。对于新设备或零化设备,请使用 user='root' 并省略该 passwd 参数。

  3. 在设备上加载并提交配置。
  4. 包括任何必要的错误处理。

此处提供了完整的示例程序: