分发系统:用于多台服务器代码或者软件的同时分发执行
1、install –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.expect和rsync.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
3、vim ip.txt 把所有远程主机做成一个列表写入进去
4、vim 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系统知识