1. 程式人生 > >expect批量同步或執行命令工具

expect批量同步或執行命令工具

文件傳輸 查看 命令行 不可 shell中的 -h building src 2.0

expect腳本同步文件

我們知道主機間傳輸一個文件受網絡、文件大小和磁盤讀寫速率的影響,在傳輸一個文件時不可能一下子馬上傳輸到對方,但是使用expect腳本的過程中,值得註意的是在腳本結尾以expect eof結束整個腳本,它的作用是當腳本內涉及到有文件傳輸時,會讓文件傳輸完成後再徹底結束掉腳本進程,這樣會讓文件能夠成功傳輸到對方主機上。expect若使用exit或者沒有eof這個選項,那麽在執行腳本時,expect不管你是否有文件正在傳輸,當腳本內容執行完成後直接結束掉自己的進程,這樣就會造成文件傳輸失敗
用法直接在腳本末尾加上expect eof配置就行了
腳本執行過程
首先創建一個測試文件,查看是否能夠同步

[root@localhost src]# touch /tmp/1234566.txt
[root@localhost src]# chmod a+x 4.expect 
[root@localhost src]# cat 4.expect 
#!/usr/bin/expect
set passwd "pwd@123"
spawn rsync -av [email protected]:/tmp/1234566.txt /mnt/
expect {
 "yes/no" { send "yes\r"}
 "password:" { send "$passwd\r" }
 }
expect eof

執行該腳本文件

[root@localhost src]# ./4.expect 
spawn rsync -av [email protected]:/tmp/1234566.txt /mnt/
[email protected]‘s password: 
receiving incremental file list
1234566.txt
sent 30 bytes ?received 80 bytes ?73.33 bytes/sec
total size is 0 ?speedup is 0.00

這裏使用的是本機同步,測試不會影響實際使用效果,只需要將傳輸來源目標或者本地路徑改為自己的即可
查看是否同步到自己主機的/mnt/目錄下

[root@localhost src]# cd /mnt/
[root@localhost mnt]# ls
1234566.txt

使用expect編寫分發腳本

實現批量分發系統要將同步目錄和主機ip兩個信息寫在指定的保存文件中,這樣就會在同步分發時循環這些信息來對這些主機批量同步多個目錄
創建目錄記錄文件和主機ip文件,我這裏所有腳本均在/usr/loca/src/目錄下,所有在腳本中也會指定這個路徑,若在修改自己腳本時,請註意這些自定義路徑
文件中的信息可以是多條,一行即是一條記錄,這樣可以實現循環遍歷

[root@localhost src]# cat file.txt 
/mnt/
/tmp/123/
[root@localhost src]# cat ip.txt 
192.168.1.234
192.168.1.235
192.168.1.336

創建expect的腳本文件,腳本內容中把主機ip和同步的目錄均做了參數引用,在稍後的sh腳本中會指定引用參數,並對這些參數進行循環操作
rsync指定的--files-from是明確指定同步的目錄或文件來源,在expect中則是指定一個參數引用,expect在根據這個參數引用去想用戶請求輸入這個信息(在這個腳本中這個信息是由sh腳本讀取file.txt這個文件來提供給expect的)

[root@localhost src]# vim rsync.expect 
#!/usr/bin/expect
set passwd "pwd@123"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avR --files-from=$file / root@$host:/
expect {
"yes/no" { send "yes\r" }
"password:" { send "$passwd\r" }
}
expect eof

shell腳本內容
對目錄文件讀取,讀取後的信息交給expect,讓expect使用rsync去同步這些目錄。shell中的ip.txt記錄的則是一些主機ip,保存在這裏的主機ip都會被循環讀取並執行指定的expect腳本來同步目錄,從而實現了批量的主機目錄同步

[root@localhost src]# vim rsync.sh 
#!/bin/bash
for file in `cat /usr/local/src/ip.txt`
 ?do 
 ?  ./rsync.expect $file /usr/local/src/file.txt
 ?done

將expect和shell循環腳本都給予可執行權限,並查看腳本的執行過程,這裏我的expect和shell腳本都是前綴同名的文件,給予權限時可以使用<br/>*號通配表示。我這裏只是同步了一個主機的目錄,測試結果不影響實際當中的使用。註意expect腳本後需要eof參數給傳輸留下執行實際,否則會造成傳輸失敗

[root@localhost src]# chmod a+x rsync.*
[root@localhost src]# sh -x rsync.sh 
++ cat /usr/local/src/ip.txt
+ for file in ‘`cat /usr/local/src/ip.txt`‘
+ ./rsync.expect 192.168.1.234 /usr/local/src/file.txt
spawn rsync -avR --files-from=/usr/local/src/file.txt / [email protected]:/
[email protected]‘s password: 
building file list ... done
sent 54 bytes received 12 bytes 132.00 bytes/sec
total size is 0 speedup is 0.00

expect批量執行命令

和上節邏輯類似,根據ip文件中提供的主機,使用for循環遍歷出主機,並在for循環內調用expect腳本來登錄循環遍歷的服務器並逐一執行相應的命令。for每循環一次都會遍歷出一個主機ip並使用expect腳本登錄並執行命令
for腳本如下,註意for循環裏調用的expect可執行腳本的文件名並指定登錄主機和執行命令調用的參數

[root@localhost ~]# [root@localhost shell]# cat ins.sh 
#!/bin/bash

for ip in `cat ip.txt`
 ? ?do
 ? ? ? ?echo $ip
 ? ? ?  ./inst.expect $ip "hostname;df -h"
done

expect腳本如下,將主機和執行命令分別以調用參數的形式引用,使用命令行輸入匹配特定字符來調用執行參數(argv參數對應expect的指定字符匹配)

[root@localhost shell]# cat inst.expect 
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "pwd@123"
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"

另外將主機ip寫在一個文件當中,以供for循環遍歷來調用

[root@localhost shell]# cat ip.txt 
192.168.1.234

執行結果如,打印出ip.txt文件中主機的hostname和磁盤分區使用情況信息

[root@localhost shell]# sh ins.sh 
192.168.1.234
spawn ssh [email protected]
[email protected]‘s password: 
Last login: Thu Sep 27 14:06:21 2018 from 192.168.1.234
[root@localhost ~]# hostname;df -h
localhost.localdomain
Filesystem ? ? ? ? ? Size ?Used Avail Use% Mounted on
/dev/mapper/cl-root ? 18G ?9.3G ?8.6G ?52% /
devtmpfs ? ? ? ? ? ? 902M ? ? 0 ?902M ? 0% /dev
tmpfs ? ? ? ? ? ? ? ?912M ? ? 0 ?912M ? 0% /dev/shm
tmpfs ? ? ? ? ? ? ? ?912M ?8.7M ?904M ? 1% /run
tmpfs ? ? ? ? ? ? ? ?912M ? ? 0 ?912M ? 0% /sys/fs/cgroup
/dev/sda1 ? ? ? ? ? ?197M ?117M ? 81M ?60% /boot
tmpfs ? ? ? ? ? ? ? ?183M ? ? 0 ?183M ? 0% /run/user/0

expect批量同步或執行命令工具