[转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

shell,脚本,使用,expect,自动化,交互,登录,远程,主机,进行,批量,关机 · 浏览次数 : 0

小编点评

**目标主机登录用户:root** **目标主机:**远程主机 **软件介绍:** expect **步骤:** 1. **加载 expect 文件:**在远端主机上运行 `expect` 命令。 2. **设置超时:**设置连接超时时间为 30 秒。 3. **初始化 IP 地址列表:**创建一个包含远端主机 IP 地址的列表,并将其赋值给 `array_adress` 变量。 4. **执行远程登录:**使用 `remote_shutdown` 函数循环执行远端主机命令,并使用 `expect` 执行连接和登录操作。 5. **退出远端主机:**在连接成功后,使用 `shutdown -h now` 命令退出远端主机。 **代码:** ```bash # 加载 expect 文件路径 expect_file_path="/usr/bin/expect" # 定义远程登录函数 function remote_shutdown () { <span class="token comment">加载expect文件路径;<lt;<lt;-</span><span class="token string">EOFspawn ssh -o \"StrictHostKeyChecking no\" \\(user</span>@<span class="token variable">\\\)addressexpect {\"Connection refused\" exit\"No route to host\" exit\"password\" {send \"$passwd\\r\"}}expect \"]#\"send \"#登录远程主机成功,开始推送关机指令!\\r\"expect \"]#\"send \"shutdown -h now \\r\"expect \"]#\"send \"exit\\r\"expect eofEOF}#循环控制执行远端主机命令 for address in </span><span class="token builtin class-name">echo</span> $<span class="token punctuation">{<!-- --></span>array_adress<span class="token punctuation">[</span>@<span class="token punctuation">]</span><span class="token punctuation">}do # 调用函数执行远程登录关机shutdowndone 使用tips:expect代码块处的shutdown关机命令换成其他命令就可以批量在远端主机执行其他命令啦 #例如expect \"*]#\"\t#匹配*]#关键字后执行下面的命令send \"date\\r\"\t#显示日期 避坑心得 1. expect缩进 expect的编码方式有多种写法,如果使用本文的写法,注意不能写成以下格式,亲测报错 expect { \"*password\" {send \"$passwd\\r\"}}正确写法expect {\"*password\" {send \"$passwd\\r\"}} done # 定义变量 set timeout 30 # 定义 IP 地址列表 array_adress=(192.168.222.133192.168.222.134192.168.222.240192.168.222.250192.168.222.132) #循环控制执行远端主机命令 for address in </span><span class="token builtin class-name">echo</span> $address; do # 调用函数执行远程登录关机 remote_shutdown $address done } ```

正文

前文

1.目标主机登录用户都为root,且密码一致
2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截)

软件介绍

expect

Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。
结合Shell Script实现自动和交互式任务进行通信,而无需人的干预。

实现代码

#!/bin/bash
#Author:cosann
#date:2022/7/21
#description:该脚本可以实现批量登录远程主机执行命令

#检测安装expect
rpm -qa | grep expect
if [ $? -eq 0 ];then
echo "Expect软件已安装"
else
echo "Expect软件未安装"
yum install -y expect &> /dev/null
fi

#初始化远端主机账户及密码
user=root
passwd=123456

#设定超时
set timeout 30

#定义并初始化远端主机IP列表
array_adress=(
192.168.222.133
192.168.222.134
192.168.222.240
192.168.222.250
192.168.222.132
) #最后IP写上运行脚本的主机,即关闭自身

#定义登录远程主机函数
function remote_shutdown () {

<span class="token comment">#加载expect文件路径</span>
/usr/bin/expect<span class="token operator">&lt;&lt;-</span><span class="token string">EOF

spawn ssh -o "StrictHostKeyChecking no" \(user</span>@<span class="token variable">\)address
expect {
"Connection refused" exit
"No route to host" exit
"password" {send "$passwd\r"}
}
expect "
]#"
send "#登录远程主机成功,开始推送关机指令!\r"
expect "]#"
send "shutdown -h now \r"
expect "
]#"
send "exit\r"
expect eof
EOF
}

