linux下使用expect的注意事项

linux下的expect使用坑很多,如果不遇到就不知道还有这么多要注意的,可能并不全面,但我会逐渐把遇到的每个坑都更新到里面。

1,expect 和 send 交互式执行

      这是我在我的服务器上测试过的语句,最后得出结论是spawn开启的新进程,后面的expect和send都是在和这个进程打交道,如果再重新开启一个spawn会自动退出上一个进程,然后重新开启。比如我在图中spawn连接了远程服务器,执行一些语句,然后再开启一个spawn,那么第二个spawn会在本地运行,因为他们不属于同一个进程了。还有一点是,开启了spawn的进程中,输入send 发送交互语句的时候 在后面必须有一个expect,spawn 命令是出现交互式的前提下的  但是expect 匹配不上的话,那么它就会按照timeout 的设置进行等待

#!/usr/bin/expect
2
3 set timeout 30
4 spawn ssh 10.192.224.224
5 expect "password:"
6 send "mypassword\n"
7 expect "*$"

      上面这个例子中send "mkdir tmpdir\n" #远程执行命令用send发送,不用spawn, expect "*$" #注意这个地方,要与操作系统上环境变量相匹配,尤其是有空格的情况下,一定在expct "*$ "把空格加上,加不上你就完蛋了。我试过。 这个例子实际上是通过ssh 去登录远程机器,并且在远程机器上创建一个目录, 我们看到在我们输入密码后并没有去expect eof,这是因为ssh 这个spawn 并没 有结束,而且手动操作时ssh 实际上也不会自己结束除非你exit;所以你只能 expect bash 的提示符,当然也可以是机器名等,这样才可以在远程创建一个目 录。 注意,请不要用spawn mkdir tmpdir,这样会使得上一个spawn 即ssh 结束,那 么你的tmpdir 将在本机建立。 当然实际情况下可能会要你确认ssh key,可以通过并行的expect 进行处理,不 多赘述。

2,添加变量,send 中的语句执行必须要expect

#!/usr/bin/expect

set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]

spawn scp  $src_file $username@$host:$dest_file
expect {
    "(yes/no)?"
        {
            send "yes\n"
            expect "*assword:" { send "$password\n"}
        }
     "*assword:"
         {
            send "$password\n"
        }
     }
 expect "100%"
 expect eof

截图如下:

注意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。 spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。 有了这段expect的代码,还只能完成对单个远程主机的scp任务。如果需要实现批量scp的任务,则需要再写一个shell脚本来调用这个expect脚本。

注意,如果远程主机密码中有“$”、“#”这类特殊字符的话,在编写列表文件时就需要在这些特殊字符前加上转义字符,否则expect在执行时会输入错误的密码。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值