現在一些比較大的企業,大都使用了負載均衡,而有時由於一些程序要更改,或者有些bug要修改,快速更新代碼等,若是僅是幾臺server的話,很簡單,把已經改好的程序拷過去,或者rsync遠程推送,再或者網上NFS共享一下就能夠了。但若是有幾十臺幾百臺,那樣的方法會太繁瑣,此時就能夠用expect來批量實現分發任務。shell
expect的安裝:yum install -y expectvim
下面來進行expect腳本的遠程登陸:bash
本機IP爲120,遠程IP爲124負載均衡
進入/usr/local/sbin目錄下(expect腳本通常放在此目錄中),新建一個名稱爲test.expect的腳本文件,內容以下:ssh
#! /usr/bin/expect set host "192.168.6.124" set passwd "123456" spawn ssh root@$host expect { "yes/no" { send "yes\r"; exp_continue} "assword:" { send "$passwd\r" } } interact
而後更改權限:chmod a+x test.expect,此時就能夠遠程鏈接124了。 網站
再在/usr/local/sbin/目錄下新建一個test2.expect的腳本,內容以下:spa
#!/usr/bin/expect set user "root" set passwd "123456" spawn ssh $user@192.168.6.124 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } expect "]*" send "touch /tmp/test.txt\r" expect "]*" send "echo hello world! > /tmp/test.txt\r" expect "]*" send "exit\r"
給test2.expect腳本賦予x權限:chmod a+x test2.expect,而後執行: .net
在124上查看/tmp/目錄下是否有test.txt: 3d
新建名爲test3.expect的腳本文件,內容以下:code
#!/usr/bin/expect set user [lindex $argv 0] set host [lindex $argv 1] 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" expect "]*" send "exit\r"
增長x權限後執行:
新建名爲test4.expect的腳本文件,內容以下:
#!/usr/bin/expect set passwd "123456" spawn rsync -av root@192.168.6.124:/tmp/test.txt /tmp/ expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect eof
增長x權限後執行:
新建名爲test5.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
增長x權限後執行:
需求背景:
對於大公司而言,確定時不時會有網站或者配置文件更新,並且使用的機器確定 也是好多臺,少則幾臺,多則幾十甚至上百臺。因此,自動同步文件是相當重要的。
實現思路:
首先要有一臺模板機器,把要分發的文件準備好,而後只要使用expect腳本批量把 須要同步的文件分發到目標機器便可。
核心命令:
rsync -av --files-from=list.txt / root@host:/ 注意:這裏的都是根目錄
使用rsync 的 --files參數,能夠實現調用文件裏面的列表,進行多個文件遠程傳輸,從而實現文件分發文件分發系統的實現。
新建名爲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
而後在/tmp/目錄下新建文件ip.list
[root@zhangjin-120:/usr/local/sbin]#vim /tmp/ip.list 192.168.6.123 192.168.6.124
建立須要同步文件的列表文件file.list
[root@zhangjin-120:/usr/local/sbin]#vim /tmp/file.list /tmp/test.txt /tmp/test2.txt /root/123.sh
再建立一個名爲rsync的shell腳本,內容以下:
#!/bin/bash for ip in `cat /tmp/ip.list` do echo $ip ./rsync.expect $ip /tmp/file.list done
增長x權限後執行:
當同步完代碼後有可能須要批量地重啓服務,所以還須要批量遠程執行命令,相似於自動化。 這裏是用expect編寫執行命令的腳本並用shell腳原本批量調用它。
建立名爲exe.expect的腳本,內容以下:
#!/usr/bin/expect set host [lindex $argv 0] set passwd "123456" set cm [lindex $argv 1] spawn ssh root@$host expect { "yes/no" { send "yes\r"} "password:" { send "$passwd\r" } } expect "]*" send "$cm\r" expect "]*" send "exit\r"
賦予x權限。
再建立exe.sh的shell腳本,內容以下:
#!/bin/bash for ip in `cat ip.list` do echo $ip ./exe.expect $ip "w;free -m;ls /tmp" done