#循环控制执行远端主机命令
for address in </span><span class="token builtin class-name">echo</span> $<span class="token punctuation">{<!-- --></span>array_adress<span class="token punctuation">[</span>@<span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token variable">
do
#调用函数执行远程登录关机
shutdown
done

    使用tips:expect代码块处的shutdown关机命令换成其他命令就可以批量在远端主机执行其他命令啦

    #例如
    expect "*]#"	#匹配*]#关键字后执行下面的命令
    send "date\r"	#显示日期
    

      避坑心得

      1. expect缩进

      expect的编码方式有多种写法,如果使用本文的写法,注意不能写成以下格式,亲测报错

      expect { "*password" {send "$passwd\r"}
      }
      

      正确写法

      expect {
      "*password" {send "$passwd\r"}
      }

        2.关于expect最后的关键字EOF

        spawn ssh  root@127.0.0.1 
        expect { 
        "*password" {send "123456\r"}
        }
        expect "*]#"         
        send "exit\r"            
        expect eof               
        EOF				#前后不能有空格,否则会报错
        

          以上是关于expect使用的案例分享,现在已有很方便且简易的工具可以实现以上类似且更强大的功能,但是如果你和我一样也在了解expect,希望这篇文章可以给你带来一些想法,谢谢。

          文章知识点与官方知识档案匹配,可进一步学习相关知识
          云原生入门技能树首页概览13852 人正在系统学习中

          与[转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机相似的内容:

          [转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

          前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。 结合Shell Script实现自动和

          [转帖]spawn....expect简介及EOF遇到的坑

          spawn....expect简介及EOF遇到的坑 为什么使用spawn expect ....expectexpect命令命令演示在shell脚本中使用expect 为什么使用spawn expect … 很多时候,指令的执行是需要交互的,比如下面这个命令大家一定很熟悉: ssh-keygen -

          [转帖]shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)

          https://developer.aliyun.com/article/885658 简介: shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用sou

          [转帖]shell脚本实现文本内容比较交互程序

          背景介绍 脚本基于Comm命令进行功能封装,考虑到命令执行前需要对文本进行排序,并且在多文件需要比较内容时可能会导致多个文本混乱,因此使用Shell封装成了一个交互式程序,快速对文件内容进行判断和输出想要的内容内容结果。 脚本介绍 文件内容校验(是否一致内容)定制化输出文本(1.仅文本单独出现内容;

          [转帖]生产环境shell脚本安全之shc编译(转C)

          https://www.jianshu.com/p/17399dcd1471 应用场景很多,如,中小项目大多使用mysql,那么在你的mysqladmin备份脚本里可能存在明文的密码,此时由于公司服务器可能多个同事使用,那么转码加密脚本至关重要! 1,首先 SHC安装(建议使用交新版本,如 4.0.

          [转帖]Linux平台shell脚本输入密码,不显示明文

          需求:shell脚本中输入密码,要求不显示明文,需要将其转换为“*”星号,或者不显示 实现方案:有两种实现方案,一是通过stty命令来实现,二是直接使用read来实现 方案一:使用stty来实现 使用stty -echo可以实现不显示密码,就像登录Linux系统输入密码时一样,stty的代码如下:

          [转帖]在KingbaseES数据库中批量创建数据库/表

          1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,shell脚本实现时内容如下: user=system #用于配置数据库的用户名 port=54587

          [转帖]Linux 平台使用shc 工具加密shell 脚本

          2021-08-03 20:4510030原创Linux 本文链接:https://www.cndba.cn/dave/article/4642 1 shc 工具说明 shell 脚本是常用脚本,运维中经常使用,但有时候在shell 脚本中会包含一些敏感的信息,比如密码或者特殊的参数,此时我们就可以

          [转帖]linux 批量修改文件格式

          将Windows上的shell脚本拷贝到Linux时,脚本的编码格式还是docs,需要改成unix才可执行,在文件不多的情况下可以直接手动更改,但是在脚本文件比较多的时候,手动改起来就太麻烦了,此时就可以使用shell命令批量来进行更改。 批量更改脚本如下: for i in `find . -ty

          [转帖] shell管道咋堵住了

          https://www.cnblogs.com/codelogs/p/16060378.html 背景# 起因是这样的,我们想开发一个小脚本,当cpu使用率过高时,使用jstack将java的线程栈保存下来,以便后面分析。 获取cpu使用率# 获取cpu使用率是比较容易的,使用vmstat就可以了,