文章目录

  • 说明
  • 代码
    • 脚本内容
    • 存放ip和其密码
  • 执行脚本
    • 测试【必做】
    • 批量跑脚本
    • 后台验证

说明

  • 今天有一个脚本需求【目前有400台虚拟机,手动登录肯定不现实的】,5期所有虚拟机都需要验证是否已经将IP改为静态了【容器搭建的,dhcp服务会出问题。。。。】,同时面临下面几个问题:

    • 1、有些虚拟机使用方将root密码改了,所以肯定不能用root来跑脚本【我们有一个采集用户,每个虚拟机上都有这个账户,所以我们可以用这个普通用户来跑脚本】
    • 2、没有一个linux主机可以通全部虚拟机,所以我们也只能在不通网段的一台虚拟机上跑脚本【同时面临一个问题,虚拟机做策略了,那么我们就登不上】
    • 3、因为存在上面2个问题,所以需要整理出:登不上的虚拟机【dashboard后台验证】,和已知状态是DHCP还没修改为手动的漏网之鱼虚拟机。

代码

脚本内容

  • 我前面其实总结过expect脚本中的反引号取的值是执行脚本主机的内容,而非spawn过去的主机值,所以我前面脚本都是将带有反引号的脚本放到宿主机上,spawn过去后通过scp获取这个带有反引号的脚本内容过来再执行,可以完美解决这个问题。
  • 可是今天我没有root权限,是没有办法通过spawn过去的主机scp拷贝宿主机上脚本的。
  • 而我又说了,spawn过去的主机是不能直接执行带有反引号的脚本的,所以expect脚本中不能存在``反引号内容代码。 所以就有了我下面的方法,我尝试了很多很多方法,发现只有下面方法能实现【虽然很麻烦】,当然如果你尝试出了更好的方法,欢迎留言一起交流学习。
  • 代码都是些很基础的代码,就不做解释了,有不懂的地方可以留言或私信。
[root@controller01 virsystem]# cat mingling.sh
#!/bin/bashcat $1|while read line
do
a=($line)
/usr/bin/expect<<EOF
#/usr/local/bin/expect<<EOF
spawn ssh xz_tyng@${a[0]}
expect {"*assword" {send "${a[1]}\r";} "yes/no" {send "yes\r"; exp_continue}
}
expect "xz_tyng" {send "echo -n 'net=\`' > network.sh\r"}
expect "xz_tyng" {send "echo  'ls /etc/sysconfig/network-scripts/| grep ifcfg |head -n1\`' >> network.sh\r"}
expect "xz_tyng" {send "echo  'echo \\\$net'>>network.sh\r"}
expect "xz_tyng" {send " echo -n 'echo ——————————————————————————******主机名:******\`hostname'>> network.sh\r"}
expect "xz_tyng" {send " echo -n '\`******网卡状态******: '>> network.sh\r"}
expect "xz_tyng" {send " echo -n '\`cat /etc/sysconfig/network-scripts/\\\$net'>> network.sh\r"}
expect "xz_tyng" {send " echo  '\`| grep  BOOTPROTO'>> network.sh\r"}
#expect "xz_tyng" {send "cat test.sh\r"}
#expect "xz_tyng" {send "cat>network.sh<<net\r"}
#expect ">" {send "net=`ls /etc/sysconfig/network-scripts/ |head -n1`\r"}
#expect ">" {send "echo 'echo ——————————————————————————******主机名:******`hostname`******网卡状态******: echo `cat /etc/sysconfig/network-scripts/$net | grep  BOOTPROTO` '\r"}
#expect ">" {send "net\r"}
expect "xz_tyng" {send "cat network.sh\r"}
expect "xz_tyng" {send "sh network.sh\r"}
expect "xz_tyng" {send "sleep 1\r"}
expect "xz_tyng" {send "exit\r"}expect eof
EOF
done
[root@controller01 virsystem]#

存放ip和其密码

下面可以看到,每台主机的密码是不一样的,存放规则:左边ip右边密码【一行一个ip信息】

执行脚本

  • 执行:sh 脚本 存放ip文件

