20.31 expect腳本同步文件:php
在expect腳本中去實如今一臺機器上把文件同步到另一臺機器上去。核心命令用的是rsynclinux
~1.自動同步文件nginx
#!/usr/bin/expectshell
set passwd "123456"vim
spawn rsync -av root@192.168.208.130:/tmp/12.txt /tmp/ #把遠程機器上的12.txt文件同步到本機上安全
expect {bash
"yes/no" { send "yes\r"}ssh
"password:" { send "$passwd\r" }測試
}網站
expect eof #這裏用到了eof,給他點時間讓他傳輸文件(或用interact停留在遠程的機器上)
實例:
[root@axinlinux-01 sbin]# ./4.expect
spawn rsync -av root@192.168.208.130:/tmp/12.txt /tmp/
root@192.168.208.130's password:
receiving incremental file list
12.txt
sent 43 bytes received 97 bytes 93.33 bytes/sec
total size is 5 speedup is 0.04
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.32 expect腳本指定host和要同步的文件:
~1.指定host和要同步的文件
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0] #第一個參數是host(對方的主機,是傳到對方的)
set file [lindex $argv 1] #第二參數是要同步的文件
spawn rsync -av $file root@$host:$file #此次是從本機到對方傳輸
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
實例:
[root@axinlinux-01 sbin]# ./5.expect 192.168.208.130 "/tmp/123.txt"
spawn rsync -av /tmp/123.txt root@192.168.208.130:/tmp/123.txt
root@192.168.208.130's password:
sending incremental file list
123.txt
sent 88 bytes received 35 bytes 246.00 bytes/sec
total size is 0 speedup is 0.00
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.33 構建文件分發系統:
咱們須要把一堆文件寫入到文件列表裏面去,而不是一個文件
~1.需求背景:
對於大公司而言,確定時不時會有網站或者配置文件更新,並且使用的機器確定也是好多臺,少則幾臺,多則幾十甚至上百臺。因此,自動同步文件是相當重要的。
~2.實現思路:
首先要有一臺模板機器,把要分發的文件準備好,而後只要使用expect腳本批量把須要同步的文件分發到目標機器便可。
~3.核心命令:
rsync -av --files-from=list.txt / root@host:/
list.txt就是咱們的文件列表,這裏的路徑要是絕對路徑
~4.文件分發系統的實現:(傳輸多個文件)
~4.1 rsync.expect 內容
#!/usr/bin/expect
set passwd "123456"
set host [lindex $argv 0] #第一個參數,主機名
set file [lindex $argv 1] #第二個參數,也就是咱們的文件列表
spawn rsync -avR --files-from=$file / root@$host:/ #這裏的源目錄是根,目標目錄也是根。若是不能保證對方機器上有相同的路徑,就要加上-R(會自動建立)
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
~4.2 list.txt內容(這裏的路徑要保證對方機器上也有這個路徑,要傳輸的文件有沒有無所謂。不能保證的話要在腳本rsync命令加上-R)
/tmp/123.txt
/root/shell/1.sh
/root/11.txt
~.4.3 ip.list內容(由於遠程同步文件的機器不止一臺,因此要加上要同步的機器的IP)
192.168.133.132
192.168.133.133
......
作expect腳本的前提是要保證要傳輸的機器的密碼要是同樣的。若是不同的話,只能挨個定義每一臺機器的密碼,可是不安全。固然也能夠作祕鑰認證,那腳本輸密碼的那一行就能夠省略"password:" { send "$passwd\r" }
~.4.4 rsync.sh 內容(遍歷一下IP地址)執行的時候就是執行rsync.sh
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./rsync.expect $ip list.txt
done
實例:
[root@axinlinux-01 sbin]# vim rsync.expect
#!/usr/bin/expect
set passwd "wangxin789" #密碼在測試中兩個都是同樣的
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avR --files-from=$file / root@$host:/ #加上-R保證目錄不存在的時候會建立
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof
[root@axinlinux-01 sbin]# vim list.txt
/root/rsync.test/1.txt
/root/rsync2.test/2.txt
[root@axinlinux-01 sbin]# vim ip.list
192.168.208.130
127.0.0.1
[root@axinlinux-01 sbin]# sh -x rsync.sh
[root@axinlinux-02 ~]# ls -l /root/rsync.test/1.txt #在02機器上檢查一下是否傳輸過去,是否建立不存在的目錄
-rw-r--r-- 1 root root 0 9月 23 22:05 /root/rsync.test/1.txt
[root@axinlinux-02 ~]# ls -l /root/rsync2.test/2.txt
-rw-r--r-- 1 root root 0 9月 23 22:06 /root/rsync2.test/2.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20.34 批量遠程執行命令:
以上咱們完成了分發文件,可是還不夠。有時候咱們須要執行一些命令,好比重啓nginx或php。相似自動化了,批量一些執行命令、批量傳一些文件
如下是,批量執行一些命令的腳本
~1.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"
~2.exe.sh 內容 (還要定義exe.sh的腳本,也就是for循環的。也就是咱們還要遍歷要同步數據的機器的IP,由於上一節中已經建立了的那個IP腳本)
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./exe.expect $ip "w;free -m;ls /tmp"
done
實例:
[root@axinlinux-01 sbin]# vim exe.expect
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "wangxin789"
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"
[root@axinlinux-01 sbin]# vim exe.sh
#!/bin/bash
for ip in `cat ip.list`
do
echo $ip
./exe.expect $ip "w;free -m;ls /tmp"
done
[root@axinlinux-01 sbin]# chmod a+x exe.sh
[root@axinlinux-01 sbin]# chmod a+x exe.expect
[root@axinlinux-01 sbin]# sh -x exe.sh