批量远程执行命令脚本

这个脚本的工作原理如下:

  1. 接收命令:脚本首先接收所有传入的参数,并将它们组合成一个待执行的命令字符串。

  2. 读取主机信息:脚本会读取一个名为host.info的文件,该文件记录了所有需要连接的主机的信息,包括IP地址、用户名、端口和密码。

  3. 远程连接:对于host.info文件中的每一台主机,脚本都会使用expect工具来自动进行SSH连接。这个工具能够模拟用户与终端的交互,自动输入密码等信息。

  4. 执行命令:一旦成功连接到远程主机,脚本就会发送之前组合好的命令字符串,并在命令执行完毕后自动退出SSH连接。

  5. 输出结果:每台主机的执行结果都会被打印出来,并用分隔线隔开,方便查看

脚本名字: remote_exec.sh


#!/bin/bash  
# 接收所有传入的参数作为需要远程执行的命令  
COMMAND=$*
# 主机信息文件,记录着每台主机的IP、用户名、端口和密码  
HOST_INFO=.info  
# 遍历host.info文件中的每一行,提取IP地址  
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do  
    # 根据IP地址从host.info文件中提取对应的用户名  
    USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)  
    # 根据IP地址从host.info文件中提取对应的端口号  
    PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)  
    # 根据IP地址从host.info文件中提取对应的密码  
    PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)  
    # 使用expect工具自动进行SSH连接,并发送命令  
    expect -c "  
       spawn ssh -p $PORT $USER@$IP  
       expect {  
          \"(yes/no)\" {send \"yes\r\"; exp_continue}  
          \"password:\" {send \"$PASS\r\"; exp_continue}  
          \"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}  
       }  
    "  
    # 输出分隔线,方便查看每台主机的执行结果  
    echo "-------------------"  
done

准备一个host.info文件

# 注释行,以#开头,不会被脚本处理  
# IP地址 用户名 端口 密码  
192.168.1.100 user1 22 passwd1  
192.168.1.101 user2 22 passwd2  
# 可以继续添加更多主机信息...

通过以下方式使用它

./remote_exec.sh "ls -l /home"

Last updated