scp 上傳檔案到多個伺服器節點

來源:互聯網
上載者:User

標籤:exp   無人值守   靈活   scp命令   get   one   密碼   批量   near   

參考:scp批量上傳檔案到多台機器上(升級版)

實測,代碼可運行.

1.如果遇到syntax error near unexpected token問題,基本是由於windows環境下編寫的shell指令碼上傳到UNIX中包含了^M引起的。

使用remove_ctrlM.sh替換掉sh指令碼中的^M字元,也可以使用 vi -b your_file編輯檔案。

如果scp.conf報syntax error near unexpected token問題,則vi -b scp.conf編輯此設定檔,替換掉其中的特殊字元。

2.如果遇到source: not found的異常,查看ubuntu12.04中shell指令碼無法使用source的原因及解決方案。

原作者的指令碼在copy dir的時候,會將整個dir目錄拷貝至 target中,這跟scp命令本身有關。

scp -r ./code/oaf/* [email protected]:$JAVA_TOP會僅拷貝oaf目錄下的檔案及檔案夾至$JAVA_TOP

但是此處不能用sh multi_scp.sh ./scp.conf ./code/oaf/* $JAVA_TOP,會拋出異常。

所以我針對想僅拷貝目錄下的檔案及檔案夾做了一點改動。

把multi_scp.sh中的

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

改為了

if [ -d "$scp_file" ]thenfor f in ` ls "$scp_file"`do/usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file/$f" "$scp_target"doneelse#scp file or dir  /usr/bin/expect scp_upload.sh "$ssh_host" "$ssh_port" "$ssh_user" "$ssh_password" "$scp_file" "$scp_target"fi

version2,拷貝目錄至target.

version3,僅拷貝目錄下的內容至target.

 

鑒於此種方式需要使用linux的expect模組,我又寫了一個簡陋的scp,此種方式需要在每次執行scp的時候互動輸入scp的密碼,但是特別繁瑣,所以就想到了加入ssh信任免密碼登入。

Step 1. Linux基礎 - scp免密碼登陸進行遠程檔案同步

Step 2. $ sh scp2multi_nodes.sh(下載)

#!/bin/bashssh_hosts=("192.168.233.136" "192.168.233.137")default_ssh_user="huanghongbo" default_ssh_password="huanghongbo"default_ssh_port="22"port=$default_ssh_portscp_file=./code/oaf/target=$JAVA_TOPscpuser=$default_ssh_userfor((i=0;i<${#ssh_hosts[@]};i++))  do#remote ssh host  scphost=${ssh_hosts[$i]}echo $i node ,host is $scphost#echo "["`date +"%F %T"`"] (scp -r $scp_file [email protected]$ssh_host:$ssh_port:$scp_target) start" echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file [email protected]$scphost:$target  ) start"#scp -q -r -P $port $scp_file/* [email protected]$scphost:$target#-q 不顯示傳輸進度scp -r -P $port $scp_file/* [email protected]$scphost:$targetif [ "$?" -eq "0" ]  then success_hosts="$success_hosts,$scphost" else fail_hosts="$fail_hosts,$scphost" fi echo "["`date +"%F %T"`"] (scp -r -P $port $scp_file [email protected]$scphost:$target  ) end"    done  echo "success_hosts=[$success_hosts]" echo "fail_hosts=[$fail_hosts]" 

 

PS:

1.樣本中的target都是使用的環境變數$JAVA_TOP,如果remote環境和local環境的$JAVA_TOP環境變數不一致,則會導致傳輸到錯誤的路徑或者scp:***:No such file or directory。

在scp中如何擷取remote環境的環境變數,我暫時還沒找到方法。

看到的一種比較合理的解釋是

How is it supposed to know what the remote variables values are? scp/rcp DO NOT execute a .profile or any login script. They establish a connection to the remote server only.

2.Expect在這個程式裡就是用來協助自動輸入scp的密碼,Expect主要用於把需要人工互動的程式變為程式自動化完成,這個對於營運批量部署系統,批量無人值守安裝,批量執行命令,批量上傳下載
 現代的Shell對程式提供了最小限度的控制(開始,停止,等等),而把互動的特性留給了使用者。 這意味著有些程式,你不能非互動的運行,比如說passwd。 有一些程式可以非互動的運行,但在很大程度上喪失了靈活性,比如說fsck。這表明Unix的工具構造邏輯開始出現問題。Expect恰恰填補了其中的一些裂痕,解決了在Unix環境中長期存在著的一些問題。

scp 上傳檔案到多個伺服器節點

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.