Author |
Message |
2007-02-07 19:32:04
|
#1
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
設計理念
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
Filename |
zip.exe |
Download
|
Description |
zip.exe (v2.32) |
Filesize |
132 Kbytes
|
Downloaded: |
235 time(s) |
Filename |
ftp.cfg |
Download
|
Description |
ftp.cfg |
Filesize |
28 bytes
|
Downloaded: |
236 time(s) |
Filename |
remote_backup_web.bat |
Download
|
Description |
remote_backup_web.bat |
Filesize |
2 Kbytes
|
Downloaded: |
268 time(s) |
|
分享經驗 累積智慧 |
|
|
2008-11-21 12:55:52
|
#2
|
winglee007
十級學員
Joined: 2008/11/21
Messages: 1
Offline
|
首先謝謝你,我用了這個bat,超好用的^^
但有一個問題想問一下,如果我在壓縮的時候,可以有方法在這bat檔加上密碼才上傳到ftp嗎?
因為我們要處理會計的文件,很機密的,謝謝
|
|
|
2008-11-21 22:01:54
|
#3
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
要加上密碼也是可以的,只要將原本的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]
|
分享經驗 累積智慧 |
|
|
2009-10-01 17:01:46
|
#4
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
謝謝你~這個程式幫助很大。
但是想請教一下,dos的指令,有沒有辦法抓取系統日前一日的日期呢?因為找了很久都找不到任何相關資訊,所以想請教一下,謝謝!
|
|
|
2009-10-01 17:51:25
|
#5
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
底下是我在網路上蒐尋 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
Filename |
prevdays.bat |
Download
|
Description |
取得系統日期前N天的日期 |
Filesize |
988 bytes
|
Downloaded: |
65 time(s) |
|
分享經驗 累積智慧 |
|
|
2009-10-02 16:40:28
|
#6
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
謝謝你,還蠻實用的,另外,想再請問一下,如何在dos底下,取出星期幾呢?應該是說,如何用date來取出星期?,目前已經研究出N天前的寫法,不過想再問一下是可否知道哪一天是星期幾?謝謝!
|
|
|
2009-10-05 13:35:20
|
#7
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
可以用下面的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
|
分享經驗 累積智慧 |
|
|
2009-10-05 16:22:25
|
#8
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
感謝~謝謝您幫我找到這個答案。最後想請問,一般工作日跟放假日,應該都是用比較高階的程式才能寫出來的吧?!Dos能夠寫出這樣的批次檔嗎?也就是說,能夠分辨營業日跟放假日嗎?一般的放假日(ex.六、日)這個部分可以克服(ex.抓取星期幾?),但是,若是遇到其他的假日(ex.中秋節)不是在六日的話,這樣好像就沒辦法了。謝謝!
|
|
|
2009-10-05 19:06:24
|
#9
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
我想山不轉路轉吧,可以用這樣的方式來達成,
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
Filename |
holidays.txt |
Download
|
Description |
假日資料檔 |
Filesize |
22 bytes
|
Downloaded: |
38 time(s) |
Filename |
holiday.bat |
Download
|
Description |
檢查某個日期是否為假日 |
Filesize |
246 bytes
|
Downloaded: |
40 time(s) |
|
分享經驗 累積智慧 |
|
|
2011-01-04 17:40:40
|
#10
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
您好,不好意思,又有問題想請教。
目前遇到ftp server的密碼為空白
想請問一下cfg檔中的password若為空白時,該如何處理呢?謝謝!
|
|
|
2011-01-06 10:24:37
|
#11
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
據我所知,除非您是使用TFTP(Trivial File Transfer Protocol) Server,才不需要驗證,否則
不用密碼就可以登入FTP Server 好像不太可能(至少違反安全性,應該很難持續這種狀態),就算是匿名(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
|
分享經驗 累積智慧 |
|
|
2011-01-06 10:49:06
|
#12
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
謝謝大大,您說的那個cfg我已經試過了,他是會在命令提示字元中出現password的字樣,也就是還是要請我們填入密碼,而若是在cfg中填入'' 或"",則是會出現錯誤訊息(也就是密碼錯誤),後來呢!就只能請對方設定帳號密碼,才能解決這個問題,不過呢!還是很謝謝大大的!
不過,還是有一件事想請問大大,不曉得大大有沒有玩過Windows server 2008呢?在做排定的工作時(排程),沒有辦法順利執行成功(也就是使用7-zip壓縮時,無法順利以排程完成工作),但權限的部份已經設定為最高權限了,不曉得是否還有什麼原因呢?謝謝囉!
|
|
|
2011-01-26 14:38:00
|
#13
|
n5998744
十級學員
Joined: 2011/1/26
Messages: 1
Offline
|
您好,想請教老師:
如果我只想把備份的檔案放到同一台電腦的其他槽區而已,那應該要改哪裡?
再請問老師,資料庫的資料可以如何自動備份 ?
非常感謝!!
|
|
|
2011-01-28 17:23:53
|
#14
|
andowson
七段學員
Joined: 2007/1/2
Messages: 713
Location: 台北
Offline
|
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,要備份資料庫到本機硬碟的話就很簡單,可以在資料庫軟體上設定排程,將資料庫備份到某一個目錄下即可。
|
分享經驗 累積智慧 |
|
|
2011-10-18 15:53:05
|
#15
|
starzine
九級學員
Joined: 2009/9/29
Messages: 14
Offline
|
您好:因為又遇到了點難題,想來請教一下是否有任何可以解決的方法。
目前以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的部分應該怎麼處理呢?謝謝!
|
|
|
|