expect使用示例

expect使用示例

如果通过对expect重定向的方式写脚本的话,这样的脚本适合出现在脚本文件中,如果是通过expect -c这样的方式调用,则运行在命令行上

示例一

该示例适合运行在脚本文件中,然后通过expect命令运行脚本文件,比如脚本名test.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
expect << 'END'
  set pass "segfault"
  spawn ssh root@segfault.net
  expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send -- "$pass\n" }
  }
  expect "Continuing in 30 sec..." { sleep 30; send "\r" }
  expect "Press any key to continue" { send "\r" }
  # expect "Would you like to see your SECRET now? (y/N)" { send "y" }  
  interact
END

运行方式

1
  expect test.sh

示例二

该示例适合运行在命令行,如果将该示例添加到脚本文件运行则会执行不了,直接复制该示例粘贴到命令行上回车运行即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
expect -c '
  set pass "segfault"
  spawn ssh root@segfault.net
  expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send -- "$pass\n" }
  }
  expect "Continuing in * sec..." { send "\n" }
  expect "Press*" { send "\n" }
  interact
'

增加端口转发和代理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
expect -c '
  set pass "segfault"
  spawn ssh -D 127.0.0.1:1080 root@segfault.net
  expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send -- "$pass\n" }
  }
  expect "Continuing in * sec..." { send "\n" }
  expect "Press*" { send "\n" }
  interact
'

-D 127.0.0.1:1080:开启一个 SOCKS5 代理,监听在本机的 127.0.0.1:1080

验证代理
1
2
3
4
5
6
7
$ curl --proxy socks5://127.0.0.1:1080 google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

示例三

这是一个常规示例,同样,运行在命令行上

1
2
3
4
5
6
7
8
9
expect -c '  
  set pass "Mind@123"
  spawn ssh root@192.168.0.2
  expect {
        "yes/no" { send "yes\r"; exp_continue }
        "password:" { send -- "$pass\r" }
  }  
  interact
'

使用for循环

1
2
3
4
5
6
7
8
9
expect -c '
    spawn cmd /c EMIFboot_out2bin.bat    
    expect "Press"
    for {set i 0} {$i < 3} {incr i} {
        send "\n"
        sleep 0.1
    }                       
    expect eof    
'

expect eof 和 interact 有什么区别

expect eof 和 interact 是 Expect 脚本中两个非常重要的命令,它们有着本质的区别:

expect eof - 等待子进程结束

作用:等待 spawn 启动的子进程执行完毕

行为:阻塞直到子进程退出

适用场景:自动化脚本执行,不需要用户交互

示例:

1
2
3
4
5
expect
spawn some_command
expect "some pattern"
send "some input\r"
expect eof  # 等待 some_command 执行完成

interact - 将控制权交还给用户

作用:将键盘输入传递给子进程,允许用户与程序交互

行为:Expect 停止自动化控制,用户可以直接操作

适用场景:部分自动化后需要用户手动操作

示例:

1
2
3
4
5
expect
spawn ssh user@host
expect "password:"
send "mypassword\r"
interact  # 登录后,用户可以直接操作ssh会话

对比表格:

特性 expect eof interact
控制权 Expect 保持控制 交还给用户
等待对象 等待进程结束 不等待,立即返回
典型用途 完全自动化 半自动化
后续代码 可以继续执行 通常放在脚本末尾
进程状态 进程结束后继续 进程继续运行
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计