使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组

Self-Attention与BERT原理及NLP实战技巧 自注意力机制是Transformer架构的核心组件,通过QKV矩阵实现动态权重分配,使模型能够捕捉长距离语义依赖。这种基于注意力权重的上下文建模方式,相比传统RNN具有更好的并行性和可解释性。在自然语言处理领域,BERT等预训练模型将自注意力与双向编码结合,通过掩码语言建模任务学习通用语言表示。实际应用中,这类技术显著提升了文本分类、实体识别等任务的准确率,特别是在处理多义词和复杂句式时表现突出。结合电商评论分析和法律文书解析等场景实践,合理使用多头注意力机制和分层微调策略,能够有效解决领域适应和小样本学习 阅读详情

背景

有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互。

expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。

安装expect

  • 安装依赖:yum install tcl -y
  • 安装expect:Centos系统yum install expect -y或Ubuntu系统apt-get install expect -y

一些基本的expect命令

  • spawn :启动新进程,用于执行shell命令;
  • expect :从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串;
  • send :用于向发起交互的命令的进程发送字符串;
  • interact:允许用户交互,即此命令后,交互将不会由expect进行,将交回给用户;

示例

#!/usr/bin/expect

set timeout 30
set host "192.168.200.221"
set username "root"
set password "123456"

spawn ssh $username@$host ls
expect "password" {send "$password\r"}
expect eof
interact

#!/usr/bin/expect: 表示使用expect来解释该脚本。

set timeout 30: 表示设置超时时间,这里是表示超时时间为30秒,默认为10秒,用于执行shell命令的时间,如果执行的shell命令时间较长(如传输文件),则需要设置长一点。

set username “root” : 表示设置并定义了变量username,变量值为"root"。

spawn ssh $username@$host ls: 表示使用spawn来执行ssh $username@$host ls 命令,该命令只有在expect环境里才能执行,所以直接在命令行输入或没有安装expect则会报错,它的主要功能是给它后面的shell命令运行进程加了个壳,进行传递交互的内容,注意,如果用引号将变量引起,将可能导致错误extra characters after close-quote…,如果执行的命令需要用到引号,使用双引号,并使用\转义,但只适用于命令中只有一对引号的情况,如果出现多对引号,将会出现一些奇怪的错误,暂时不知道如何解决。

如ssh -l root 192.168.200.118 'mysql -uroot -p123456 -e "show datavases;"' 命令。只能先登录目标主机,再匹配root@ubuntu:~#,send发送命令。

#!/usr/bin/expect -f
set timeout -1
spawn ssh root@192.168.200.118
expect -re "password" { send "userpwd123\r" }
expect -re ":~#" { send "mysql -uroot -p123456\r" }
expect -re "mysql>" { send "show databases;\r" }
expect -re "mysql>" { exit }
expect eof

expect “password”: 表示从spawn执行的命令的进程里接受字符串,一般是弹出终端的交互行的标准输入提示信息,如需要你确定时的(yes/no?),需要你输入密码的(…password:)。这里因为ssh命令的交互内容是叫你输入密码,交互提示的内容有password,所以这里匹配password。需要注意的是,expect接受的是spawn执行的命令进程中可能出现的字符串,如果你的spawn执行的命令在执行完之后直接没有进程了,那expect也将不能匹配到任何的字符串,如spawn简单的执行ls等命令,这也说明expect多用于需要执行连接的场景。

send “$password\r”: 表示当expect命令匹配成功,就把$password发送给spawn执行的命令的进程,完成交互,相当于手动输入$password,这里的\r代表回车,也可以使用\n,记得加上\r或\n,否则脚本将可能会卡死。

expect eof: 表示结束expect,读取到文件结束符 ,当spawn发送指令到终端执行时在返回时被expect捕捉时,在起始会有一个eof,就好比在shell中 cat >>file <<EOF... EOF一样,在结束时也要有eof;expect eof有时间限制,即我们设置的超时时间,默认10秒,不过可能出现的问题是,如果是在传输一个大文件,可能在文件还没传输完成便断开了命令执行,此时需要设置超时时间长一点或 set timeout -1,或将expect eof改成expect -timeout -1 eof。

