Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Expect脚本如何确定expect_out的内容

Expect脚本如何确定expect_out的内容
EN

Stack Overflow用户
提问于 2020-04-02 16:14:57
回答 1查看 184关注 0票数 2

我正在尝试编写一个脚本将提供凭据到一个vpn的一个警告,其中VPN要求我提供动态口令。

这是我的脚本:

代码语言:javascript
运行
AI代码解释
复制
#! /usr/bin/expect

set vpn    [ lindex $argv 0]
set group  [ lindex $argv 1]
set user   [ lindex $argv 2]
set secret [ lindex $argv 3]

log_user 2 
spawn nmcli con up $vpn --ask

expect {
        "GROUP:" { 
                send "$group\r"
                exp_continue
        }
        "Username:" { 
                send "$user\r"
                exp_continue
        }
        Password: {
                send_user "\nProvide RSA OTP:"
                expect_user -re ":(.*)\r"
                set otp $expect_out(0,string)  <--------- Error!!!
                set pass "$secret$otp"
                send "$pass\r"
                exp_continue
        }
        "Connection successfully activated" {
                send_user "Connected to VPN\r"
        }
        "Login failed" {
                send_user "Login failed\r"
                exp_continue
        }
        "already active" {
                send_user "Already connected to VPN\r"
        }
}
exit

我添加了一个箭头,指向我认为是问题根源的地方,因为当我运行此脚本时,它看起来像是expect_out包含Password:。根据我在手册页中读到的内容,我认为每次进行新的匹配时缓冲区都会被清除,因此它包含最近的expect子句(在本例中为expect_user -re ":(.*)\r")中匹配的字符串,但似乎我错了。我没有看到任何说明说需要像interact那样使用不同的函数访问expect_user内容,所以我不确定我的密码去哪里了?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2020-04-02 17:31:39

使用send_user时,您将看不到所写内容的回显,这与发送到派生命令时不同,因此除非用户显式键入:,否则您永远不会匹配它。此外,您将读取换行符,而不是回车符。所以请使用

代码语言:javascript
运行
AI代码解释
复制
expect_user -re "(.*)\n"

来获取用户输入,$expect_out(1,string) (1而不是0)将包含输入。

您观察到的是expect_user中的超时,这就是为什么变量不会更新,仍然包含旧的匹配。

为了防止不可见的超时,您可以设置一个“全局”超时检查,从

代码语言:javascript
运行
AI代码解释
复制
proc abort { } { send_user "Timeout!" ; exit 2 }
expect_before timeout abort

expect_before是在每个expect之前完成的,而且似乎也是在每个expect_user之前完成的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60996173

