linux通过expect实现脚本自动交互
1、安装步骤①首先,准备好所需的两个安装包tcl8.4.13-src.tar.gz(链接:https://pan.baidu.com/s/1yTFtr1zZbYkBnIenm-HWGg ,提取码:h8ed?) expect-5.43.0.tar.gz(链接:https://pan.baidu.com/s/1ZdJo-nRI_FnUYiMzkKqkhA ,提取码:90g5 ) ②安装tcl8.4.13Tcl 的 configure 脚本有一个语法错误,下面的命令可以纠正它: sed -i "s/relid‘/relid/" configure (8.4.13不再有这样的错误了) 编译tcl cd unix ./configure --prefix=/expect make make install mkdir -p /tools/lib 需要的内容都拷贝到/tools/lib目录 cp tclConfig.sh /tools/lib/ 安装完毕完先不要删除源码,以会安装expect还要用到 将/tools/bin目录export到环境变量, ③安装expect./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no 如果报 checking for Tcl private headers... checking for tclInt.h... no configure: error: Can‘t find Tcl private headers 就再添加一个头文件目录参数 --with-tclinclude=../tcl8.4.13/generic,即: ./configure --prefix=/tools --with-tcl=/tools/lib --with-x=no --with-tclinclude=../tcl8.4.13/generic
脚本运行正常,进行执行make进行编译 make 编译过程中未出现错误,执行安装: make install 编译完成后会生在/tools/bin内生成expect命令 . .bash_profile 此时在命令行执行expect应该可以执行了!? ④完成安装下面就可以做expect的工作了! 以下转自:https://mp.weixin.qq.com/s/oM6084HOzpS6mp1RQQoUpg 2、 expect的常用命令
3、 作用原理简介3.1 示例脚本这里以ssh远程登录某台服务器的脚本为例进行说明,假设此脚本名称为remote_login.sh: #!/usr/bin/expect set timeout 30 spawn ssh -l root 172.16.22.131 expect "password*" send "123456r" interact 3.2 脚本功能解读(1) #!/usr/bin/expect 上述内容必须位于脚本文件的第一行,用来告诉操作系统,此脚本需要使用系统的哪个脚本解析引擎来执行.具体路径可通过command -v expect命令查看. 注意:这里的expect和Linux的bash、Windows的cmd等程序一样,都是一种脚本执行引擎.脚本需要有可执行权限(chmod +x remote_login.sh,或chmod 755 auto_login.sh),然后通过命令./remote_login.sh运行即可;如果输入sh remote_login.sh,意义就不一样了: 明确调用sh引擎去执行此脚本,此时首行的#!/usr/bin/expect就失效了. (2) set timeout 30 设置连接的超时时间为30秒.(3) spawn ssh -l root 172.16.22.131spawn、send等命令是expect工具中的内部命令,如果没有安装expect工具,就会出现"spawn not found"等错误. 不要用which spawn之类的命令去找spawn,因为并没有这样的程序. (4) expect "password*" 这个命令用来判断上次输出结果里是否包含"password*"的字符串,如果有则立即返回,否则就等待一段时间后返回. 这里的等待时长就是前面设置的timeout,也就是30秒. (5) send "123456r" 这里就是执行交互动作,作用等同于手工输入密码.提示: 命令字符串结尾加上r,这样的话,如果出现异常等待的状态就能够停留下来,作进一步的核查. (6) interact expect执行完成后保持用户的交互状态,这个时候用户就可以手工操作了.如果没有这一句,expect执行完成后就会退出脚本刚刚远程登录过去的终端,用户也就不能继续操作了. 4 其他脚本使用示例4.1 直接通过expect执行多条命令注意首行内容,这种情况下就只能通过./script.sh来执行这类脚本了: #!/usr/bin/expect -f set timeout 10 # 切换到root用户,然后执行ls和df命令: spawn su - root expect "Password*" send "123456r" expect "]*" # 通配符 send "lsr" expect "#*" # 通配符的另一种形式 send "df -Thr" send "exitr" # 退出spawn开启的进程 expect eof # 退出此expect交互程序 4.2 通过shell调用expect执行多条命令注意首行内容,这种情况下可通过sh script.sh、bash script.sh 或./script.sh,都可以执行这类脚本: #!/bin/bash ip="172.16.22.131" username="root" password="123456" # 指定执行引擎 /usr/bin/expect <<EOF set time 30 spawn ssh [email?protected]$ip df -Th expect { "*yes/no" { send "yesr"; exp_continue } "*password:" { send "$passwordr" } } expect eof EOF 5 spawn not found 的解决出现这个错误的基本上都是出学者:?Linux 执行shell脚本有两种方式: 一种是将脚本作为sh的命令行参数,如sh remote_login.sh,或sh /data/remote_login.sh;一种是将脚本作为具有执行权限的可执行脚本,如./remote_login.sh,或/data/remote_login.sh. 而作为sh命令行参数来运行,那么脚本第一行的#!/usr/bin/expect就会失效,所以才会出现spawn not found、send not found等错误,所有上面的automate_login.sh脚本必须用以下命令运行: ./automate_expect.sh (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- linux – 类似Rsync的文件传输,远程端没有rsyncd或sshd
- ruby-on-rails – 在Ubuntu或Mint上安装Ruby on Rails
- 根据Linux Filesystem Hierarchy Standard放置Python虚拟环
- 内存障碍和在linux上的atomic_t
- linux – 使用bash,如何从数字列表中找出平均值,最大值和最
- Linux USB设备驱动程序未被探测
- 理解 Linux backlog/somaxconn 内核参数
- linux – saltstack:仅在不存在的情况下创建目录
- Linux shell 获得字符串所在行数及位置
- linux – dd中ibs / obs / bs的用途