練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

[Windows]如何定時自動備份整個網站目錄到遠端伺服器 RSS feed
討論區首頁 » Windows Server
發表人 內容
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
smilie設計理念
1.先將要備份的目錄壓縮起來(節省傳輸時間)
2.然後再ftp到遠端的伺服器去(建立日期目錄)
3.定時自動執行(如每日凌晨三點)

首先,3可用Windows附屬應用程式=>系統工具=>排定的工作來完成,我們最後設定即可。
1和2則需要寫支DOS batch程式來完成,假設叫做remote_backup_web.bat。底下是該bat檔案的內容

rem ---------------------------------------------------------------------------
rem Backup web application to remote host
rem
rem $Id: remote_backup_web.bat 2007-02-07 21:24:43Z andowson $
rem ---------------------------------------------------------------------------

@echo off
rem Find out web server's IP address
ipconfig | findstr "Address" > ip1.txt
for /f "tokens=1-2 delims=:" %%i in (ip1.txt) do echo %%j > ip2.txt
for /f "tokens=1-2 delims= " %%i in (ip2.txt) do (set ip=%%i)
del ip1.txt
del ip2.txt

rem Get today's year, month, day
for /f "tokens=1-3 delims=/ " %%a in ('date /t') do (set year=%%a& set month=%%b& set day=%%c)

rem Modify the following line for your environment
set TARGET=C:\Inetpub\wwwroot\demoweb
set TARGETNAME=demoweb
set BACKUPDIR=D:\backup
set BACKUPFILE=%BACKUPDIR%\%year%\%TARGETNAME%_%ip%_%year%%month%%day%.zip
set LOGFILE=%TARGETNAME%_backup.log

echo. | date | findstr "現在日期" >> %LOGFILE%
echo. | time | findstr "現在時間" >> %LOGFILE%

rem Compress the target directory before ftp
zip -r %BACKUPFILE% %TARGET%\*

if not exist %BACKUPDIR%\%year% mkdir %BACKUPDIR%\%year%

if not exist %BACKUPFILE% goto nofile
goto ftpsession

:nofile
echo [FAILURE] can't find %BACKUPFILE% >> %LOGFILE%
echo.>> %LOGFILE%
goto end

:ftpsession
for /f "tokens=1-3 delims= " %%i in (ftp.cfg) do (set FTPSERVER=%%i&set USERNAME=%%j&set PASSWORD=%%k)
echo open %FTPSERVER% > ftpscript.txt
echo user %USERNAME% %PASSWORD% >> ftpscript.txt
echo mkdir %year%%month%%day% >> ftpscript.txt
echo cd %year%%month%%day% >> ftpscript.txt
echo bi >> ftpscript.txt
echo put %BACKUPFILE% >> ftpscript.txt
echo bye >> ftpscript.txt

echo ---=== ftp session begins ===--->> %LOGFILE%
echo ftp %BACKUPFILE% to %FTPSERVER% >> %LOGFILE%

ftp -i -n < ftpscript.txt >> %LOGFILE%

echo ---=== ftp session ends ===--->> %LOGFILE%
echo. |time | findstr "現在時間">> %LOGFILE%
echo.>> %LOGFILE%

del ftpscript.txt

set TARGET=
set TARGETNAME=
set BACKUPDIR=
set BACKUPFILE=
set LOGFILE=
set FTPSERVER=
set USERNAME=
set PASSWORD=

:end


其中zip指令(取自Info-ZIP發行之免費軟體)並非Windows內建的指令,請由本站下載,放到C:\Windows目錄下

Windows內建的FTP指令說明可以透過執行ftp --usage指令得到:

ftp --usage

Transfers files to and from a computer running an FTP server service
(sometimes called a daemon). Ftp can be used interactively.

FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-w:windowsize] [-A] [host]

-v Suppresses display of remote server responses.
-n Suppresses auto-login upon initial connection.
-i Turns off interactive prompting during multiple file
transfers.
-d Enables debugging.
-g Disables filename globbing (see GLOB command).
-s:filename Specifies a text file containing FTP commands; the
commands will automatically run after FTP starts.
-a Use any local interface when binding data connection.
-A login as anonymous.
-w:buffersize Overrides the default transfer buffer size of 4096.
host Specifies the host name or IP address of the remote
host to connect to.

Notes:
- mget and mput commands take y/n/q for yes/no/quit.
- Use Control-C to abort commands.


另外我把ftp的參數檔存放在ftp.cfg,內容如下
remotehost username password

remotehost:請改成您的遠端主機IP(需有啟動FTP Server)
username:請改成您的FTP帳號
password:請改成您的FTP密碼

執行完會在執行目錄下產生一個logfile,可供debug用。

最後,遠端伺服器需先建立好對應的帳號及密碼,如有修改請記得回來改ftp.cfg

參考資料:
易學易用的 Windows PowerShell
 檔案名稱 zip.exe [Disk] 下載
 描述 zip.exe (v2.32)
 檔案大小 132 Kbytes
 下載次數:  235 次

 檔案名稱 ftp.cfg [Disk] 下載
 描述 ftp.cfg
 檔案大小 28 bytes
 下載次數:  236 次

 檔案名稱 remote_backup_web.bat [Disk] 下載
 描述 remote_backup_web.bat
 檔案大小 2 Kbytes
 下載次數:  268 次


分享經驗 累積智慧
[WWW]
winglee007

十級學員

註冊時間: 2008/11/21
文章: 1
離線
首先謝謝你,我用了這個bat,超好用的^^

但有一個問題想問一下,如果我在壓縮的時候,可以有方法在這bat檔加上密碼才上傳到ftp嗎?

因為我們要處理會計的文件,很機密的,謝謝

andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
要加上密碼也是可以的,只要將原本的zip.exe換一個可以加密碼的壓縮軟體執行檔即可,例如7-Zip這個免費又可以加上密碼的壓縮軟體的7z.exe。
1.到http://www.7-zip.org/下載安裝用的exe檔
2.執行下載的exe檔安裝
3.安裝完成後,將C:\Program Files\7-Zip下的7z.exe複製到C:\Windows\System32目錄下。

相關的參數可以在命令列下執行7z獲得:
7-Zip 4.57  Copyright (c) 1999-2007 Igor Pavlov  2007-12-06


Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...]
[<@listfiles...>]

<Commands>
a: Add files to archive
b: Benchmark
d: Delete files from archive
e: Extract files from archive (without using directory names)
l: List contents of archive
t: Test integrity of archive
u: Update files to archive
x: eXtract files with full paths
<Switches>
-ai[r[-|0]]{@listfile|!wildcard}: Include archives
-ax[r[-|0]]{@listfile|!wildcard}: eXclude archives
-bd: Disable percentage indicator
-i[r[-|0]]{@listfile|!wildcard}: Include filenames
-m{Parameters}: set compression Method
-o{Directory}: set Output directory
-p{Password}: set Password
-r[-|0]: Recurse subdirectories
-scs{UTF-8 | WIN | DOS}: set charset for list files
-sfx[{name}]: Create SFX archive
-si[{name}]: read data from stdin
-slt: show technical information for l (List) command
-so: write data to stdout
-ssc[-]: set sensitive case mode
-ssw: compress shared files
-t{Type}: Set type of archive
-v{Size}[b|k|m|g]: Create volumes
-u[-][p#][q#][r#][x#][y#][z#][!newArchiveName]: Update options
-w[{path}]: assign Work directory. Empty path means a temporary directory
-x[r[-|0]]]{@listfile|!wildcard}: eXclude filenames
-y: assume Yes on all queries


以下是一個執行命令的範例,會將目前整個目錄壓縮起來存到c:\backup.zip檔案,並加上密碼secret。
7z a -psecret c:\backup.zip *