测试【必做】

  • 如果你第一次接触该脚本,不建议在生产环境上测试,再测试虚拟机上做测试【要养成一个习惯,当你不知道或不完全确定自己再干啥,以及不确定某个命令会带来的后果前,不要再生产环境上做任何操作和测试】
    测试呢ip存放文件就放一个ip信息就行

  • 我测试是分了几个阶段来的,先测试命令,命令没问题了再将命令放到脚本中,脚本中没问题了,最后再批量执行。
    如我这,因为现在是组合命令,所以我最开始是注释执行脚本行信息的,先看文件中生成的命令是否和我预期一样

    然后就可以将脚本中执行行信息取消注释再执行咯,单台值没问题就可以进行后面的批量了

  • 期间我遇到一个乌龙,最开始我获取网卡名称是没有grep ifcfg这个参数的,因为网卡文件第一个肯定都是第一张网卡名称嘛,然后我就再测试第一台的时候,我发现我获取到的网卡名称是bak【我以为没有获取成功,返回类似空值的报错,一直想不通为什么会是bak,bak没有啥意义才对的】
    我以为是哪里取值出错了,一直反复修改测试。。。

    最后实在没办法了,登录到测试的主机上单独查看了下配置文件,一看,脑壳痛,不晓得是哪个神仙新建了一个bak文件夹,我的天了,哪有这么备份网卡文件的啊。
    【都准备放弃了,直接用固定网卡名称,那样简单的多,但不甘心,所以再这个问题上浪费了两个多小时,我真的不会想到谁会再网卡文件新建文件夹的】

批量跑脚本

  • 执行:sh 脚本 存放ip文件 【下面ip有做替换哈,不要在意ip】
    注意,我这因为有些会被权限拒绝,所以脚本跑完后需要一台一台核对数据,列出哪些是没有执行成功的【我是20台20台跑的,跑失败的都会单独列出来,继续往下看】
