linux 遠程文件同步(shell)

1.首先安裝tcl和expect(先安裝tcl,再安裝expect,自行百度),sshpass
2.我想把本地文件同步到其他幾臺機器上,因此,需要知道機器的ip,username,password,我用一個文件來存放這些內容machine_info,內容如下:

127.0.0.1 username password
192.168.12.12 usename password

編寫expect shell

#!/usr/bin/expect -f
set timeout -1  #永不超時,默認爲10s
set src_file [lindex $argv 0]  #argv參數讀取,必須是argv
set user_name [lindex $argv 1]
set host_ip [lindex $argv 2]
set dest_file [lindex $argv 3]
set password [lindex $argv 4]
spawn scp $src_file $user_name@$host_ip:$dest_file
expect {
    "*(yes/no)?"
              {
                  send "yes\r"
                  expect "*assword:" {
                      send "$password\r"
                  }
              }
    "*assword:"{
              send "$password\r"
    }
}
expect eof

編寫批量 shell,傳的參數爲文件名和上傳到機器的路徑

#!/bin/bash
#$0含義
file_name=$1 # =不能空格
file_path=$2
#逐行讀取machine_info裏面的數據,while read不能改
while read line
do 
    ip=`echo $line | cut -d' ' -f 1`
    user_name=`echo $line | cut -d' ' -f 2`
    password=`echo $line | cut -d' ' -f 3`
    sshpass -p $password ssh $user_name@$ip mkdir -p $file_path </dev/null #後面的</dev/null很重要,還有記住這種寫法
    ./expect.sh $file_name $user_name $ip $file_path $password
done < machine_info

注:mkdir沒有爲你創建,有的話就什麼都不做,爲什要加上/dev/null?
原因是while重定向機制,machine_info文件中的信息都已經讀入並重定向給了整個while語句。所以當我們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裏,ssh語句正好會讀取輸入中的所有東西,可以用下面命令證明:

sshpass -p $password ssh $user_name@$ip cat

會發現打印出所有內容,這就導致調用完ssh語句後,輸入緩存中已經都被讀完了,當read語句再讀的時候當然也就讀不到紀錄,循環也就退出了。因此就要讓ssh重定向,就要加/dev/null,或者改用for來執行循環,還有的說ssh加一個-n也行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章