所以原來程式簡易的修改方式如下:
將第29行的程式碼取代為:
[code="bat; first-line:29"]set ZIPPASSWORD=secret
7z a -p%ZIPPASSWORD% %BACKUPFILE% %TARGET%\* [/code]

分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
smilie謝謝你~這個程式幫助很大。
但是想請教一下,dos的指令,有沒有辦法抓取系統日前一日的日期呢?因為找了很久都找不到任何相關資訊,所以想請教一下,謝謝!
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
底下是我在網路上蒐尋DOS batch 取得前一天的日期(google)得到的資料,供您參考

@echo off
:: 作者: namejm 出自:cn-dos
:: 求N天前的日期
:: 日期可以帶星期,但是,必須以年月日的順序排列
:: 年份必須是四位,否則會出錯
@echo off
:Main
cls
set day=%date%
set days=0
echo.&echo.
echo 當前日期是:%day%
echo.&set /p input= 請指定要追溯的天數:
setlocal enabledelayedexpansion
:: 提取日期
for /f "tokens=1-3 delims=-/. " %%i in ("%day%") do (
set /a sy=%%i, sm=100%%j %% 100, sd=100%%k %% 100
)
set /a sd-=input
if %sd% leq 0 call :count
cls&echo.&echo.
echo 當前日期是:%day%
echo.
set sm=0%sm%
set sd=0%sd%
echo %input% 天前的日期是:%sy%-%sm:~-2%-%sd:~-2%
pause>nul
goto Main

:count
set /a sm-=1
if !sm! equ 0 set /a sm=12, sy-=1
call :days
set /a sd+=days
if %sd% leq 0 goto count
goto :eof

:days
:: 獲取指定月份的總天數
set /a leap="^!(sy %% 4) & ^!(^!(sy %% 100)) | ^!(sy %% 400)"
set /a max=28+leap
for /f "tokens=%sm%" %%i in ("31 %max% 31 30 31 30 31 31 30 31 30 31") do set days=%%i
goto :eof
 檔案名稱 prevdays.bat [Disk] 下載
 描述 取得系統日期前N天的日期
 檔案大小 988 bytes
 下載次數:  65 次


分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
smilie謝謝你,還蠻實用的,另外,想再請問一下,如何在dos底下,取出星期幾呢?應該是說,如何用date來取出星期?,目前已經研究出N天前的寫法,不過想再問一下是可否知道哪一天是星期幾?謝謝!
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
可以用下面的DOS指令取出目前的系統日期是星期幾
echo %date:~-3%
如果是要找出前N天是星期幾的話,可以先將系統日期暫存,然後改為前N天的日期,呼叫上面的指令即可取得星期幾,然後再將系統日期改回去。
@echo off

set prevday=2009/10/04
set today=%date:~0,10%
date %prevday%
echo %date:~-3%
date %today%

參考資料:
http://www.cnblogs.com/ustcyier/archive/2008/04/14/1152303.html

分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
smilie感謝~謝謝您幫我找到這個答案。最後想請問,一般工作日跟放假日,應該都是用比較高階的程式才能寫出來的吧?!Dos能夠寫出這樣的批次檔嗎?也就是說,能夠分辨營業日跟放假日嗎?一般的放假日(ex.六、日)這個部分可以克服(ex.抓取星期幾?),但是,若是遇到其他的假日(ex.中秋節)不是在六日的話,這樣好像就沒辦法了。謝謝!
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
我想山不轉路轉吧,可以用這樣的方式來達成,
1.手動建立一個假日檔,例如檔名取叫holidays.txt,每行一個日期,樣子如下:
2009/10/03
2009/12/25

2.從假日檔中每次讀取一行跟前N天的日期作比對,如果相同表示該前N天的日期即為假日,輸出 is a holiday的訊息

底下是範例的程式碼:

@echo off
set prevday=2009/10/03
set isHoliday=0
for /f %%i in (holidays.txt) do call :checkHoliday %prevday% %%i
if %isHoliday%==1 (
echo %prevday% is a holiday
)
goto :end