[root@controller01 virsystem]# sh mingling.sh iplist.txt
cat: /etc/sysconfig/network-scripts/: Is a directory
spawn ssh xz_tyng@1.2.3.47
The authenticity of host '1.2.3.47 (1.2.3.47)' can't be established.
ECDSA key fingerprint is SHA256:XWBz7hOij1M6BUmjQIJR/s3XPZZ+otmlO+Gref09pjs.
ECDSA key fingerprint is MD5:9f:0b:bb:69:f8:15:1b:3f:9c:77:71:cb:36:58:0f:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '1.2.3.47' (ECDSA) to the list of known hosts.Authorized users only. All activity may be monitored and reported
xz_tyng@1.2.3.47's password:
Last login: Wed Sep  7 16:19:01 2022 from 10.234.183.225
[xz_tyng@xz-oa-uatapp-05 ~]$ echo -n 'net=`' > network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$ echo  'ls /etc/sysconfig/network-scripts/| grep ifcfg |head -n1`' >> network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$ echo  'echo $net'>>network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$  echo -n 'echo ——————————————————————————******主机名:******`hostname'>> network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$  echo -n '`******网卡状态******: '>> network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$  echo -n '`cat /etc/sysconfig/network-scripts/$net'>> network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$  echo  '`| grep  BOOTPROTO'>> network.sh
[xz_tyng@xz-oa-uatapp-05 ~]$ cat network.sh
net=`ls /etc/sysconfig/network-scripts/| grep ifcfg |head -n1`
echo $net
echo ——————————————————————————******主机名:******`hostname`******网卡状态******: `cat /etc/sysconfig/network-scripts/$net`| grep  BOOTPROTO
[xz_tyng@xz-oa-uatapp-05 ~]$ sh network.sh
ifcfg-eth0
——————————————————————————******主机名:******xz-oa-uatapp-05.novalocal******网卡状态******: # Created by cloud-init on instance boot automatically, do not edit. # BOOTPROTO=none DEVICE=eth0 HWADDR=fa:16:3e:5e:b3:ba MTU=1500 ONBOOT=yes STARTMODE=auto TYPE=Ethernet USERCTL=no IPADDR=1.2.3.47 NETMASK=255.255.255.0 GATEWAY=1.2.3.254
[xz_tyng@xz-oa-uatapp-05 ~]$ sleep 1
[xz_tyng@xz-oa-uatapp-05 ~]$ exit
logout
Connection to 1.2.3.47 closed.
cat: /etc/sysconfig/network-scripts/: Is a directory
spawn ssh xz_tyng@1.2.3.49
The authenticity of host '1.2.3.49 (1.2.3.49)' can't be established.
ECDSA key fingerprint is SHA256:5wDc3wvMkR5+E562tGw+YcHNLiBA3BxWO4Swq5ekNkk.
ECDSA key fingerprint is MD5:91:f8:3a:ae:43:ca:ee:b3:a0:9f:c7:7c:3f:eb:cb:3f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '1.2.3.49' (ECDSA) to the list of known hosts.Authorized users only. All activity may be monitored and reported
xz_tyng@1.2.3.49's password:
Last login: Wed Sep  7 16:11:05 2022 from 10.234.183.225
[xz_tyng@xz-oa-app-02 ~]$ echo -n 'net=`' > network.sh
[xz_tyng@xz-oa-app-02 ~]$ echo  'ls /etc/sysconfig/network-scripts/| grep ifcfg |head -n1`' >> network.sh
[xz_tyng@xz-oa-app-02 ~]$ echo  'echo $net'>>network.sh
[xz_tyng@xz-oa-app-02 ~]$  echo -n 'echo ——————————————————————————******主机名:******`hostname'>> network.sh
[xz_tyng@xz-oa-app-02 ~]$  echo -n '`******网卡状态******: '>> network.sh
[xz_tyng@xz-oa-app-02 ~]$  echo -n '`cat /etc/sysconfig/network-scripts/$net'>> network.sh
[xz_tyng@xz-oa-app-02 ~]$  echo  '`| grep  BOOTPROTO'>> network.sh
[xz_tyng@xz-oa-app-02 ~]$ cat network.sh
net=`ls /etc/sysconfig/network-scripts/| grep ifcfg |head -n1`
echo $net
echo ——————————————————————————******主机名:******`hostname`******网卡状态******: `cat /etc/sysconfig/network-scripts/$net`| grep  BOOTPROTO
[xz_tyng@xz-oa-app-02 ~]$ sh network.sh
ifcfg-eth0
——————————————————————————******主机名:******xz-oa-app-02.novalocal******网卡状态******: # Created by cloud-init on instance boot automatically, do not edit. # BOOTPROTO=none DEVICE=eth0 HWADDR=fa:16:3e:70:b9:d5 MTU=1500 ONBOOT=yes STARTMODE=auto TYPE=Ethernet USERCTL=no IPADDR=1.2.3.49 NETMASK=255.255.255.0 GATEWAY=1.2.3.254
[xz_tyng@xz-oa-app-02 ~]$ sleep 1
[xz_tyng@xz-oa-app-02 ~]$ exit
logout
Connection to 1.2.3.49 closed.
cat: /etc/sysconfig/network-scripts/: Is a directory
spawn ssh xz_tyng@1.2.3.50
The authenticity of host '1.2.3.50 (1.2.3.50)' can't be established.
ECDSA key fingerprint is SHA256:rbkROO7GSpS+VlkSCQCXzQumV/NiBhDirZr/SOd+44Y.
ECDSA key fingerprint is MD5:30:a6:0f:e0:1d:60:c8:42:8d:c9:35:6e:d1:98:38:b1.

后台验证

  • 上面脚本跑完以后,我就用下面方法整理出失败的主机
  • 然后就再dashboard后台登录嘛【后台是不会被限制的】

