- 背景
- 当使用如ssh/scp等命令时需要输入密码等信息,一般情况是终端输入命令,等待终端的打印提示书,然后输入密码,当你希望这些操作全部自动执行的时候,就需要本文的命令自动识别信息和发送相应的信息,实现一连串命令的自动化
- 命令
- spawn:触发,执行命令
- expect:识别输出
- send:发送信息
- 自动化脚本:功能-拷贝test.sh 到192.168.100.100的根目录,密码是pwd123456
##############################################
#!/usr/bin/expect
set timeout 30
spawn scp ./test.sh root@192.168.100.100:/
expect “*password*”
send “pwd123456\r”
##############################################
- 详细说明:
-
#!/usr/bin/expect
expect是shell的一种,类似bash、cmd;注意:此命令必须是脚本的第一行;
-
set timeout 30
设置超时时间,单位:秒;如果30秒内expect没有收到带有password的输出,则退出脚本
-
spawn scp ./test.sh root@192.168.100.100:/
执行命令:scp ./test.sh root@192.168.100.100:/;注意:spawn需要expect环境支持,即:系统必须安装expect源码,同时执行脚本时需使用expect auto-scp.sh,否则系统会提示找不到spawn命令
-
expect “*password*”
注意:此处的expect是expect组件的一个内部命令,同shell和linux内部命令一样,只不过不是系统自带,需要安装expect组件;作用是判断上一命令后的输出是否包含“password”的字符串,若有则执行send命令,否则超时退出;
-
send “pwd123456\r”
如果expect未收到期待的输出,等待超时后会直接退出,此命令不会执行;若收到期待的输出,send命令执行,即发送密码“pwd123456”,效果等同于终端输入“pwd123456”,其中的“\r”表示回车;
-
-
补充:
-
如果是在终端执行此脚本,且内部命令是ssh,并且希望执行脚本后继续留在目的服务器,执行其他操作,则命令如下:
-
#!/usr/bin/expect spawn ssh root@192.168.100.101 expect "*password*" send "abc123\r" interact
-