74.expect腳本同步文件以及指定host同步文件 構建分發系統文件和命令

 

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

相關文章
相關標籤/搜索