expect脚本中使用普通用户执行sh脚本命令,expect脚本中解决``反引号获取值有问题方法、expect遍历登录不同主机不同密码的主机执行指定命令方法相关推荐

  1. clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理

    clickhouse中bitmap的使用对于用户标签及用户,访客跨维度去重统计是十分合适的选择,具有更快的查询效率. 1.bitmap bitmap建表方式: create table test.bi ...

  2. python中fillna函数_在pandas dataframe中写一个用户定义的fillna函数,用条件填充np.nan不同的值...

    考虑以下pandas数据帧: import pandas as pd change = [0.475, 0.625, 0.1, 0.2, -0.1, -0.75, 0.1, -0.1, 0.2, -0 ...

  3. linux怎么进入student用户,linux系统中手动添加用户

    在Centos5.8操作系统中无法使用useradd命令创建用户时,手动创建用户的方法. 第一步:举例要创建的用户为student用vim编辑器编辑/etc/passwd文件,在最后一行添加 stud ...

  4. h5滚动时侧滑出现_H5触摸事件中如何判断用户滑动方向

    这次给大家带来H5触摸事件中如何判断用户滑动方向,H5触摸事件中判断用户滑动方向的注意事项有哪些,下面就是实战案例,一起来看一下. 接口 TouchEvent TouchEvent 是一类描述手指在触 ...

  5. 解决SQL Server 2000 错误15023:当前数据库中已存在用户或角色

    错误15023:当前数据库中已存在用户或角色 在把远程服务器上的数据库备份还原到本地机后, 给一个"登录"关联一个"用户"时(用户映射),发生错误:" ...

  6. 建立在Windows XP欢迎屏幕中隐藏的用户

    建立在Windows XP欢迎屏幕中隐藏的用户 在学校的宿舍里,很多人的机器里都设置了Windows XP的登录密码,并在开机后显示欢迎屏幕.如果我们趁他们不在的时候偷偷添加一个用户,以后就会在Win ...

  7. html5触摸事件判断滑动方向,H5触摸事件中如何判断用户滑动方向

    这次给大家带来H5触摸事件中如何判断用户滑动方向,H5触摸事件中判断用户滑动方向的注意事项有哪些,下面就是实战案例,一起来看一下. 接口 TouchEvent TouchEvent 是一类描述手指在触 ...

  8. linux中特殊字符反引号,linux中的特殊符号$ ‘’ 反引号 反斜杠

    写在前面:Shell中的特殊字符有 $ 美元符 \ 反斜杠 ` 反引号 "双引号 < ,>;,*,?,[,] 1.反引号``:命令替换 在输出一句话的时候,如果想中间加入命令输出 ...

  9. 【Linux学习笔记】3.Linux 忘记密码解决方法及远程登录

    前言 本章介绍Linux的忘记密码解决方法及远程登录. Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当 ...

最新文章

  1. CODEVS1490 [CTSC2008]网络管理
  2. WIN7只能上QQ打不开网页,使用CMD输入netsh winsock reset
  3. 论手残党画交互原型的正确姿势
  4. bzoj4514[Sdoi2016]数字配对
  5. lombok几个基本注解的使用及遇到的坑点
  6. 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧
  7. mysql递归层次查询
  8. 酱油和gbt酱油哪个好_酱油越贵越好?认准瓶身这4处,轻松挑到好酱油!
  9. 【下载源码】在线生成网页缩略图.超越Snap.com:WebSnap Beta 1.1 发布。感谢博客园的“萧寒”重写的底层。开源。...
  10. python新年快乐代码_新年快乐! python实现绚烂的烟花绽放效果
  11. aso优化师是什么_做ASO优化师这么多年,没想到被它打败了!
  12. 表格求和怎么操作?如何运用sumif函数进行求和
  13. C# Winform右下角弹窗方式
  14. 论文阅读:SCENE TRANSFORMER: A UNIFIED ARCHITECTUREFOR PREDICTING MULTIPLE AGENT TRAJECTORIES
  15. 第十周 项目二 阴险的小刚
  16. 吴恩达OpenAI最新课程:prompt-engineering-for-developers读书笔记
  17. 词典php,php词典
  18. 出生年月日的html语句,出生年月日五行查询表
  19. c语言 int 型 无符号数 %u
  20. WIN10, USB转TTL驱动安装( CH340 和 PL- 2303 )

热门文章

  1. 当遇到笔记本键盘无法输入时,身边好想有个程序员
  2. 什么是股票配资网站?
  3. QQ如何修改设置解锁密码
  4. android wear 浮动通知,Android Wear 开发 (一) 创建手表通知
  5. 网售处方药开闸, 国家药监局公开征求意见:确保电子处方真实可靠,可有条件放开!
  6. LaTeX之表格中多列合并时表格竖线不显示的解决方法
  7. 深度:分析了279家海外老年行业创新创业公司,看到了老年行业创新趋势与重点机会!
  8. Android_gps
  9. 软件需求工程 课堂笔记5
  10. python可以数独游戏吗_学习python编程如何一键做出数独游戏答案 | k12教育网