shell-编写分发系统
分发系统:用于多台服务器代码或者软件的同时分发执行1、install –y expect 安装expect程序 用于自动登录远程服务器
2、编写自动登录脚本
vim hu.expect
#!/usr/bin/expect
set host “192.168.***.***”
#定义host 是“192.168.***.***”这是expect定义变量的独有的方式
set passwd “123456”
#定义密码是123456
spawnssh 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 #定义user为传参的方式,并且是第一个参数
set host #定义host为传参的方式,并且是第二个参数
set passwd“123456”
setcm #定义执行命令时为传参的方式,并且是第三个参数
spawnssh$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
setpasswd “123456”
sethost #传参的方式指定主机
setfile #传参的方式指定同步目录
spawnrsync -av$fileroot@$host:$file #执行登陆主机同步目录动作
expect{
“yes/no”{ send “yes\r ” }
“password:” { send“passwd\r”}
}
expecteof
开始正式编写分发系统
1、需要本机和远程机器都安装rsync并且下面的rsync.expect和rsync.sh脚本必须在同一目录下
2、编写rsync.expect脚本
主要命令: rsync-av --files-from=$file/ root@$host:/
所有远程主机密码必须一致
vim rsync.expect
#!/usr/bin/expect
setpasswd “123456”
sethost
setfile
spawn rsync-av--files-from=$file/root@$host:/
expect{
“yes/no”{ send“yes\r”}
“password:”{send“$passwd\r”}
}
expecteof
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$iplist.txt
done
注:文件同步完成了,这时候需要登陆到主机上执行重启服务命令,所以还需要下面脚本帮助
6、编写命令批量执行脚本
vim exe.expect
#!/usr/bin/expect
set user #定义user为传参的方式,并且是第一个参数
set host #定义host为传参的方式,并且是第二个参数
set passwd
setcm #定义执行命令时为传参的方式,并且是第三个参数
spawnssh $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 ipin‘catip.txt’
do
echo $ip
./exe.expect$ip“w;free -m;ls/tmp”
#这里只执行了三个命令,如果命令很多,还需要再写一个脚本,并同步到各个远程服务器中去,然后在这个脚本里写一个执行那个脚本的命令即可(需要写全路径)
done
更多技术文档请添加linux系统运维交流群:260431835 每周定时讲解linux系统知识
页:
[1]