scp批量上傳檔案到多台機器上 公升級版

2021-06-14 20:57:54 字數 4279 閱讀 2804

現代的shell對程式提供了最小限度的控制(開始,停止,等等),而把互動的特性留給了使用者。 這意味著有些程式,你不能非互動的執行,比如說passwd。 有一些程式可以非互動的執行,但在很大程度上喪失了靈活性,比如說fsck。這表明unix的工具構造邏輯開始出現問題。expect恰恰填補了其中的一些裂痕,解決了在unix環境中長期存在著的一些問題。

expect使用tcl作為語言核心。不僅如此,不管程式是互動和還是非互動的,expect都能運用。

1.multi_scp_upload.sh的源**

#!/bin/bash 

#author: yifangyou 

#create time:2011-05-17 

#用來通過scp批量上傳檔案或者目錄到目標機器的指定目錄 

#配置檔案格式: 

#ssh_hosts=("1.1.1.1" "2.2.2.2") 

#ssh_ports=("22" "22") 這個可以預設,預設值為22,或者個數比ssh_hosts少時,使用預設值 

#ssh_users=("root" "root") 這個可以預設,預設值為root,,或者個數比ssh_hosts少時,使用預設值 

#ssh_passwords=("323" "222") 這個可以預設,預設的話需要從命令列輸入,或者個數比ssh_hosts少時,使用命令列輸入 

#執行:sh multi_scp.sh conf_file_path file target 

if [ -z "$3" ] 

then

echo "sh multi_scp.sh conf_file_path file target"; 

exit; 

fi default_ssh_user="root"

default_ssh_port="22"; 

#upload shell script file path 

scp_upload=scp_upload.sh 

#configure file path 

conf_file=$1 

#then upload file path 

scp_file=$2 

#remote hosttarget file or dir path 

scp_target=$3 

#判斷conf_file配置檔案是存在 

if [ ! -e "$conf_file" ] 

then

echo "$conf_file is not exists"; 

exit; 

fi #判斷scp_file是檔案或者目錄 

if [ ! -e "$scp_file" ] && [ ! -d "$scp_file" ] 

then

echo "$scp_file is not exists"; 

exit; 

fi #read configure file 

source $conf_file 

#若是沒有在配置檔案裡提供密碼,則在命令列輸入 

if [ "$" = "0" ] || [ "$" -lt "$" ] 

then

read -p "please input password:" -s default_ssh_password 

fi success_hosts=""; 

fail_hosts=""; 

for((i=0;i<$;i++)) 

do #remote ssh host 

ssh_host=$; 

#remote ssh port 

ssh_port=$; 

if [ "$ssh_port" = "" ] 

then

ssh_port=$default_ssh_port; 

fi #remote ssh user

ssh_user=$; 

if [ "$ssh_user" = "" ] 

then

ssh_user=$default_ssh_user; 

fi #remote ssh password

ssh_password=$; 

if [ "$ssh_password" = "" ] 

then

ssh_password=$default_ssh_password; 

fi echo "["`date +"%f %t"`"] (scp -r $scp_file $ssh_user@$ssh_host:$ssh_port:$scp_target) start"

#scp file or dir 

/usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file" "$scp_target"

if [ "$?" -eq "0" ] 

then

success_hosts="$success_hosts,$ssh_host"

else

fail_hosts="$fail_hosts,$ssh_host"

fi echo "["`date +"%f %t"`"] (scp -r $scp_file $ssh_user@$ssh_host:$ssh_port:$scp_target) end"

echo ""

done 

echo "success_hosts=[$success_hosts]"

echo "fail_hosts=[$fail_hosts]"

2.scp_upload.sh的源**

#!/usr/bin/expect 

#author: yifangyou 

#create time:2011-05-17 

#host 

set scphost "[lindex $argv 0]"

#ssh埠 

set port "[lindex $argv 1]"

#ssh使用者名稱 

set scpuser "[lindex $argv 2]"

#ssh密碼 

set scppw "[lindex $argv 3]"

#要上傳的檔名或者目錄 

set file "[lindex $argv 4]"

#要上傳到遠端機器的檔名或者目錄 

set target "[lindex $argv 5]"

spawn scp -r -p $port $file $scpuser@$scphost:$target

#設定超時時間,防止遠端機器防火牆沒有開,而掛起 

set timeout 30 

expect  

#the first connect will respose "are you sure you want to continue connecting (yes/no)? yes"

"*yes*"  

busy  

failed  

timeout  

} #permission denied not try again,回報出錯資訊 

set timeout 30 

expect  

"*no such file*"  

busy  

failed  

timeout  

} exit 0

3.配置檔案格式scp.conf

#ssh_hosts=("1.1.1.1" "2.2.2.2") 

#ssh_ports=("22" "22") #wheen port_num < host_num use default=22,or ssh_ports is undefined use 22 as default value 

#ssh_users=("root" "root") #wheen user_num < host_num use default=root,or ssh_users is undefined use root as default value 

#ssh_passwords=("323" "222") #wheen password_num < host_num use default=input password,or ssh_users is undefined use input password

4.執行**

找一台機器可以和要上傳的機器聯通,安裝好expect(可以用expect命令測試是否已經安裝過了)

把scp_upload.sh,multi_scp_upload.sh,scp.conf放到同乙個目錄下,執行multi_scp_upload.sh即可

批量scp指令碼 從多台機器拷貝相同檔案

為了方便的從多台伺服器獲取日誌 不同機器的相同日誌 寫了個簡易指令碼專門用於批量拷貝伺服器日誌到執行指令碼的機器中。該指令碼包含2個檔案bscp.sh和bscp.exp。使用方式 sh bscp.sh 執行後,程式提示輸入目標機器的密碼 這裡需要多台機器的ssh使用者名稱密碼是相同的,且之前需要建立...

如何在多台機器上共享IOS證書

2.從傳送申請檔案 certificate request,字尾名為certsigningrequest 的機器上把證書對應的private key p12檔案 匯出,密碼自己定,要記住,後面匯入的時候要用。4.over,你可以用其他機器開發了。注 必須得從申請機器上匯出private key.到其...

如何在多台機器上共享IOS證書

2.從傳送申請檔案 certificate request,字尾名為certsigningrequest 的機器上把證書對應的private key p12檔案 匯出,密碼自己定,要記住,後面匯入的時候要用。4.over,你可以用其他機器開發了。注 必須得從申請機器上匯出private key.到其...