交换机tftp服务器修改ip,通过 SNMP 在 CatcOs交换机和 TFTP服务器之间移动文件和镜像...

本文档介绍如何在具有Catalyst操作系统(CatOS)的交换机和具有简单网络管理协议(SNMP)的UNIX上的简单文件传输协议(TFTP)服务器之间移动配置文件和系统软件映像。

验证您能从Catalyst交换机ping TFTP服务器的IP地址:

Cat6509> (enable) ping 171.68.191.135

!!!!!

----171.68.191.135 PING Statistics----

5 packets transmitted, 5 packets received, 0% packet loss

round-trip (ms) min/avg/max = 2/2/2

这些步骤包括:

不适用于基于Cisco IOS®软件(如Catalyst 2900/3500XL系列)的Catalyst交换机。

不适用于带有Cisco IOS软件的Catalyst 6000系列MSFC和MSFC2模块。

如果交换机上未配置或未知SNMP读写社区字符串,则不适用。有关如何配置SNMP社区字符串的详细过程,请参阅如何配置SNMP社区字符串。

基于NET-SNMP(以前称为UCD-

format,png SNMP)实用程序的命令行语法。如果您有其他SNMP应用程序,如HP Open View或NetView,则语法可能与这些示例不同。

基于CISCO-STACK-MIB,自初始管理引擎模块软件版本起,Catalyst OS支持该MIB。请参阅Cisco.com上的“产品支持的MIB”页,以验证您的交换机是否支持CISCO-STACK-MIB。使用来自此MIB的以下MIB对象:

MIB 对象名称

OID

tftpHost

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .1

tftpFile

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .2

tftpModule

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .3

tftpAction

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .4

tftpResult

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .5

有关这些MIB对象及其定义的详细信息,请参阅附录A。

本文档中的信息基于仅运行Catalyst OS软件的交换机。

本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您使用的是真实网络,请确保您已经了解所有命令的潜在影响。

在所有示例中,这些值用于说明:

带CatOS的Catalyst 6509交换机

172.16.99.66 = Catalyst 6509交换机的IP地址

private = SNMP读写社区字符串。使用在交换机上配置的读写字符串。在交换机CLI上使用show snmp命令来验证这一点。

public = SNMP只读社区字符串。使用在交换机上配置的只读字符串。在交换机CLI上使用show snmp命令来验证这一点。

171.68.191.135 = TFTP服务器的IP地址

以下是以下示例中snmpset和snmpwalk命令的语法:

snmpset [options...] {} [ ...]

snmpwalk [options...] {} []

有关文档规则的详细信息,请参阅 Cisco 技术提示规则。

这些步骤将指导您完成复制配置文件的过程。

请完成以下步骤:

在TFTP服务器/tftpboot目录中创建新文件switch-config。在UNIX上,使用以下语法:按。

touch switch-config

将文件的权限更改为777。请使用以下语法:chmod 。

chmod 777 switch-config

使用tftpHost MIB对象定义TFTP服务器的IP地址:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.1.0 s 171.68.191.135

enterprises.9.5.1.5.1.0 = "171.68.191.135"

使用tftpFile MIB对象定义用于复制配置的TFTP文件名:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.2.0 s switch-config

enterprises.9.5.1.5.2.0 = switch-config

在Catalyst交换机上选择要传送配置的模块,并带有tftpModule MIB对象。选择Supervisor模块,而不是MSFC或MSFC2模块,否则它会失败。在交换机CLI上使用show module命令验证snmpset命令的模块编号是否正确。典型输出为:

Mod Slot Ports Module-Type Model Sub Status

--- ---- ----- ------------------------- ------------------- --- --------

2 2 2 1000BaseX Supervisor WS-X6K-SUP1A-2GE yes ok

16 2 1 Multilayer Switch Feature WS-F6K-MSFC no OK

....

----

在输出示例中,Supervisor模块编号为2,位于插槽编号2中。使用2定义tftpModule MIB对象:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.3.0 i 2

enterprises.9.5.1.5.3.0 = 2

使用tftpAction MIB对象定义要从TFTP服务器传输到MIB对象值为2 = downloadConfig的交换机的交换机配置文件。请参阅附录A中的MIB对象详细信息:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.4.0 i 2

enterprises.9.5.1.5.4.0 = 2

要验证这些操作的结果,请执行以下步骤之一:

轮询tftpGrp(.1.3.6.1.4.1.9.5.1.5)MIB对象,并将结果与附录A进行比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5

enterprises.9.5.1.5.1.0 = "171.68.191.135"