复制
相关文章
Here Documents 结合expect的使用--(2)
我们已经知道expect可以帮我们自动完成“交互工作”,但是如果我们需要拿到 通过expect spawn的sub-process 所执行命令的结果,那么怎么做呢? 通过重定向当然是不可能的了,因为spawn产生的是一个由expect来维护的一个子进程,当这个sub-process结束的时候,已经没有办法再进入了,就算重定向成功,也是无法拿到结果,况且重定向是否成功,我们也是没有办法知道的; expect给我们提供了一个特定的访问方法,那就是用 expect_out, 常用的有$expect_out(buffer) 或者 $expect_out(NUMBER, string) , 把 $expect_out(buffer) 或者 $expect_out(NUMBER, string) 的结果通过set 赋值给变量,然后把变量写入文件就可以拿到命令的执行结果了;
qsjs
2020/06/09
9060
Here Documents 结合expect的使用--总结篇
总结: 如何打开expect的log, 怎么使用log ? 打开expect的log非常简单,只需要定义变量log_file , 格式为: log_file /tmp/exp_log, 其中后面的
qsjs
2020/06/09
5380
Here Documents 结合expect的使用--(3)
在上一节中,我们学习了 expect_out,但是还没有演示到底如何使用expect_out来获得spawn出来的sub-process中执行的命令的结果,这里我们来演示如下:
qsjs
2020/06/09
4280
自动登录expect脚本
vim 1.exp #! /usr/bin/expect set host "192.168.6.77" set passwd "12341234" spawn ssh root@$host expect { "yes/no" { send "yes\r"; exp_continue} "assword:" { send "$passwd\r" } } interact 添加权限 chmod +x 1.exp 执行 [root@node06 ~]# ./1.exp spawn ssh root@19
零月
2018/04/25
2.1K0
crontab执行expect脚本
通过rsync的ssh差异备份方式同步本地目录到远端目录,expect代码如下,命令行手动执行即可
拓荒者
2019/07/01
2.3K0
expect shell 脚本记录
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
郭顺发
2021/12/17
8620
20.28 expect脚本远程登录
expect脚本远程登录 yum install -y expect 自动远程登录 [root@aminglinux-02 sbin]# vim 1.expect #! /usr/bin/expect set host "192.168.133.132" set passwd "123456" spawn ssh root@$host expect { "yes/no" { send "yes\r"; exp_continue} // "password:" { send "$pass
运维小白
2022/01/06
1.2K0
expect 实现脚本的自动交互
expect 是建立在 tcl 语言基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信。可以将交互过程如:ssh 登录、ftp 登录、scp 复制文件等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。其交互流程是: spawn 启动指定进程 -> expect 获取指定关键字 -> send 想指定进程发送指定指令 -> 执行完成, 退出。
嵌入式视觉
2022/09/05
1K0
expect 实现脚本的自动交互
expect中的正则匹配[通俗易懂]
注意.*在这里是贪婪匹配,也就是说会尽可能多的匹配 所以pattern的各个项对应关系:
全栈程序员站长
2022/11/01
1.2K0
bash 脚本中嵌入 expect
在 中执行一些命令时总是需要交互式的输入信息,如 等等,这可以起到提醒用户的作用,也更加保险。但是有的时候在执行自动化脚本时并不希望一直进行交互式的操作,所以 便显得极为有用。
f_zyj
2021/12/07
2.1K0
Linux expect 自动交互脚本用法
最近用到自动交互脚本进行数据库备份,以前虽然也有用来使用 ftp 远程获取文件,还来没有系统记录过,趁这次机会总结一下。
Li_XiaoJin
2022/06/12
1.8K0
20.30 expect脚本传递参数
expect脚本传递参数 传递参数 #!/usr/bin/expect set user [lindex $argv 0] //第一个参数 set host [lindex $argv 1] //第二个参数 set passwd "123123a" set cm [lindex $argv 2] //第三参数 spawn ssh $user@$host expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } exp
运维小白
2022/01/06
1.2K0
20.31 expect脚本同步文件
expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 #!/usr/bin/expect set passwd "123456" spawn rsync -av root@192.168.133.132:/tmp/12.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect eof expect eof :只有spawn执行的命令结果才会被expect捕捉到,因为sp
运维小白
2022/01/06
3340
Linux 下自动应答工具 Expect 使用指南
现代的 Shell 对程序提供了最小限度的控制(程序的开始/停止/关闭等),而把交互的特性留给了用户。这意味着有些程序,你不能非交互的运行,比如说 passwd 命令。有一些程序可以非交互的运行,但在很大程度上丧失了灵活性,比如说 fsck 命令。这表明 Unix 的工具构造逻辑开始出现问题。Expect 恰恰填补了其中的一些裂痕,解决了在 Unix 环境中长期存在着的一些问题。
iMike
2021/03/10
1.8K0
linux学习第六十九篇:分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数
分发系统介绍 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。 expect脚本远程登录 yum install -y expect 自动远程登录 #! /usr/bin/expect set host "192.168.85.132" #要远程登录的机器IP set pass
用户1215343
2018/03/29
1.6K0
linux学习第六十九篇:分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数
shell expect权威指南和实战
我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而expect就使用来实现这种功能的工具。
sunsky
2020/08/20
2.1K0
expect交互式脚本编写
#!/usr/bin/expect set full_name [lrange $argv 0 0] set domain_name [lrange $argv 1 1] set Organization_name [lrange $argv 2 2] set Generic_name [lrange $argv 3 3] spawn openssl req -new -newkey rsa:2048 -nodes -keyout $Generic_name.key -out $Generic_nam
@凌晨
2022/01/12
4230
20.29 expect脚本远程执行命令
expect脚本远程执行命令 动远程登录后,执行命令并退出 #!/usr/bin/expect set user "root" set passwd "123123a" spawn ssh $user@192.168.133.130 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } expect "]*" send "touch /tmp/12.txt\r" expect "]*" sen
运维小白
2022/01/06
1.2K0
Shell脚本和expect实现自动交互
expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况
剧终
2020/08/27
1.5K0
expect脚本中设置超时,比如下面的脚本
文件expect_ssh_scp.sh #!/usr/bin/expect                                                                              #表示使用expect解释器 set timeout 10                                                                                  #设置超时限制为10秒 spawn ssh
拓荒者
2019/07/01
2.9K0

相似问题

如何使用expect_out捕获expect脚本命令的输出?

12

expect - expect_out比较

153

如何在expect中显示expect_out(缓冲区)的内容

10

Expect不识别$expect_out(缓冲区)或$expect_out(0,string)

10

Linux Expect expect_out(缓冲区)不包含任何内容

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文