:checkHoliday
if %1==%2 (
set isHoliday=1
)

:end
 檔案名稱 holidays.txt [Disk] 下載
 描述 假日資料檔
 檔案大小 22 bytes
 下載次數:  38 次

 檔案名稱 holiday.bat [Disk] 下載
 描述 檢查某個日期是否為假日
 檔案大小 246 bytes
 下載次數:  40 次


分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
您好,不好意思,又有問題想請教。
目前遇到ftp server的密碼為空白
想請問一下cfg檔中的password若為空白時,該如何處理呢?謝謝!
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
據我所知,除非您是使用TFTP(Trivial File Transfer Protocol) Server,才不需要驗證,否則
不用密碼就可以登入FTP Server smilie好像不太可能(至少違反安全性,應該很難持續這種狀態),就算是匿名(Anonymous) FTP也是要輸入一下e-mail當作密碼的。

如果您的系統真的不用輸入密碼,可以試試看將ftp.cfg編輯成類似下列的樣子,試試看有什麼錯誤訊息再回報吧:
remotehost username


參考文件:
http://www.sinica.edu.tw/ccc/sysinfo/desktop/ftp.pdf
http://en.wikipedia.org/wiki/Trivial_File_Transfer_Protocol

分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
謝謝大大,您說的那個cfg我已經試過了,他是會在命令提示字元中出現password的字樣,也就是還是要請我們填入密碼,而若是在cfg中填入'' 或"",則是會出現錯誤訊息(也就是密碼錯誤),後來呢!就只能請對方設定帳號密碼,才能解決這個問題,不過呢!還是很謝謝大大的!

不過,還是有一件事想請問大大,不曉得大大有沒有玩過Windows server 2008呢?在做排定的工作時(排程),沒有辦法順利執行成功(也就是使用7-zip壓縮時,無法順利以排程完成工作),但權限的部份已經設定為最高權限了,不曉得是否還有什麼原因呢?謝謝囉!
n5998744

十級學員

註冊時間: 2011/1/26
文章: 1
離線
您好,想請教老師:
如果我只想把備份的檔案放到同一台電腦的其他槽區而已,那應該要改哪裡?
再請問老師,資料庫的資料可以如何自動備份 ?
非常感謝!!
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
n5998744您好:
如果只要把備份的檔案放到同一台電腦的其他槽區而已=>就是不作FTP的動作囉?
那就把ftpsession那段跳過去即可,可以修改remote_backup_web.bat的第34行
[code=bat;first-line:34]
goto ftpsession
[/code]

[code=bat;first-line:34]
goto end
[/code]
如果要更改備份檔所在的目錄,可以修改第21行
[code=bat;first-line:21]
set BACKUPDIR=D:\backup
[/code]

不知道您是使用何種資料庫軟體,如果是使用MS SQL Server,要備份資料庫到本機硬碟的話就很簡單,可以在資料庫軟體上設定排程,將資料庫備份到某一個目錄下即可。

分享經驗 累積智慧
[WWW]
starzine

九級學員

註冊時間: 2009/9/29
文章: 14
離線
您好:因為又遇到了點難題,想來請教一下是否有任何可以解決的方法。

目前以cfg的檔案抓取資料都沒有問題,但是目前對方把ftp移至安全環境底下
開啟了相關的port如下:
HTTP安全連線:https-443
FTP安全連線:ftp-21(也有支援安全通道)、ftps-990(也可用此安全通道連線)
FTP被動模式:port-50000~50009
SSL認證:990, 989
SFTP:22
FTP傳輸資料:20

而因為這樣,目前所使用的cfg無法連接上,用一般的FTP軟體也沒有辦法(雖然有提供21port,但似乎是因為沒有安全性,所以被拒絕了)
請問cfg的部分應該怎麼處理呢?謝謝!
 
討論區首頁 » Windows Server
前往:   
行動版