!--- IP address of the TFTP server

enterprises.9.5.1.5.2.0 = "switch-config"

!--- name of the switch configuration file

enterprises.9.5.1.5.3.0 = 2

!--- Module number. In this case, Supervisor module

enterprises.9.5.1.5.4.0 = 2

!--- TFTP action. 2 = Download configuration from TFTP server to the switch

enterprises.9.5.1.5.5.0 = 2

!--- Result of the TFTP action, 2 = Success

轮询tftpResult MIB对象,并将输出与附录A中的MIB对象详细信息比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5.5

enterprises.9.5.1.5.5.0 = 2

!--- Result of the TFTP action, 2 = Success

如果下载成功,则MIB对象输出等于2(或成功)。 如果您收到其他输出,请将其与tftpResult对象的附录A进行比较,并采取相应的步骤。

这些步骤将指导您完成复制配置文件的过程。

请完成以下步骤:

在TFTP服务器/tftpboot目录中创建新文件switch-config。在UNIX上,使用以下语法:按。

touch switch-config

使用以下语法将文件的权限更改为777:chmod 。

chmod 777 switch-config

使用tftpHost MIB对象定义TFTP服务器的IP地址。语法为:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.1.0 s 171.68.191.135

enterprises.9.5.1.5.1.0 = "171.68.191.135"

使用tftpFile MIB对象定义用于复制配置的TFTP文件名:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.2.0 s switch-config

enterprises.9.5.1.5.2.0 = switch-config

在Catalyst交换机上选择要传送配置的模块,并带有tftpModule MIB对象。选择Supervisor模块,而不是MSFC或MSFC2模块,否则它会失败。在交换机CLI上使用show module命令验证snmpset命令的模块编号是否正确。典型输出为:

Mod Slot Ports Module-Type Model Sub Status

--- ---- ----- ------------------------- ------------------- --- --------

2 2 2 1000BaseX Supervisor WS-X6K-SUP1A-2GE yes ok

16 2 1 Multilayer Switch Feature WS-F6K-MSFC no OK

....

----

在输出示例中,Supervisor模块编号为2,位于插槽编号2中。使用2可定义tftpModule MIB对象:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.3.0 i 2

enterprises.9.5.1.5.3.0 = 2

使用tftpAction MIB对象以定义交换机配置文件将从TFTP服务器传输到MIB对象值为3 = uploadConfig的交换机。请参阅附录A中的MIB对象详细信息:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.4.0 i 3

enterprises.9.5.1.5.4.0 = 3

要验证这些操作的结果,请执行以下步骤之一:

轮询tftpGrp(.1.3.6.1.4.1.9.5.1.5)MIB对象,并将结果与附录A进行比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5

enterprises.9.5.1.5.1.0 = "171.68.191.135"

!--- IP address of the TFTP server

enterprises.9.5.1.5.2.0 = "switch-config"

!--- name of the switch configuration file

enterprises.9.5.1.5.3.0 = 2

!--- Module number. In this case, Supervisor module

enterprises.9.5.1.5.4.0 = 1

!--- TFTP action

enterprises.9.5.1.5.5.0 = 2

!--- Result of the TFTP action, 2 = Succes

轮询tftpResult MIB对象,并将输出与附录A中的MIB对象详细信息比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5.5

enterprises.9.5.1.5.5.0= 2

!--- Result of the TFTP action, 2 = Success

如果下载成功,则MIB对象输出等于2(或成功)。 如果您收到其他输出,请将其与tftpResult对象的附录A进行比较,并采取相应的步骤。

注意: 此过程从交换机传输默认和非默认配置,如启用模式下交换机CLI上show config all命令的输出所示。交换机上的show config命令仅显示非默认配置。

这些步骤将指导您完成复制软件映像的过程。

请完成以下步骤:

下载正确的Supervisor映像文件并将其放置到TFTP服务器的/tftpboot目录中。在本示例中,使用cat6000-sup.5-4-2a.bin进行图示。

使用以下语法将文件的权限更改为777:chmod 。

chmod 777 cat6000-sup.5-4-2a.bin

定义使用tftpHost MIB对象的TFTP服务器的IP地址:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.1.0 s 171.68.191.135

enterprises.9.5.1.5.1.0 = "171.68.191.135"

定义用于复制映像文件的TFTP文件名:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.2.0 s cat6000-sup.5-4-2a.bin

enterprises.9.5.1.5.2.0 = "cat6000-sup.5-4-2a.bin"

