sshpass批量运行脚本

avatar 2023年2月18日18:19:11 评论 718 次浏览

批量安装一些东西,可能很多人都会想到ansible,但是ansible属于配置比较复杂一点,这里说一下使用sshpass做批量处理,sshpass主要用来远程登录目标机器,但是目标机器没有做ssh-key,也就是免密码登录,那么使用sshpass比较容易点,我们只需要把需要安装的主机的用户名,ip,密码,端口等信息写到一个配置文件中,就可以做循环处理。安装sshpass可以参考:https://www.wulaoer.org/?p=2138 下面是我的配置文件.

[service1]
node1=root 192.168.1.1 123456 22
node2=root 192.168.1.2 123456 22
[service2]
node1=root 192.168.1.4 123456 22
node2=root 192.168.1.5 123456 22

读取配置文件

这里需要读取配置文件,并且把文件中的,用户列,ip列,密码列,端口列分别获取出来,然后通过截取获取service1和service2之间有多少行就循环多少次,然后在每次循环中去执行写好的shell脚本即可,看一下我的循环内容。

function basicsnode() {
    cat /config/app.txt | sed -n '/service1/,/service2/{//!p}' | sed -n ''$num' p' | awk -F '=' '{print $2}'
    #这里读取的是service1和service2之间的
    #node1=root 192.168.1.1 123456 22
    #node2=root 192.168.1.2 123456 22
    #使用了参数$num获取的是行,用等号分割,获取的值就是root 192.168.1.1 123456 22
}

function basicsservice() {
  masternul=$(cat /config/app.txt | sed -n '/service1/,/service2/{//!p}' | wc -l) #获取service1和service2之间的行数
  if [ $servernum = "node" ] #判断等号前面的关键词
  then
    for ((i=1; i<=$masternul; i++))
    do
        num=$i #传入参数调用basicsnode函数
        users=$($basicsnode | awk -F ' ' '{print $1}') #通过空格分割第一列用户名
        userip=$($basicsnode | awk -F ' ' '{print $2}') #通过空格分割第二列用户ip
        userpass=$($basicsnode | awk -F ' ' '{print $3}') #通过空格分割第三列用户密码
        userport=$($basicsnode | awk -F ' ' '{print $4}') #通过空格分割第四列端口号
    done
}

读取到文件内容,我们需要做的就是利用sshpass进行拼接成一个完整的命令即可,这样通过for循环就可以进行批量执行了。

批量执行

这里的批量执行用到了sshpass,避免每次登录需要提示输入yes,所以可以使用sshpass的StrictHostKeyChecking=no参数跳过输入yes,这样就登录到远程机器上了,下面要做的就是执行脚本,我们把需要执行的内容写成一个脚本,然后在每次登录的时候都执行一下脚本即可,这样就完成了批量执行。

function basicsnode() {
    cat /config/app.txt | sed -n '/service1/,/service2/{//!p}' | sed -n ''$num' p' | awk -F '=' '{print $2}'
    #这里读取的是service1和service2之间的
    #node1=root 192.168.1.1 123456 22
    #node2=root 192.168.1.2 123456 22
    #使用了参数$num获取的是行,用等号分割,获取的值就是root 192.168.1.1 123456 22
}

function basicsservice() {
  masternul=$(cat /config/app.txt | sed -n '/service1/,/service2/{//!p}' | wc -l) #获取service1和service2之间的行数
  if [ $servernum = "node" ] #判断等号前面的关键词
  then
    for ((i=1; i<=$masternul; i++))
    do
        num=$i #传入参数调用basicsnode函数
        users=$($basicsnode | awk -F ' ' '{print $1}') #通过空格分割第一列用户名
        userip=$($basicsnode | awk -F ' ' '{print $2}') #通过空格分割第二列用户ip
        userpass=$($basicsnode | awk -F ' ' '{print $3}') #通过空格分割第三列用户密码
        userport=$($basicsnode | awk -F ' ' '{print $4}') #通过空格分割第四列端口号
        sshpass -p $userpass ssh -o -p $userport StrictHostKeyChecking=no $users@$userip  < sshpass-install.sh
        #使用sshpass组合一个登录命令,后面的sshpass-install.sh就是选择的执行脚本,
    done
}

当然也可以写多个判断根据交互安装不同分区的机器,然后把不同判断执行不通的脚本,这样就可以根据自己的需求执行不同分区。后期只需要更新我们后面的脚本即可,这样就可以根据自己的需要完成批量执行了,没有了,看些其他的吧。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: