首页 > 代码库 > shell-编写分发系统

shell-编写分发系统

分发系统:用于多台服务器代码或者软件的同时分发执行

1install –y expect   安装expect程序 用于自动登录远程服务器

2、编写自动登录脚本

vim hu.expect

#/usr/bin/expect

set host “192.168.***.***”     

#定义host 是“192.168.***.***”这是expect定义变量的独有的方式

set passwd 123456

#定义密码是123456

spawn  ssh root@host    

#执行远程登录动作,用ssh方式用户名是root  远程的主机是192.168.***.***

expect {

yes/no{ send yes/r”; exp_continue}

“assword:” {send “passwd\r”}

}

#这里是在远程的时候与shell进行交互的动作,当第一次远程主机,会询问是否远程此主机yes/no”回答为yes  当让输入密码时则输入密码为123456

interact 

#结束;expect特有的结束字段

3、编写登录后,输入命令并推出脚本

vim hu2.expect

set user root

set passwd 123456

set host   “192.168.***.***”

spawn ssh$user@$host

expect  {

“yes/no”  { send  “yes/r”;  exp_continue }

“password:”  { send  “$passwd\r”  }

}

expect  “]*”         #”*”代表命令提示符【$|#

send  “touch /tmp/12.txt\r”

expect  “]*”

send   “echo 1212  >  /tmp/12.txt\r”

expect  “]*”

send  “exit\r”

4、编写可以传递参数的脚本

vim hu3.expect

set user[lindex  $argv 0 ]    #定义user为传参的方式,并且是第一个参数

set host[lindex  $argv 1 ]    #定义host为传参的方式,并且是第二个参数

set passwd  123456

set  cm  [lindex  $argv 2]     #定义执行命令时为传参的方式,并且是第三个参数

spawn  ssh  $user@$host

expect  {

“yes/no”  { send “yes\r” }

“password”  { send “passwd\r”}

}

expect  “]*”

send  “$cm\r”   #每执行一个send动作时,最后面的参数后面都要写一个\r   这也是expect独有的

expect  “]*”

send  “exit\r”

5、编写指定主机指定同步目录的脚本

vim hu4.expect

#/usr/bin/expect

set  passwd “123456”

set  host  [lindex  $argv 0]    #传参的方式指定主机

set  file  [lindex  $argv 1]    #传参的方式指定同步目录

spawn  rsync -av  $file  root@$host:$file   #执行登陆主机同步目录动作

expect  {

“yes/no”  { send “yes\r ” }

“password:”   { send  “passwd\r”}

}

expect  eof

开始正式编写分发系统

1、需要本机和远程机器都安装rsync并且下面的rsync.expectrsync.sh脚本必须在同一目录下

2、编写rsync.expect脚本

主要命令: rsync  -av --files-from=$file  /   root@$host:/

所有远程主机密码必须一致

vim   rsync.expect

#!/usr/bin/expect

set  passwd “123456”

set  host  [  lindex  $argv 0]

set  file  [  lindex  $argv 1]

spawn rsync  -av  --files-from=$file  /  root@$host:/

expect  {

“yes/no”  { send  “yes\r”  }

“password:”  {send  “$passwd\r”}

}

expect  eof

3vim ip.txt 把所有远程主机做成一个列表写入进去

4vim file.list 把所有需要同步的文件全路径做成一个列表写入进去;必须全路径书写,从/根开始

5、编写rsync.sh脚本,用于rsync.expect脚本读入远程主机IP列表和所有需要同步文件的列表

vim rsync.sh

#!/bin/bash

for ip in  ‘cat ip.txt’

do

  echo  $ip

 ./rsync.expect  $ip  list.txt

done

注:文件同步完成了,这时候需要登陆到主机上执行重启服务命令,所以还需要下面脚本帮助

6、编写命令批量执行脚本

vim exe.expect

#/usr/bin/expect

set user[lindex  $argv 0 ]    #定义user为传参的方式,并且是第一个参数

set host[lindex  $argv 1 ]    #定义host为传参的方式,并且是第二个参数

set passwd  [lindex $argv 2] 

set  cm [lindex  $argv 3]      #定义执行命令时为传参的方式,并且是第三个参数

spawn  ssh   $user@$host

expect  {

“yes/no”  { send “yes\r” }

“password”  { send “$passwd\r”}

}

expect  “]*”

send  “$cm\r”   #每执行一个send动作时,最后面的参数后面都要写一个\r   这也是expect独有的

expect  “]*”

send  “exit\r”

7、还需要编写一个循环远程主机IP并执行命令的脚本

vim   exe.sh

#/bin/bash

for ip  in  ‘cat  ip.txt’

do

echo   $ip

./exe.expect  $ip  “w;free -m;ls  /tmp”  

#这里只执行了三个命令,如果命令很多,还需要再写一个脚本,并同步到各个远程服务器中去,然后在这个脚本里写一个执行那个脚本的命令即可(需要写全路径)

done

 

 

 

更多技术文档请添加linux系统运维交流群:260431835 每周定时讲解linux系统知识

 


本文出自 “linux系统运维技术交流” 博客,请务必保留此出处http://fxlinux.blog.51cto.com/4926551/1874209

shell-编写分发系统