天天看点

shell_脚本远程自动连接expect前言异常#!和which expect两种远程自动化调动实现语法参考博文

前言

在对某些主机可以采用如下方式直连

#!/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

来判断。

shell_脚本远程自动连接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 简介和使用实例

继续阅读