前言
在对某些主机可以采用如下方式直连
#!/bin/bash
ssh IP <<EOF
Password
cd file_path
sh create_file.sh
EOF
但是有些主机之间依旧会让你输入密码:输入密码在密码命令后面。这个时候就需要安装
expect
组件来自动化运行了。
异常
原因
flink_monitor.sh: line 32: warning: here-document at line 29 delimited by end-of-file (wanted `EOF’)
remote_connect3.sh:行13: 警告:立即文档在第 10 行被文件结束符分隔 (需要 `EOF’)
分析
EOF`
EOF`
EOF
后都不能有空格或者其它符号
前
Pseudo-terminal will not be allocated because stdin is not a terminal.
这个并不影响。如果实在需要去掉:ssh
-tt
xxxxxx即可。
#!和which expect
#!/usr/expect/bin/expect这里脚本执行的客户端位置,在哪里呢?使用
which expect
来判断。
位置不对可是会报错的哦:
spawn: command not found
两种远程自动化调动实现
简单说一下expect脚本中的核心expect和send:如其名:expect对应远程返回结果:比如说请输入密码:; send为发送给远程命令内容:比如说:密码是1024。
直接调用expect
直接编写expect脚本
#!/usr/expect/bin/expect
spawn ssh [email protected]
expect "*password*"
send "your'spassword"
expect "*$"
send "touch /pathName/target.txt\r"
expect "*$"
send "exit\r"
interact
interact
表交互,为什么已经退出还要保持交互命令?(这里的交互是执行完命令后停留在远程主机的控制台上面手动操作)。看下文。
bash脚本调用expect
#!/bin/bash
str="hello expect"
/usr/expect/bin/expect <<EOF
spawn ssh [email protected]
expect "*password*"
send "your'spassword"
expect "*$"
send "echo '${str}'>>/pathName/target.txt\r"
expect "*$"
send "exit\r"
interact
EOF
可以看出本质上二者是一样的,都是调用
/usr/expect/bin/expect
客户端进行操作
运行命令
./test.sh 和 sh test.sh的区别:如果直接编写的是expect脚本则需要采用
./
的方式调用,而bash引用的则两种均可。
采用sh运行expect脚本具体表现为不报错但是不执行。
语法
换行
send命令后要换行
\r
跟我们平常按enter键一样的道理。
多分支语法糖
匹配到a1,a2,a3任意一个字符串时,执行相应的输出。
expect {
"a1" { send "返回结果a1\r"; exp_continue}
"a2" { send "返回结果a2\r"; exp_continue}
"a3" { send "返回结果a3\r"}
}
exp_continue
与java语法中的
switch的break
类似:是否继续执行判断。如果a1后面不接
exp_continue
则判断a1后直接结束expect,不执行a2和a3的判断。
set timeout 300
/usr/expect/bin/expect <<EOF
set timeout 300
spawn ssh [email protected]
设置当某个 expect 判断未能成功匹配的 300 秒后,将跳过该 expect 判断,执行后续内容。
timeout 设置为-1——无限制的等待。
spawn
spawn ssh登录远程主机 在该远程主机上要执行的命令(只能执行一条),即expect … send … expect … send…
interact
保持交互状态:停留在远程主机的控制台上面手动操作。即将操作权由脚本还给我们。上面有疑惑为什么不用interact就无法执行命令,其实用:
expect eof
exit
EOF
也是可以的。原因是终归要给脚本一个完整的结局。。。
expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记,即退出。
参考博文
autopenguin
Linux Expect 简介和使用实例