在本示例中,Supervisor模块编号为2,并且位于插槽编号2中,如show module命令输出所示。使用2 以定义tftpModule MIB对象:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.3.0 i 2

enterprises.9.5.1.5.3.0 = 2

这意味着TFTP服务器上/tftpboot目录中的CatOS映像将传输到Supervisor模块闪存,如show flash命令的输出所示。

使用tftpAction MIB对象以定义将映像文件从TFTP服务器传输到MIB对象值为4 = downloadSw的交换机。请参阅附录A中的MIB对象详细信息:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.4.0 i 4

enterprises.9.5.1.5.4.0 = 4

要验证此操作的结果,请执行以下步骤之一:

轮询tftpGrp(.1.3.6.1.4.1.9.5.1.5)MIB对象,并将结果与附录A进行比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5

enterprises.9.5.1.5.1.0 = "171.68.191.135"

!--- IP address of the TFTP server

enterprises.9.5.1.5.2.0 = "cat6000-sup.5-4-2a.bin"

!--- name of the switch image file

enterprises.9.5.1.5.3.0 = 0

enterprises.9.5.1.5.4.0 = 4

!--- TFTP action, 4 = downloadSw

enterprises.9.5.1.5.5.0 = 1

!--- Result of the TFTP action, 1 = In Process

注:最后一个条目显示图像传输正在进行。等待几分钟,然后再次轮询tftpResult MIB对象,以验证其已成功传输。此步骤可能需要几分钟才能完成,具体取决于映像文件大小(字节)。 当映像传输过程正在进行时,如果在交换机上发出show flash命令,您将看到:

Cat6509> (enable) show flash

TFTP session in progress. Try again later.

轮询tftpResult MIB对象,并将输出与附录A中的MIB对象详细信息比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5.5

enterprises.9.5.1.5.5.0 = 2

!--- Result of the TFTP action, 2 = Success

如果下载成功,则MIB对象输出等于2(或成功)。 如果您收到其他输出,请将其与tftpResult对象的附录A进行比较,并采取相应的步骤。

成功完成映像传输后,验证映像文件大小(字节)是否与TFTP服务器(本例中为cat6000-sup.5-4-2a.bin)中的文件(show flash命令输出中显示的文件)匹配。

这些步骤将指导您完成复制软件映像的过程。

请完成以下步骤:

在TFTP服务器的/tftpboot目录中创建一个新文件image.bin。在UNIX上,使用以下语法:按。使用.bin作为文件扩展名。

touch image.bin

使用以下语法将文件的权限更改为777:chmod 。

chmod 777 image.bin

使用tftpHost MIB对象定义TFTP服务器的IP地址:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.1.0 s 171.68.191.135

enterprises.9.5.1.5.1.0 = "171.68.191.135"

定义将用于复制映像文件的TFTP文件名和tftpFile MIB对象:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.2.0 s image.bin

enterprises.9.5.1.5.2.0 = "image.bin"

在本示例中,Supervisor模块编号为2,并且位于插槽编号2中,如show module命令输出所示。使用2定义tftpModule MIB对象:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.3.0 i 2

enterprises.9.5.1.5.3.0 = 2

这意味着在闪存中的Supervisor模块上运行的CatOS映像会传输到TFTP服务器,如show flash命令的输出所示。

使用tftpAction MIB对象以定义将映像文件从TFTP服务器传输到MIB对象值为5= uploadSw的交换机。请参阅附录A中的MIB对象详细信息:

% snmpset 172.16.99.66 private .1.3.6.1.4.1.9.5.1.5.4.0 i 5

enterprises.9.5.1.5.4.0 = 5

要验证这些操作的结果,请执行以下步骤之一:

轮询tftpGrp(.1.3.6.1.4.1.9.5.1.5)MIB对象,并将结果与附录A进行比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5

enterprises.9.5.1.5.1.0 = "171.68.191.135"

!--- IP address of the TFTP server

enterprises.9.5.1.5.2.0 = "image.bin"

!--- name of the switch image file

enterprises.9.5.1.5.3.0 = 2

!--- Module number. In this case, Supervisor module

enterprises.9.5.1.5.4.0 = 5

!--- TFTP action, 5 = uploadSw

enterprises.9.5.1.5.5.0 = 1

!--- Result of the TFTP action, 1 = In Process

注:最后一个条目显示图像传输正在进行。等待几分钟,然后再次轮询tftpResult MIB对象,以验证其已成功传输。此步骤可能需要几分钟才能完成,具体取决于映像文件大小(字节)。

轮询tftpResult MIB对象,并将输出与附录A中的MIB对象详细信息比较:

