第四部分shell編程5項目二分發系統

第一部分:expect講解
expect可讓咱們實現自動登陸遠程機器,而且能夠實現自動遠程執行命令。固然如果使用不帶密碼的密鑰驗證一樣能夠實現自動登陸和自動遠程執行命令。但當不能使用密鑰驗證的時候,咱們就沒有辦法了。因此,這時候只要知道對方機器的帳號和密碼就能夠經過expect腳本實現登陸和遠程命令。
使用expect以前,須要先安裝expect:
yum install -y expect shell

1. 自動遠程登陸,並執行命令,登錄另一臺機器,與機器交互的腳本,登錄自動輸入密碼
首先來看一個登陸後不退出的腳本:
1. #! /usr/bin/expect
2. set host "192.168.11.102"
3. set passwd "123456"
4. spawn ssh root@$host #spawn 是一個語法
5. expect {
6. "yes/no" { send "yes\r"; exp_continue} #第一次登錄系統提示exp_continue往下走
7. "assword:" { send "$passwd\r" }
8. }
9. interactbash

 


再來看一個登錄後,執行命令而後退出的腳本:ssh

1. #!/usr/bin/expect
2. set user "root"
3. set passwd "123456"
4.
5. spawn ssh $user@192.168.11.18
6.
7. expect {
8. "yes/no" { send "yes\r"; exp_continue}
9. "password:" { send "$passwd\r" }
10. }
11. expect "]*" #這裏定位在輸入狀態*表示任意的字符root是顯示#,其餘用戶顯示$
12. send "touch /tmp/12.txt\r"
13. expect "]*"
14. send "echo 1212 > /tmp/12.txt\r"
15. expect "]*"
16. send "exit\r"網站

 

2. 咱們還能夠傳遞參數
1. #!/usr/bin/expect
2. set user [lindex $argv 0] #第一個是用戶
3. set host [lindex $argv 1] #第二個是IP
4. set passwd "123456"
5. set cm [lindex $argv 2] #第三個cm是一個命令,用一個參數來體現
6.
7. spawn ssh $user@$host
8.
9. expect {
10. "yes/no" { send "yes\r"}
11. "password:" { send "$passwd\r" }
12. }
13. expect "]*"
14. send "$cm\r"
15. expect "]*"
16. send "exit\r"spa


執行 chmod +x 3.exp
./3.exp root 192.168.0.16 "ls /tmp/"ip

===============
rsync -av 1.expect
a表明帶了不少不少的選項,包含權限軟鏈接同步


把本地文件1.expect傳到遠程的機器上,若是遠程機器的目錄不存在,能夠自動建立一層的目錄,兩層不行
rsync -av /tmp/shell/1.expect root@192.168.11.18:/tmpit

rsync -av /tmp/shell/1.expect 192.168.11.18:/tmp 省略用戶,登錄的是當前的用戶模板

把遠程機器的文件傳到本地的機器上
rsync -av 192.168.11.18:/tmp/12.txt /tmp/12.txt登錄


這個是自動把本地機器的文件同步到遠程機器
3. 自動同步文件
1. #!/usr/bin/expect
2. set passwd "123456"
3. spawn rsync -av /tmp/12.txt root@192.168.11.18:/tmp
4. expect {
5. "yes/no" { send "yes\r"}
6. "password:" { send "$passwd\r" }
7. }
8. expect eof
9.

 


這個是自動把遠程機器的文件同步到本地機器
3. 自動同步文件
1. #!/usr/bin/expect
2. set passwd "123456"
3. spawn rsync -av root@192.168.11.18:/tmp/12.txt /tmp/
4. expect {
5. "yes/no" { send "yes\r"}
6. "password:" { send "$passwd\r" }
7. }
8. expect eof
9.


4. 指定host和要同步的文件,把本地的文件傳到遠程機器
1. #!/usr/bin/expect
2. set passwd "123456"
3. set host [lindex $argv 0]
4. set file [lindex $argv 1]
5. spawn rsync -av $file root@$host:$file
6. expect {
7. "yes/no" { send "yes\r"}
8. "password:" { send "$passwd\r" }
9. }
10. expect eof


執行: ./4.expect 192.168.11.18 /tmp/12.txt
或者expect 4.expect 192.168.11.18 /tmp/12.txt

第二部分:構建文件分發系統
1. 需求背景
對於大公司而言,確定時不時會有網站或者配置文件更新,並且使用的機器確定也是好多臺,少則幾臺,多則幾十甚至上百臺。因此,自動同步文件是相當重要的。

2. 實現思路
首先要有一臺模板機器,把要分發的文件準備好,而後只要使用expect腳本批量把須要同步的文件分發到目標機器便可。
3. 核心命令
rsync -av --files-from=list.txt / root@host:/ #必須從根目錄開始查找,list.txt能夠寫絕對路徑,能找到這個文件就能夠,就是路徑拼接


=====
執行
rsync -av --files-from=list.txt / 192.168.11.16:/

先在一個文件list.txt裏面建立好文件列表
/bin/shell/1.sh
/tmp/12.txt

====


4. 文件分發系統的實現
5.expect
1. #!/usr/bin/expect
2. set passwd "123456"
3. set host [lindex $argv 0]
4. set file [lindex $argv 1]
5. spawn rsync -av --files-from=$file / root@$host:/ #表明同步的文件列表
6. expect {
7. "yes/no" { send "yes\r"}
8. "password:" { send "$passwd\r" }
9. }
10. expect eof

11. #下面能夠省略,用shell代替了
12. cat ip.list
13. 192.168.11.18
14. 192.168.11.19
15. ......


先實現一個機器分發
for ip in 192.168.11.16; do expect 5.expect $ip ./list.txt ; done

若是是分發多個
for ip in `cat ip.txt`; do expect 5.expect $ip ./list.txt ; done
=======================

執行的腳本

rsync.sh
1. #!/bin/bash
2. for ip in `cat ip.list`
3. do
4. echo $ip
5. ./5.expect $ip list.txt
6. done
7.


=====================

5. 命令批量執行腳本
exe.expect
1. #!/usr/bin/expect
2. set host [lindex $argv 0]
3. set passwd "123456"
4. set cm [lindex $argv 1]
5.
6. spawn ssh root@$host
7.
8. expect {
9. "yes/no" { send "yes\r"}
10. "password:" { send "$passwd\r" }
11. }
12. expect "]*"
13. send "$cm\r"
14. expect "]*"
15. send "exit\r"

 

ip.txt 裏面有192.168.11.16 多個能夠有循環

for ip in `cat ip.txt`; do ./exe.expect $ip "w;ls -dl /tmp; touch /root/aming123.txt"; done


==============
執行的腳本

exe.sh
1. #!/bin/bash
2. for ip in `cat ip.list`
3. do
4. echo $ip
5. ./exe.expect $ip 'w;free -m;ls /tmp"
6. done

 

 

ssh 192.168.11.16

相關文章
相關標籤/搜索