基于expect命令实现

1.安装expect

[root@logstash ~]# yum install -y expect
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Package expect-5.45-14.el7_1.x86_64 already installed and latest version
Nothing to do
[root@logstash ~]#

2.撰写脚本

expect_command.sh

#!/bin/bash

command=$*
host_info=/root/host.info
for ip in $(awk '/^[^#]/{print $1}' $host_info)
do
  user=$(awk -v ip=$ip 'ip==$1{print $2}' $host_info)
  port=$(awk -v ip=$ip 'ip==$1{print $3}' $host_info)
  pass=$(awk -v ip=$ip 'ip==$1{print $4}' $host_info)
  expect -c "
    spawn ssh -p $port $user@$ip
    expect {
     \"(yes/no)\" {send \"yes\r\";exp_continue}
     \"password:\" {send \"$pass\";exp_continue}
     \"$user@*\" {send \"$command\r exit\r\";exp_continue}
    }
  "
  echo "------Execute Successful!------"
done

linux exp_continue是一个在 Linux 系统中经常用到的命令。在 Linux 系统中,exp_continue 命令用来控制 expect 脚本的循环执行,以及在不同条件下执行不同的操作。通过使用 exp_continue 命令,用户可以让 expect 脚本在满足特定条件时继续执行下一个步骤,而不是中断脚本的执行。

exp_continue 命令的用法非常简单,只需在 expect 脚本中使用该命令即可。例如,当用户在 expect 脚本中需要等待用户输入密码时,可以使用 exp_continue 命令让脚本继续执行下一个步骤,而不是等待超时或中断脚本。这种方式可以提高脚本的效率和可靠性。

另外,exp_continue 命令还可以用来处理不同情况下的逻辑分支。例如,当用户在 expect 脚本中需要对不同的返回结果做出不同的处理时,可以使用 exp_continue 命令实现逻辑的分支跳转。这种方式可以让 expect 脚本更加灵活和智能。

[root@logstash ~]# chmod +x expect_command.sh 
[root@logstash ~]# ls -l expect_command.sh 
-rwxr-xr-x 1 root root 535 Jul 18 10:20 expect_command.sh
[root@logstash ~]#

host.info

#格式:ip地址 用户名 端口号 密码
192.168.10.245 root 22 root

3.验证

sh expect_command.sh df -h

[root@logstash ~]# sh expect_command.sh df -h
spawn ssh -p 22 root@192.168.10.245
Last login: Thu Jul 18 11:34:50 2024 from 192.168.10.131
[root@kibana ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 2.0G     0  2.0G   0% /dev
tmpfs                    2.0G     0  2.0G   0% /dev/shm
tmpfs                    2.0G   13M  2.0G   1% /run
tmpfs                    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/centos-root   38G  7.7G   30G  21% /
/dev/sr0                 4.4G  4.4G     0 100% /mnt
/dev/sda1               1014M  172M  843M  17% /boot
/dev/mapper/centos-home   19G   37M   19G   1% /home
tmpfs                    394M   12K  394M   1% /run/user/42
tmpfs                    394M     0  394M   0% /run/user/0
[root@kibana ~]#  exit
logout
Connection to 192.168.10.245 closed.
df -h
 exit
------Execute Successful!------
[root@logstash ~]#

sh expect_command.sh vmstat

[root@logstash ~]# sh expect_command.sh vmstat
spawn ssh -p 22 root@192.168.10.245
Last login: Thu Jul 18 11:36:21 2024 from 192.168.10.131
[root@kibana ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2939704   1096 471976    0    0   391     8  170  358  0  1 99  0  0
[root@kibana ~]#  exit
logout
Connection to 192.168.10.245 closed.
vmstat
 exit
------Execute Successful!------
[root@logstash ~]#