% snmpwalk 172.16.99.66 public .1.3.6.1.4.1.9.5.1.5.5

enterprises.9.5.1.5.5.0 = 2 --> Result of the TFTP action, 2 = Success

如果下载成功,则MIB对象输出等于2(或成功)。 如果您收到其他输出,请将其与tftpResult对象的附录A进行比较,并采取相应的步骤。

成功完成映像传输后,验证TFTP服务器(本例中为image.bin)中文件的show flash命令输出中显示的映像文件大小(字节)是否匹配。

注意:如果闪存中有多个映像(show flash),则只有启动Supervisor模块的映像才会通过此过程传输到TFTP服务器。使用show boot命令查看BOOT变量=,该变量显示Supervisor模块使用闪存中的哪个映像进行启动。有关详细信息,请参阅升级软件映像和使用Catalyst交换机上的配置文件。

注意:这些脚本仅作为示例提供,Cisco Systems不以任何方式支持。

在交换机上自动执行配置文件和Cisco IOS迁移的脚本

#!/bin/sh

# Script to automate config file & IOS migration of switches

# supporting STACK-MIB including 5000, 5500, 1400, 2900, 1200

if [ ! -f SW ] ;

then

echo

echo "File SW does not exist!!!"

echo

echo "Syntax is 'switch.sh'"

echo "where each line in file SW lists:"

echo "Switchname Filename Serverip Module# Moduleaction Community"

echo

echo "Switchname must resolve"

echo "Filename must exist in server tftpboot directory 777"

echo "Serverip is the ip of the server for the file"

echo "Module# is usually '1'"

echo "Module action is as per STACK-MIB: "

echo "- 2 - config file - server > switch"

echo "- 3 - config file - switch > server"

echo "- 4 - software image - server > switch"

echo "- 5 - software image - switch > server"

echo "Community is *write* community"

echo

exit

fi

cat SW |

while read SW

do

SWNAME=\Qecho $SW | cut -d' ' -f 1\Q

FILE=\Qecho $SW | cut -d' ' -f 2\Q

SERVER=\Qecho $SW | cut -d' ' -f 3\Q

MODULE=\Qecho $SW | cut -d' ' -f 4\Q

ACTION=\Qecho $SW | cut -d' ' -f 5\Q

CMTY=\Qecho $SW | cut -d' ' -f 6\Q

echo

echo $SWNAME

echo $FILE

echo $SERVER

echo $MODULE

echo $ACTION

echo $CMTY

echo

# '-t #' can be modified to adjust timeout

snmpset -t 100 -c $CMTY $SWNAME .1.3.6.1.4.1.9.5.1.5.1.0 octetstring $SERVER

sleep 5

snmpset -t 100 -c $CMTY $SWNAME .1.3.6.1.4.1.9.5.1.5.2.0 octetstring $FILE

sleep 5

snmpset -t 100 -c $CMTY $SWNAME .1.3.6.1.4.1.9.5.1.5.3.0 integer $MODULE

sleep 5

snmpset -t 100 -c $CMTY $SWNAME .1.3.6.1.4.1.9.5.1.5.4.0 integer $ACTION

sleep 60

echo

echo Check Progress...

echo

echo

echo "Switch $SWNAME: \\c"; snmpget -t 100 -c $CMTY $SWNAME .1.3.6.1.4.1.9.5.1.5.5.0 | cut

-d":" -f 3

done

交换机期望脚本在交换机上执行特定命令

#!/usr/nms/bin/expect

# Above line points to your expect interpreter

# Add '-d' option to expect line above to enable debugging

# Tested on Cat5000 with regular login; no error-checking

# except for number arguments, but will timeout on failure.

# Tacacs+ lines left in for future releases

set argc [llength $argv]

if { $argc < 4} {

puts "Syntax is:"

puts "(For system with no Tac+)"

puts "switch.exp destination \"command\" vtypassword enapassword"

exit 0 }

set destination [lindex $argv 0]

puts -nonewline "Where we're going: "

puts $destination

set command [lindex $argv 1]

puts -nonewline "What we're doing: "

puts $command

set vtypassword [lindex $argv 2]

puts -nonewline "What our password is (vty): "

puts $vtypassword

set enapassword [lindex $argv 3]

puts -nonewline "What our password is (enable): "

puts $enapassword

# username only for Tac+

set username [lindex $argv 4]

puts -nonewline "What our username is if Tac+: "

puts $username

#

set timeout 10

spawn telnet $destination

