現代的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.到其...