interact: 执行完命令后,控制权交互控制台,此时再有交互,expect将不会进行交互,需要手动进行输入内容交互。如果没有这句,在需要交互的ssh命令执行完毕后将会退出远程,而不是继续保持在远程。

expect参数

  • $argc:表示命令行参数个数
  • [lindex $argv n]:表示index为n的参数(index从0开始计算),index的区间为左闭右开,如[lindex $argv 0]代表命令行输入的第一个参数,[lindex $argv 0 3] 代表命令行输入的第一到第三个参数 。

示例

#!/usr/bin/expect

set host [lindex $argv 0]
set username [lindex $argv 1]
set num $argc
if { num < 3 } {
    ...
}
  • 将第一个命令行参数赋值给变量host,将第二个命令行参数赋值给变量username,将总参数个数赋值给变量num。

expect流程控制

if语句:
if {条件1} {
    expect {
        "(yes/no)"
        {
        send "yes\r"
        expect "*assword:" {send "$password\r"}
        }
        "password"
        {
        send "$password\r"
    }
} else {
    puts "Expect was timeout"
    send_user "Expect was timeout"
}

expect {}: 多行期望,从上往下匹配,匹配成功里面的哪一条,将执行与之的send命令,注意,这里面的匹配字符串只会执行一个,即匹配到的那个,其余的将不会执行,如果想匹配这句命令执行成功后(如登录成功后等待输入的root@ubuntu:~#)的其他字符,需要另起一个expect命令,并保证不在expect{}里面。

puts与send_user: 打印信息,类似echo

其他:

  • 判断条件用{}包含
  • 花括号与花括号,和括号与控制语句之间需要有空格,否则会报错expect:extra characters after close-brace
  • if右边要有左花括号,else左边要有右花括号,不能单独一行
for语句:
for {set i 0} {$i < 10} {incr i} {
    puts "I inside first loop: $i"
}
while语句:
set i 0
while {$i < 10} {
    puts "I inside third loop: $i"
    incr i
    puts "I after incr: $i"
}

incr: 递增运算符 incr i ,类似++

switch语句:
switch--$var {    
    0 {
        语句块
    }
    1 {
        语句块
    }
    ...
}
函数定义和调用:

使用proc定义函数,使用时输入函数名和参数调用

proc test_exp {argv1 argv2} {
    puts "hello:$argv1"
}
test_exp 参数1 参数2
expect数组:
set arr(n) "hello"   # 赋值,arr为数组名
set arr(1) "first"   
$arr(1)     # 引用
array size arr   # 查看数组大小
注意:如果是shell中插入的一段expect中想使用数组,需要转义\$,或<<\EOF...EOF

其他的一些内容

  • 使用正则匹配:使用 -re选项,expect -re “\\\[(.*)]” 其中[在expect shell 正则中都有特殊意义,因此要\三次 ,如果spawn执行的命令不能匹配通配符*,需要在spawn 后加 bash -c。

  • expect -i选项:已交互的方式运行expect。

  • expect -D选项:交互式的调试器,类似gdb。

  • expect -c选项:可执行命令的前置符,expect命令可在命令行执行,该选项-c后的命令需要引号引起来,引号内多个命令分号隔开,可使用多次-c选项,空格隔开。

  • expect -f选项:常见于文件第一行,即#!/usr/bin/expect -f ,指定expect读取的expect命令文件,可选项,该选项会将文件一次性全部读取入内存,加上-f选项可以为执行expect提供更多参数。

  • expect -b选项:类似-f选项,只是每次只读取一行,即可以逐行的执行expect。

  • 拼接字符串:使用append命令append "hello"$user",welcome!"

  • sleep:脚本进入睡眠,使用和其他语言一样,直接跟数字即可,单位为秒。

  • exit:退出

  • foreach:对指定集合的每一个元素,依次赋值给变量。

    foreach [变量] {集合} {语句;}
    foreach i {1 2 3} {
        puts $i
    }
    输出:1
         2
         3
    
  • exp_continue: 循环匹配,通常匹配之后会退出语句,但使用exp_continue 则可以不断循环执行某段语句。

    expect {
        "password" {
            send "$password\r"
            exp_continue    # 不断匹配字符串"password",只要匹配成功就send
        }
    }
    expect eof
    
  • shell 嵌套使用expect,使用重定向,需要注意EOF之间的互相对应,并且变量需要在shell中定义,否者将会找不到变量,expect引用变量部分将是空内容,如同变量消失。如果想使在expect里定义的变量生效,使用<<\EOF…EOF,或用引号将第一个EOF引起来,即<<“EOF”…EOF,这样expect中set定义的变量,遍历时赋值的变量以及expect数组就都能使用了,但是相对的,shell里定义的变量也就不能使用了。

    #!/bin/bash
    hostname=$1                #接收第一个参数
    password=$2
    /usr/bin/expect <<-EOF    # 重定向到expect,想使用expect中set定义的变量,需要转义\$
    spawn ssh root@${hostname}   # 或使用\EOF,但如果是\EOF,将不能使用Shell的变量
    expect {
            "(yes/no)"
            {
            send "yes\r"
            expect "*assword:" {send "$password\r"}
            }
            "password"
            {
            send "$password\r"
            }
    }
    expect eof
    EOF   # 由于用的-EOF,这里的EOF可以有空格,tab键
    
    /usr/bin/expect <<EOF       
    set m_pm(1) "hello"
    set m_pm(2) "world"
    puts "\$m_pm(2)"
    foreach i {1 2 3} {
        puts \$i
    }
    expect eof
    EOF
    
  • excpet中执行shell语句,exec sh -c {shell语句},多用于赋值变量,需要注意的是,expect里使用exec执行的shell语句,即使有打印和交互内容(echo,read命令)也不会输出到终端,即执行了命令,你并不知道是否出错,也不知道执行结果,如果需要将shell中echo命令打印的内容输出到终端,只能将执行结果赋值给expect变量,再使用puts命令打印出来,但即使这样,也会出现一些莫名头疼的问题,所以尽量不要在expect中调用复杂的shell语句。你也可以使用匹配字符,send “命令\r” 的方式执行shell命令,相当于交互互动,如expect ":~#" { send "ls\r" } 匹配到root登录后的终端待输出状态,send发送ls命令并回车。

    exec sh -c {shell 命令}    # 执行的shell命令即使有打印和需要交互的内容也不会出现在终端
    
    set test_echo [exec sh -c {echo "test"}]
    puts "$test_echo"
    
  • expect/shell互相使用彼此变量

    • 如果两者在同一文件中,两者只是作为一段语句存在,使用#!/bin/bash解释的shell文件,expect调用shell变量直接$变量,和shell脚本调用变量方式并无异同,使用#!/usr/bin/expect解释的expect脚本文件,shell作为expect文件的语句,如set a [exec sh -c {echo \$LAB}]调用expect变量,需要在expect里面设置环境变量。

      如:set ::env(LAB) my_lab

    • 如果两者是分别为不同文件,expect作为脚本在shell脚本文件中被调用,如./test.excp,首先需要在shell中进行变量export, 例如export a="test", 然后在expect脚本文件中通过 $::env(a) 引用shell脚本文件的变量,例如set a_exp \$::env(a),同时也可以通过执行子shell调用,例如: set a [exec sh -c {echo $a}]
      在这里插入图片描述
      在这里插入图片描述

  • 向进程发送Ctcl + c,如果想向远端发送Ctrl-C结束远端进程,可以通过send “\003” 实现。

参考博客:

果冻想-Linux expect详解

taoyuanforrest-expect使用技巧

RCE漏洞深度解析:从命令执行到代码执行的攻防实战 在网络安全领域,远程代码执行(RCE)漏洞因其极高的危害性,始终是攻防对抗的焦点。其核心原理在于应用程序未能正确处理用户输入,模糊了数据与代码的边界,导致攻击者能够注入并执行恶意指令。从技术价值看,RCE漏洞的利用直接关系到系统的完整性与控制权,是渗透测试中获取服务器权限的关键路径。典型的应用场景包括Web应用对用户输入的直接拼接调用系统命令,或动态执行未经验证的代码片段,例如在PHP中使用eval()函数或在Java中触发不安全的反序列化。本文聚焦于命令执行与代码执行两大分支,通过剖析Struts2、We 阅读详情

相关推荐

复现HumanMAC(HumanMAC: Masked Motion Completion for Human Motion Prediction)

Human3.6M和HumanEva-I都放到data目录下(记得将data_multi_modal-20250320T022408Z-001.zip和humaneva_multi_modal-20250320T022412Z-001.zip解压缩并且分别重命名为data_multi_modal和humaneva_multi_modal)。生成的gif存放在inference目录下zero_shot_<INDEX>下的out目录下。新建一个data目录,将

qq_52643100的博客 831

Tcl经典报错 之 extra characters after close-quote

作为脚本语言tcl的空格使用尤为重要 经典报错之 extra characters after close-quote 错误的情况 % array set a [list "School,Bupt""Bupt" "School,Tjpu""Tjpu" "School,Njua""Njua"] extra characters after close-quote 正确书写 % array set a [list "School,BUPT" "BUPT" "School,NJU" "NJU" "S.

数字IC 7414

DRM驱动架构浅析-上(DRM基础概要与U-Boot阶段驱动解析)

本文主要探讨了Rockchip平台的DRM显示驱动架构及其在U-Boot阶段的实现。

一路寒风身如絮,命海沉浮客独行 1761

tcl 语法笔记

➢ 用\表示反斜杠置换,换行符、空格、 [、 $等被TCL解释器当作特殊符号对待的字符,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换。而在花括号中,所有特殊字符都将成为普通字符, TCL解释器不会对。TCL解释器对双引号中$和[]符号会进行变量置换和命令置换。➢ 用[]表示命令置换,[]内是一个独立的TCL语句。用$表示变量置换,TCL解释器会将认为。TCL置换分为以下三类。

curry的博客 902

App inventor2通过蓝牙控制Arduino Uno LED开关

App inventer2控制Arduino Uno LED开关 如果学会这个小程序,大部分的手机通过蓝牙控制Arduino的功能都可以实现,这个小示例是通过蓝牙模块向Arduino发送"0"和"1",而其它功能要发送其它不同的字符串内容给Arduino. 所需硬件: Arduino Uno JDY-16 蓝牙模块(我的是蓝牙4.2版本) 草帽LED(可选) 手机(我用的是安卓,苹果手机应该也可以,最近其应用商店也有App inventor(AI)伴侣) 软件: Aduino IDE或者Platfom

Firmin123456的博客 5495

机器学习: 共轭梯度算法(PCG)

今天介绍数值计算和优化方法中非常有效的一种数值解法,共轭梯度法。我们知道,在解大型线性方程组的时候,很少会有一步到位的精确解析解,一般都需要通过迭代来进行逼近,而 PCG 就是这样一种迭代逼近算法。 我们先从一种特殊的线性方程组的定义开始,比如我们需要解如下的线性方程组: Ax=bAx=b 这里的 A(n×n)A(n×n) 是对称,正定矩阵, b(n×...

weixin_30807677的博客 3180

shell expect 报错 extra characters after close-brace close-quote

可能原因 流程控制语句中的"{" 或者 "}" 之间需要空格,但是没有空格 spawn 执行语句的变量被引号引起来了,应去掉引号 { } 不配对,语法错误 示例如下: [test@centos~]./free_test.exp 0extra characters after close-brace while executing "if { $argc == 0 }{ puts "ok" } " (file "./free_test.exp" line 3) [tes...

whatday的专栏 8135

ADS仿真过孔阻抗(via designer)

目录一、将PCB层叠导入ADS(个人习惯)二、过孔的参数化设置三、过孔的仿真四、仿真结果查看五、导出仿真结果和模型六、过孔的经验法则欢迎交流,欢迎转载,转载请注明出处~ 工具:Via Designer Via Designer 调用的是ADS EMPro 仿真引擎,采用的FEM(三维全波有限元法)。 优点: 1、利用ADS已经做好的参数化和流程化的设计,不需要工程师完成过孔的建模这一繁琐的过程。 2、可以输出EMmodule 完成原理图协仿真。 一、将PCB层叠导入ADS(个人习惯) 个人认为在ADS中设置

luohuo9844的博客 1万+

编写expect程序报extra characters after close-brace错误或extra characters after close-quote,解决

expect程序报extra characters after close-brace 可能原因 流程控制语句中的"{" 或者 “}” 之间需要空格,但是没有空格 spawn 执行语句的变量被引号引起来了,应去掉引号 参考博客 lepton126的优快云博客 ...

TDXYBS的博客 6241

光斑大小控制【ZEMAX操作数】

在使用Zemax优化光学系统时,对成像的聚焦光斑大小进行限制,即弥散斑的大小; 一、RSCE(质心RMS光斑半径):二、RSCH(光线RMS光斑半径):

yh的博客 7859

量子阱技术解析:从基础原理到前沿应用

本文深入解析量子阱技术,从微观“能量游泳池”的基础原理出发,阐释了其通过限制电子实现能级量子化,从而精确调控发光波长的核心机制。文章详细探讨了量子阱在半导体激光器和LED中的革命性应用,如实现低阈值电流与高亮度显示,并展望了其在能带工程及量子级联激光器等前沿领域的发展与挑战。

weixin_29267307的博客 282

使用expect实现自动交互,shell命令行自动输入,脚本自动化,变量引用,expect spawn执行带引号命令,expect 变量为空,不生效,不能匹配通配符*,函数,数组...

背景 有需求,在允许命令或者脚本跳出交互行,需要进行内容输入,但需要人手动输入,不是很方便,此时可以通过expect来实现自动互动交互。 expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况。 安装expect 安装依赖:yum install tcl -...

weixin_30619101的博客 229

SAP SmartForms字体 :从OTF缓存溢出到完美解决

精准诊断:遇到错误,首先区分是图片过大还是字体嵌入导致。删除图片测试是最快的判别方法。字体上传规范始终从SE73入口上传用于表单打印的字体。强烈建议应用SAP Note 1301018,确保上传时勾选“不替换其他字体”,避免系统自动替换引发的意外问题。如需为同一字体族上传粗体、斜体等变体,请在SE73初始屏幕上勾选对应的属性框(如BOLD),然后分别上传对应的字体文件(如上传过程中,系统会提示输入RTF控制序列信息,这是确保打印预览正常显示的关键步骤,必须正确填写。方案选型快速止血:采用方案一(

Pegasus666的博客 292

Linux之文本处理小工具+shell从入门到精通

Shell脚本编程核心摘要 本文档全面介绍了Shell脚本编程的核心知识,主要包含以下内容: 文本处理工具:详细讲解grep、cut、sort、uniq等文本处理命令的用法和示例,包括正则表达式应用。 Shell基础特性:包括命令补全、常用快捷键、通配符使用和引号的三种类型(双引号、单引号、反撇号)。 变量管理:涵盖变量分类(本地/环境/全局/系统变量)、定义规则、数组使用、交互式变量定义和变量内容操作。 流程控制:包括if条件判断、for/while/until循环语句的语法结构和实际应用案例,如批量创建

小峰编程 930

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

TCL/Expect交互式自动化测试概要 - - ITeye技术网站

TCL/Expect交互式自动化测试概要 - - ITeye技术网站expect是一种基于TCL,能与交互式程序进行“可程序化”会话的脚本语言,是一种可以提供“分支和嵌套结构”来引导程序流程的解释型脚本语言。 expect由一系列expect-send对组成:expect等待输出中输出特定的字符,然后发送特定的响应。 安装expect:sudo apt-get install expect exp...

weixin_33711641的博客 98

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

expect传入参数和程序执行命令不成功问题

1.expect 关键字 send: 向进程发送字符串,用于模拟用户的输入。注意一定要加\r回车 expect: 从进程接收字符串 spawn: 启动进程(由spawn启动的进程的输出可以被expect所捕获) interact: 用户交互 2.如何向expect脚本传入参数 set <变量名称> [lindex $argv <param index>] 1 注意下标从0...

u011250186的博客 3231

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

将expect加入到shell脚本后 导致设置变量不生效

将expect加入到shell脚本后 set 定义的变量会失效; 解决办法 : 将变量提到expect之外定义 #!/bin/bash . /etc/profile. ~/.bash_profileipnum=`ifconfig|grep addr|grep xxxx |wc -l`if [ $ipnum -eq 0 ];then exitfitime2=`date "+%Y%m%d...

1030

解决expect下命令不能解析通配符*的问题

使用expect可以省去手动交互的过程,比如scp的密码 曾遇到这样一段代码:(Bash脚本) #!/usr/bin/expect -f set HOST "192.168.102.1" set USER "codefor" set PASS "codefor" set BOOKFILE "/home/codefor" #upload spawn "scp *.zip $U...

weixin_30628077的博客 841

expect实现无交互操作

expect实现无交互操作

冯同学的博客 1705

expect 一些实践

https://blog.youkuaiyun.com/wzt888_/article/details/80826196 关于expect expect #自动应答命令用于交互式命令的自动执行 spawn #expect中的监控程序,其运行会监控命令提出的交互式问题 send #发送问题答案给交互命令 “\r” #表示回车 exp_continue #当问题不存在时继续回答下边的问题 expect eof #...

第一天 431

Linux零碎知识--expect

Linux命令–expect expect命令简单介绍就是,它可以模拟键盘输入文本,它是一个自动化交互套件,主要用在执行命令或者程序需要输入密码或者其它文本是,可以自动输入,不至于让终端处于阻塞态 expect的用法,网上搜搜有很多,这里给出两个链接 linux expect详解 脚本ssh连接自动填密码(expect) 这两个链接里都给了详细的例子,但是我在使用的时候,发现了一个需要注意的地方,也是容易出错的地方 #! /bin/bash expect -c " set timeout 1;

路漫漫其修远兮兮兮的博客 543

expect中使用exec执行shell命令的方法

今天想在expect脚本中获取本机ip,执行脚本是报错,脚本如下: set localip [exec ifconfig eth0 | grep Mask | cut -d: -f2 | awk '{print $1}] google了一下,有些文章说需要对shell命令进行修改替换,但我试了一下,依然报错。 继续google,终于发现了一个很简单的解决方法,命令如下: exec

ljkeke的专栏 1万+

[转] Expect的基本用法

一、概述 我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。 Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect...

weixin_30314631的博客 690

linux交互式输入自动化 read & expect

输入脚本: #!/bin/bash #file name : interactive.sh read -p "input number:" num; read -p "input string:" str echo num: $num str:$str; 命令行输入: echo -e "1\nhelloworld\n" | ./interactive.sh 输入内容

wu1217的博客 4182
上一篇: 编写expect程序报extra characters after close-brace错误或extra characters after close-quote,解决
下一篇: 解决Linux:Too many levels of symbolic links
TDXYBS
博客等级 码龄8年 11粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值