expect {

"Enter password:" {

send "$vtypassword\r" }

"Username:" {

send "$username\r"

exec sleep 1

expect "Password:"

send "$vtypassword\r"

}

}

# Look for non-enable router 'prompt>'

expect -re "(^.*)(\r\n\[^ \]+> \$)"

# Get into enable mode

send "en\r"

expect {

"password: " {

send "$enapassword\r" }

"Username:" {

send "$username\r"

exec sleep 1

expect "Password:"

send "$enapassword\r" }

}

# Look for enable router 'prompt#'

expect -re "(^.*)(\r\n\[^ \]+(enable) \$)"

# Send the command

send "$command\r"

expect {

-re "(^.*)(\r\n\[^ \]+ (enable) \$)" {

append buffer $expect_out(1,string)

}

-re "(^.*)(\r\n\ --More-- \$)" {

append buffer $expect_out(1,string)

send " "

}

-re "(^.*)(\r\n\ --More-- \$)" {

append buffer $expect_out(1,string)

send " "

}

}

# Done with command - disable prior to exit

send "disable\r"

expect -re "(^.*)(\r\n\[^ \]+> \$)"

exec sleep 1

send "logout"

Perl脚本通过SNMP显示与“show cam dynamic”相同的输出

#!/usr/local/bin/perl

open(TABLE, "bridge-table.csv") || die "Cant' open file: $!\n";

while (

($vlan, $unicast_mac, $mod_ports) = split (/,/, $_);

write;

}

exit;

format STDOUT =

set cam permanent @<<<<<<<<<<<<<<<<<< @<<< @<

$unicast_mac, $mod_ports, $vlan

对象

tftpHost

OID

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .1

类型

显示字符串

权限

读写

语法

二进制八位数字符串(0.64)

状态

当前

描述

用于TFTP传输或存储设备传输的源/目标主机的名称。如果名称用于TFTP传输,则可以是IP地址或主机名。如果存储设备传输的名称为deviceName:(例如slot0:、slot1:)

树中的OID

::= { iso(1)org(3)dod(6)internet(1)private(4)enterprises(1)cisco(9)workgroup(5)ciscoStackMIB(1)tftpGrp(5)1 }

对象

tftpFile

OID

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .2

类型

显示字符串

权限

读写

语法

二进制八位数字符串(0.64)

状态

当前

描述

用于TFTP传输或存储设备传输的文件名。

树中的OID

::= { iso(1)org(3)dod(6)internet(1)private(4)enterprises(1)cisco(9)workgroup(5)ciscoStackMIB(1)tftpGrp(5)2 }

对象

tftpModule

OID

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .3

类型

整数

权限

读写

状态

当前

范围

0 - 16

描述

传输模块的哪个代码/配置。

树中的OID

::= { ISO(1)org(3)DOD(6)Internet(1)私有(4)企业(1)cisco(9)workgroup(5)ciscoStackMIB(1)tftpGrp(5)3 }

对象

tftpAction

OID

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .4

类型

整数

权限

读写

状态

当前

价值

其他

downloadConfig

uploadConfig

downloadSw

uploadSw

downloadFw

uploadFw

描述

如果将此对象设置为可接受值之一,它会使用tftpHost、tftpFile和tftpModule中提供的信息启动请求的操作。downloadConfig(2):从主机/文件上传接收配置Config(3):将配置发送到主机/文件downloadSw(4):从主机/文件上传软件(5)接收软件映像:将软件映像发送到主机/文件下载Fw(6):从主机/文件上传接收固件映像Fw(7):向主机/文件发送固件映像如果将此对象设置为任何其他值,则会出现错误。

树中的OID

::= { ISO(1)org(3)DOD(6)Internet(1)私有(4)企业(1)cisco(9)workgroup(5)ciscoStackMIB(1)tftpGrp(5)4 }

对象

tftpResult

OID

.1 .3 .6 .1 .4 .1 .9 .5 .1 .5 .5

类型

整数

权限

只读

状态

当前

价值

正在进行

成功

noResponse

tooManyRetries

noBuffers

noProcesses

badChecksum

badLength

badFlash

serverError

userCancelled

错误代码

fileNotFound

invalidTftpHost

invalidTftpModule

accessViolation

unknownStatus

invalidStorageDevice

insufficientSpaceOnStorageDevice

insufficientDramSize

不兼容映像

描述

包含最后一个TFTP操作请求的结果

树中的OID

::= { ISO(1)org(3)DOD(6)Internet(1)私有(4)企业(1)cisco(9)workgroup(5)ciscoStackMIB(1)tftpGrp(5)5 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值