需要使用脚本来执行当前服务器和其他服务器进行数据互传,脚本要能够自动应答,网上查到资料可以使用诸如下面的脚本来实现
#!/bin/expect -f #which expect找到所在路径,添加到这里
spawn scp -P 8822 ./nmap-7.92-1.x86_64.rpm root@192.168.1.*:/mnt
expect {
"(yes/no*)?" { send "yes\r";exp_continue }
"*password:*" { send "ruijie1688\r" }
}
我使用的是centos7.5系统,首先在命令行试了expect命令,可以正常使用;命令行输入spawn提示“-bash: spawn: 未找到命令”,第一感觉就是没有这个命令,需要自己去装一个。我的服务器系统不能直接联网安装,那么就准备去网上下载spawn安装包进行安装,这个思路有点问题,走了不少弯路…
查了一些资料才发现spawn需要在expect环境下运行,环境中有了expect不需要再去安装spawn包
https://baike.baidu.com/item/expect/4598715
以下尝试运行命令
[root@885003ed-49c8-5470-afb8-8c74ecf0760c ~]# expect
expect1.1> spawn #在expect环境下可以正常执行
usage: spawn [spawn-args] program [program-args]
while executing
"spawn"
expect1.2>
方式1:全路径执行
/root/scritpt.sh
方式2:赋予执行权限后执行
chmod +x scritpt.sh
./scritpt.sh
方式2:使用expect运行
expect scritpt.sh
spawn:
启动新的进程
send:
用于向进程发送字符串
expect:
从进程接收字符串
interact:
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了
expect eof
与spawn对应,表示捕捉终端输出信息终止,结束交互。
exp_continue
匹配多个字符串在执行动作后加此命令
expect中的相关命令在之前的脚本中已有体现,对照脚本就可以知道用法,interact 与 expect eof的区别,可尝试运行下面的脚本执行,执行后查看下当前系统的IP地址就知道区别了,看看停留在哪里
#!/bin/expect -f
spawn ssh -p 9622 root@192.168.1.88
expect "*password:*"
send "admin688\r"
interact
执行完以后停留在当前主机上
#!/bin/expect -f
spawn ssh -p 9622 root@192.168.1.88
expect "*password:*"
send "admin688\r"
expect eof
执行完返回原来的位置
上面的使用说明中如果有不好懂的地方,也可以参见下面的链接去学习
https://blog.csdn.net/wangzhicheng987/article/details/122689236
https://blog.csdn.net/modi000/article/details/107115286/