1. 程式人生 > >Shell指令:遠端資料夾拷貝

Shell指令:遠端資料夾拷貝

1 資料夾通過ftp拷貝到遠端機器上

ftp是不支援資料夾傳輸的(sftp可以),如果一定要通過ftp傳輸資料夾,可以有幾種策略:

(1)如果條件允許可以使用ftp軟體,FlashFTP,CuteFTP都是支援資料夾傳輸的。

(2)如果無法使用ftp工具可以使用考慮先打成壓縮包,然後傳過去解壓縮以後再移動到指定目錄,這是比較推薦的方式,但是會讓指令碼變得複雜一些,而且需要額外的壓縮和解壓縮時間。

(3)如果上面兩個條件都不允許,必須使用shell指令碼來完成這個任務,那麼可以參考下面的方法。

  shell指令碼:

#! /bin/sh
#bash ftpfloder.sh ip user pw /from /to
if [ $# != 5 ] ; then
	echo "USAGE: $0 ip user pw /from /to"
	echo " e.g.: $0 ip user pw /from /to"
	exit 1;
fi 
IP=$1 #伺服器IP      
user=$2 #ftp使用者名稱
password=$3 #ftp密碼
fromdir=$4 #源目錄
todir=$5 #目的目錄

dirs=`find $fromdir -type d -printf $todir/'%P\n'| awk '{if ($0 == "")next;print "mkdir " $0}'` 
files=`find $fromdir -type f -printf 'put %p %P \n'` 
ftp -nv $IP <<EOF 
user $user $password 
type binary 
prompt 
$ dirs
cd $todir 
$ files
quit 
EOF

呼叫這個指令碼的方法:

FTPTOOLPATH="/roo /ftpfolder.sh"
 FROMPATH="/root /from" #要上傳的資料夾
TOPATH="/test/to" #目標資料夾
HOSTIP="10.80.59.1" #伺服器      
 user=root          #ftp使用者名稱
 password=271828#ftp密碼

 bash $FTPTOOLPATH $ HOSTIP $user $password $ FTPTOOLPATH $ TOPATH

整體思路:這是一個很笨的方法,使用ftp進行資料夾拷貝不行那麼只好採取曲線救國的方式,先在目標目錄生成資料夾的結構,然後再在這個基礎上將需要傳輸的大量檔案逐個的傳過去。$dirs

就是生成檔案結構的操作,$ files是逐個傳輸檔案到已經建立好的目錄下的操作。

當然這樣的操作存在一定的風險,那就是大量的檔案傳輸的時候有可能會有檔案損壞,在這一點上方法(3)是不及方法(2)的。

2 scp指令進行資料夾拷貝

 scp是基於ssh登入的,較於1中完全使用FTP的操作起來要方便很多。但存在一個問題是scp是基於基於安全認證的檔案傳輸,無法在腳本里指定密碼,需要在指令執行後手動輸入密碼,這對靜默任務或者需要定時執行的任務來說是不適用的,但是對於單次任務來說是個不錯的選擇。

具體的使用是這樣的

scp [可選引數] file_source file_target

傳輸檔案:

scplocal_file remote_username@remote_ip:remote_folder 

示例:

scp /home/daisy/[email protected]:/home/root

傳輸資料夾:

scp-r local_folder remote_username@remote_ip:remote_folder

示例: