#
1、編寫相關(guān)的備份腳本backup.bat:
@echo off
mysqldump -uroot -pXXX test>D:\db_backup\test%date:~0,10%.sql
其中“%date:~0,10%”表示取出日期后截取前10個(gè)字符,因?yàn)樵谀繕?biāo)機(jī)器運(yùn)行%date%得到的是“2010-10-13 星期三”,不符合要求。
2、執(zhí)行過(guò)程中,報(bào)如下錯(cuò)誤:
mysqldump: Got error: 1045: Access denied for user:
'root@localhost ' (Using password: NO) when trying to connect
原因是權(quán)限不夠,處理措施如下:
C:\Documents and Settings\Administrator.SPARK001>mysql -uroot -pXXX
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1450
Server version: 5.0.67-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;
Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3、運(yùn)行bat文件后,即生成了“test2010-10-13.sql”類的文件,最后通過(guò)設(shè)置WINDOWS系統(tǒng)工具中的任務(wù)計(jì)劃功能,即可實(shí)現(xiàn)自動(dòng)備份。
基于APACHE COMMONS中的NET包提供的FTP客戶端類庫(kù)實(shí)現(xiàn),下面是具體的代碼:
package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;

import org.apache.commons.net.PrintCommandListener;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;


public class ClientTest
{

public static void main(String[] args)
{
ClientTest main = new ClientTest();
FTPClient ftp = new FTPClient();
// 設(shè)置一個(gè)監(jiān)聽(tīng)
ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));

try
{
ftp.connect("localhost", 2121);
int reply = ftp.getReplyCode();

if (!FTPReply.isPositiveCompletion(reply))
{
ftp.disconnect();
System.out.println("FTP server refused connection");
}
// 登錄
ftp.login("admin", "admin");
main.uploadFile(ftp);
main.listFiles(ftp);
main.downloadFile(ftp);
main.deleteFile(ftp);
main.listFiles(ftp);
// 退出
ftp.logout();

} catch (IOException e)
{
e.printStackTrace();

if (ftp.isConnected())
{

try
{
ftp.disconnect();

} catch (Exception e2)
{
}
}
}
}
// 列舉文件

private void listFiles(FTPClient ftp) throws IOException
{
System.out.println("------------START------------");

for (FTPFile f : ftp.listFiles())
{
System.out.println(f.getName() + " " + f.getSize());
}
System.out.println("------------END------------");
}

// 上傳文件

private void uploadFile(FTPClient ftp) throws IOException
{
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
InputStream input = new FileInputStream("res/conf/dushu.jpg");
ftp.storeFile("dushu.jpg", input);
input.close();
}

// 下載文件

private void downloadFile(FTPClient ftp) throws IOException
{
ftp.setFileType(FTP.BINARY_FILE_TYPE);
ftp.enterLocalPassiveMode();
OutputStream output = new FileOutputStream("res/conf/dushu_down.jpg");
ftp.retrieveFile("dushu.jpg", output);
output.close();
}

// 刪除文件

private void deleteFile(FTPClient ftp) throws IOException
{
ftp.deleteFile("dushu.jpg");
}
}

輸出如下:
220 Service ready for new user.
USER admin
331 User name okay, need password for admin.
PASS admin
230 User logged in, proceed.
TYPE I
200 Command TYPE okay.
PASV
227 Entering Passive Mode (127,0,0,1,13,12)
STOR dushu.jpg
150 File status okay; about to open data connection.
226 Transfer complete.
------------START------------
SYST
215 UNIX Type: Apache FtpServer
PASV
227 Entering Passive Mode (127,0,0,1,13,14)
LIST
150 File status okay; about to open data connection.
226 Closing data connection.
dushu.jpg 83694
------------END------------
TYPE I
200 Command TYPE okay.
PASV
227 Entering Passive Mode (127,0,0,1,13,16)
RETR dushu.jpg
150 File status okay; about to open data connection.
226 Transfer complete.
DELE dushu.jpg
250 Requested file action okay, deleted /dushu.jpg.
------------START------------
PASV
227 Entering Passive Mode (127,0,0,1,13,18)
LIST
150 File status okay; about to open data connection.
226 Closing data connection.
------------END------------
QUIT
221 Goodbye.

最后,提供一張自己拍的讀書圖:
目前搭建起來(lái)了一個(gè)可以運(yùn)行的源代碼環(huán)境,已經(jīng)打包上傳到:
/Files/kinkding/ftpserver.rar
直接在命令行中,使用FTP命令進(jìn)行FTP的相關(guān)操作:
C:\Documents and Settings\dingjunxing>ftp
ftp> open localhost 2121
Connected to DINGJX.
220 Service ready for new user.
User (DINGJX:(none)): admin
331 User name okay, need password for admin.
Password:
230 User logged in, proceed.
ftp> dir
200 Command PORT okay.
150 File status okay; about to open data connection.
-rw------- 1 user group 67646 Oct 11 17:50 03_photos.ico
226 Closing data connection.
ftp: 收到 67 字節(jié),用時(shí) 0.03Seconds 2.16Kbytes/sec.
ftp> ls
200 Command PORT okay.
150 File status okay; about to open data connection.
03_photos.ico
226 Closing data connection.
ftp: 收到 15 字節(jié),用時(shí) 0.00Seconds 15000.00Kbytes/sec.
ftp> get 03_photos.ico
200 Command PORT okay.
150 File status okay; about to open data connection.
226 Transfer complete.
ftp: 收到 67680 字節(jié),用時(shí) 0.02Seconds 4230.00Kbytes/sec.
ftp> delete 03_photos.ico
250 Requested file action okay, deleted /03_photos.ico.
ftp> put 03_photos.ico
200 Command PORT okay.
150 File status okay; about to open data connection.
226 Transfer complete.
ftp: 發(fā)送 67680 字節(jié),用時(shí) 0.02Seconds 4230.00Kbytes/sec.
ftp> put F:\eclipse\workspace\ftpserver\res\ftpserver.jks
200 Command PORT okay.
150 File status okay; about to open data connection.
226 Transfer complete.
ftp: 發(fā)送 1242 字節(jié),用時(shí) 0.00Seconds 1242000.00Kbytes/sec.
ftp> mkdir test
257 "/test" created.
ftp> bye
221 Goodbye.
該文為轉(zhuǎn)載,原文地址:http://hi.baidu.com/xianyang1981/blog/item/f17d6f6d8650c0f842169427.html
一、ftp的port和pasv模式的工作方式
FTP使用2個(gè)TCP端口,首先是建立一個(gè)命令端口(控制端口),然后再產(chǎn)生一個(gè)數(shù)據(jù)端口。國(guó)內(nèi)很多教科書都講ftp使用21命令端口和20數(shù)據(jù)端口,這個(gè)應(yīng)該是教書更新太慢的原因吧。實(shí)際上FTP分為主動(dòng)模式和被動(dòng)模式兩種,ftp工作在主動(dòng)模式使用tcp 21和20兩個(gè)端口,而工作在被動(dòng)模式會(huì)工作在大于1024隨機(jī)端口。FTP最權(quán)威的參考見(jiàn)RFC 959,有興趣的朋友可以仔細(xì)閱讀ftp://nic.merit.edu/documents/rfc/rfc0959.txt的文檔了解FTP詳細(xì)工作模式和命令。目前主流的FTP Server服務(wù)器模式都是同時(shí)支持port和pasv兩種方式,但是為了方便管理安全管理防火墻和設(shè)置ACL了解FTP Server的port和pasv模式是很有必要的。
1.1 ftp port模式(主動(dòng)模式)
主動(dòng)方式的FTP是這樣的:客戶端從一個(gè)任意的非特權(quán)端口N(N>1024)連接到FTP服務(wù)器的命令端口(即tcp 21端口)。緊接著客戶端開(kāi)始監(jiān)聽(tīng)端口N+1,并發(fā)送FTP命令“port N+1”到FTP服務(wù)器。最后服務(wù)器會(huì)從它自己的數(shù)據(jù)端口(20)連接到客戶端指定的數(shù)據(jù)端口(N+1),這樣客戶端就可以和ftp服務(wù)器建立數(shù)據(jù)傳輸通道了。ftp port模式工作流程如下圖所示:

針對(duì)FTP服務(wù)器前面的防火墻來(lái)說(shuō),必須允許以下通訊才能支持主動(dòng)方式FTP:
1、客戶端口>1024端口到FTP服務(wù)器的21端口 (入:客戶端初始化的連接 S<-C)
2、FTP服務(wù)器的21端口到客戶端>1024的端口(出:服務(wù)器響應(yīng)客戶端的控制端口 S->C)
3、FTP服務(wù)器的20端口到客戶端>1024的端口(出:服務(wù)器端初始化數(shù)據(jù)連接到客戶端的數(shù)據(jù)端口 S->C)
4、客戶端>1024端口到FTP服務(wù)器的20端口(入:客戶端發(fā)送ACK響應(yīng)到服務(wù)器的數(shù)據(jù)端口 S<-C)
1.2 ftp pasv模式(被動(dòng)模式)
在被動(dòng)方式FTP中,命令連接和數(shù)據(jù)連接都由客戶端。當(dāng)開(kāi)啟一個(gè)FTP連接時(shí),客戶端打開(kāi)兩個(gè)任意的非特權(quán)本地端口(N > 1024和N+1)。第一個(gè)端口連接服務(wù)器的21端口,但與主動(dòng)方式的FTP不同,客戶端不會(huì)提交PORT命令并允許服務(wù)器來(lái)回連它的數(shù)據(jù)端口,而是提交 PASV命令。這樣做的結(jié)果是服務(wù)器會(huì)開(kāi)啟一個(gè)任意的非特權(quán)端口(P > 1024),并發(fā)送PORT P命令給客戶端。然后客戶端發(fā)起從本地端口N+1到服務(wù)器的端口P的連接用來(lái)傳送數(shù)據(jù)。ftp pasv模式工作流程如下圖所示:

對(duì)于服務(wù)器端的防火墻來(lái)說(shuō),必須允許下面的通訊才能支持被動(dòng)方式的FTP:
1、客戶端>1024端口到服務(wù)器的21端口 (入:客戶端初始化的連接 S<-C)
2、服務(wù)器的21端口到客戶端>1024的端口 (出:服務(wù)器響應(yīng)到客戶端的控制端口的連接 S->C)
3、客戶端>1024端口到服務(wù)器的大于1024端口 (入:客戶端初始化數(shù)據(jù)連接到服務(wù)器指定的任意端口 S<-C)
4、服務(wù)器的大于1024端口到遠(yuǎn)程的大于1024的端口(出:服務(wù)器發(fā)送ACK響應(yīng)和數(shù)據(jù)到客戶端的數(shù)據(jù)端口 S->C)