巷尾的酒吧

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  64 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

2014年5月22日 #

返回上次访问目录,在命令行输入:
cd -
posted @ 2014-05-22 16:21 abing 阅读(204) | 评论 (0)编辑 收藏

2013年12月20日 #

一、Java基础知识
1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。
2.字符串的操作:
  写一个方法,实现字符串的反转,如:输入abc,输出cba
  写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。
3.数据类型之间的转换
  如何将数值型字符转换为数字(Integer,Double)
  如何将数字转换为字符
  如何取小数点前两位,并四舍五入。
4.日期和时间
  如何取得年月日,小时分秒
  如何取得从1970年到现在的毫秒数
  如何获取某个日期是当月的最后一天
  如何格式化日期
5.数组和集合
6.文件和目录(I/O)操作
  如何列出某个目录下的所有文件
  如何列出某个目录下的所有子目录
  判断一个文件或目录是否存在
  如何读写文件
7.Java多态的实现(继承、重载、覆盖)
8.编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。
9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。
10.找出下列代码可能存在的错误,并说明原因:



一、问答题

1、面向对象的特征有哪些方面?
2、abstract class和interface有什么区别?
3、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
4、JSP的内置对象有哪些?
5、MVC模式的工作原理?
6、HashMap和Hashtable的区别?
7、String 和StringBuffer的区别?
8、说出Servlet的生命周期,并说出Servlet和CGI的区别
9、简述SSH概念及原理?
10、概述存储过程的优点和缺点及怎么优化存储过程?
二、查错题
1、abstract class Name {
private String name;
public abstract boolean isStupidName(String name) {}
}
2、public class Something {
void doSomething () {
private String s = “”;
int l = s.length();
}}
3.、abstract class Something {
private abstract String doSomething ();
}
4、public class Something {
public int addOne(final int x) {
return ++x;
} }

5、public class Something {
public static void main(String[] args) {
Something s = new Something();
System.out.println(“s.doSomething() returns ” +doSomething());
}

public String doSomething() {
return “Do something …”;
}
}
三、设计题
1、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序
2、现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
四、编程题
1、写一个Singleton出来
2、字符串的操作:
写一个方法,实现字符串的反转,如:输入abc,输出cba
写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。
五、逻辑思维分析题
1、一个小偷被警察发现。警察就追小偷,小偷就跑,跑着跑着,前面出现一条河,这河宽12米,河在小偷和警察这面有棵树,树高12米,书上叶子都光了。小偷围着个围脖长6米,请问小偷如何过河跑?
2、烧一根不均匀的绳子要用一个小时,如何用它来判断半个小时?烧一根不均匀的绳,从头烧到尾总共要一个小时,现在有若干条材质相同的绳子,问如何用烧绳子的方法计时一个小时十五分钟呢?
六、综合题
1、请用不超过30个字给出一个最能让我们录用你的理由
2、如果我们录用你,你将怎样去开展工作
3、当你与上级意见不一致的时,你将怎么办
4、你对于开发这一职位加班有什么看法









posted @ 2013-12-20 14:35 abing 阅读(180) | 评论 (0)编辑 收藏

2013年11月25日 #

二叉树算法资料收集:
http://blog.sina.com.cn/s/blog_ba46b52b0101i6mj.html

http://blog.sina.com.cn/s/blog_70600f720100ujnp.html

http://blog.csdn.net/kiritor/article/details/8892648 
 
http://iask.sina.com.cn/b/9950186.html
http://blog.csdn.net/kangojian/article/details/3990212

http://blog.csdn.net/kangojian/article/details/3990206

http://wenwen.soso.com/z/q69052983.htm
http://justsee.iteye.com/blog/1097176


平衡二叉树:
http://blog.csdn.net/zxman660/article/details/7940190



二叉树的深度:
http://blog.163.com/xiaopengyan_109/blog/static/14983217320108168618624/


二叉树删除:
http://www.cnblogs.com/xunmengyoufeng/archive/2012/10/01/BityTree.html
http://marcospring.iteye.com/blog/1623571
http://www.cnblogs.com/KeenLeung/archive/2012/11/03/2750545.html


二叉树查找节点:
http://www.cnblogs.com/KeenLeung/archive/2012/11/03/2750545.html
















posted @ 2013-11-25 21:28 abing 阅读(191) | 评论 (0)编辑 收藏

2013年11月9日 #

原文地址:http://apmblog.compuware.com/2011/05/11/how-garbage-collection-differs-in-the-three-big-jvms/

========================================================================================

 

Hotspot JVM使用和 IBM Websphere OracleWeblogic不同的垃圾回收机制,但是垃圾回收的概念和算法是相通的。

 

HotSpotJVM

 

1HotSpotJVM使用内存分区(如永久perm区和分代Generation Heap区),分代区(Generation Heap)又包括新生Yong老生Old/Tenured区,Yong区中又分为Eden Survior区(2块);


2Yong GC:对象先在Yong区的Eden中得到分配,任何时候Eden区满了就会触发YongGC (Minor GC?),会把YongEden中仍存活的Live对象拷贝到空的那个Survior区,除此之外,另外一个Survior区中的对象也会被检查和拷贝(在2Survior区之间拷贝对象的频率是可配置的),其结果就是对象仅存在于一个Survior区中,而Eden区和另一块Survior区是空的。这种形式的GC叫“拷贝收集(Copy Collection)”。Yong区中多次GC后仍存活的对象会被提升/拷贝到Old区。

 

3 Old GC:标记和打扫(Mark & Sweep)算法是老生区(OldHeap)使用的GC算法,与新生代Yong区算法不同的地方在于它不拷贝对象。对象越多GC消耗时间越长,因此老生区GC代价很高并尽量避免,因此我们需要保证对象仅仅从Yong区拷贝到Old区并保证Old区不被填满,因此,代区的大小是Hotspot JVM中单一的一个最重要的优化参数。如果我们不能阻止对象从Yong区拷贝到Old区,我们可以使用“并发标记和打扫算法”(CMS -Concurrent Mark and Sweep),此算法可以并行的进行收集操作。(停顿时间:串行(Serial) <平行(Parallel) <并发(Concurrent))。

 

OldGC还有其他问题,比如“碎片问题”会导致“慢分配”,更长的打扫时间并最终会导致OOM(当分配大对象而遇到的全是小空间时).

 

碎片问题可通过被称为“压缩”的方法来解决。“串行和平行算法(Serialand Parallel)”会在每次Old区进行GC时进行压缩,它不对整个Old区压缩而只对Old区中碎片程度达到一定Level的区域区进行。相比之下,“并发标记和打扫算法CMS”根本就不会进行压缩。当对象不能再被分配时,一个串行的“主要MajorGC”会被触发。

 

因此,HotSpot 的第二个调整参数是选择正确的GC策略,GC策略的选择会影响应用的性能,HotSpot中的大部分GC策略调整选项参数是是关于分片和压缩的, HotspotJVM没有提供太多调整参数,因此,唯一的方法是优化代码减少申请对象的次数。

 

4) Permanent Generation 永久区:保存属于类的(静态的)属性和字符串常量等,永久区的GC只会发生在“主要Major GC”时(Major GC很少发生),因此很多人认为Hotspot JVM在永久区根本不会GC

 

Major GC - Stops the world andcost much time, e.g. Full GC.

 

OracleJRockit

 

1) Oracle WebLogic使用的JVM,将来会和Hotspot合并

 

2) Heap策略 -也使用“分代Heap”,而且支持一个所谓的“连续Heap”。分代Heap分为:老生区(Old/Tenured)和苗圃/新生区(Nursery),当对象被申请时,他们被放在一个新生区中称为Keep Area的地方,GC时,Keep Area不会被考虑而其它仍然存活的对象会被马上移到老生区。因此,新生区的大小是JRockit很重要的参数。JRockit在第二次新生代GC时就会拷贝那些对象到Old区。

 

JRockit的“连续Heap”不区分“新”和“老”的对象,常常在特定的情况下比如以大吞吐量下的批量任务会产生很好的性能,它是JRockit Server JVM模式下的默认设置,而且往往不是正确的选择,因为典型的Web应用不是面向吞吐量而是面向响应时间,因此人们往往会选择低停顿时间模式和分代GC策略。

 

3) CMS -

大部分的CMS标记阶段可分为4个部分

    1. 初始标记 -标记生成Live对象的Root集合 - Java Thread会被paused

    2 并发标记 -根据root集合中的对象查找并标记其引用的Live对象 -- Java Thread正常运行

    3 预清理 -找出“并发标记”发现的需要修改的地方并发现和标记其它额外的Live对象-- Java Thread正常运行
    4 
最终标记-找出在预清理阶段发现的需要改变的地方并发现和标记其它额外的Live对象 -- Java Thread会被Paused

 

CMS 打扫阶段也和 Application并发执行,  但和Hotspot JVM的分2个阶段相比,JRockit会先清扫Heap的第一半部分,在此阶段,线程会被允许在Heap的第二半部分进行对象申请。在一个短暂的同步停顿后,会打扫第二半部分然后会有一个短暂的最后的停顿期。

因此,JRockit的算法比HotSpot的算法停顿更多,但是标记阶段会短一些。而且它不像HotSpot JVM那样可以通过调整未用内存的百分比来触发GC

 

4) 压缩

JRockit 在所有的Old老生区GC进行压缩,包括CMS它通过一种按Heap中分区增量的模式进行的,这些各类参数可以调整,比如按堆百分比压缩,或最大多少对象会被压缩,而且你可以完全把压缩关掉或者在GC时进行“完全压缩”。因此可配置性比HotSpot更强。

 

5) 线程本地分配TLAThread Local Allocation)

JRockit默认使用线程本地分配TLA,这允许线程不需要同步即可分配对象,这将有利于分配速度,TLA的大小而且可以配置,大的TLA可以优化使用大量线程本地分配对象的应用,另一方面,太大的TLA会导致更多的碎片,因为TLA是被线程以排斥的方式独有的,因此受限于线程数并依赖于应用的架构。

 

6) 大对象和小对象

JRockit在分配大对象和小对象时区别对待,大小的定义在JVM的版本不同而不同,常常2-128Kb之间,大对象在线程本地意外的Old区分配,而新生Yong区使用“拷贝收集-Copy Collection (见Hotspot YongGC)”,在某些点,拷贝一个对象变得比它被GC更消耗。

 

7) 没有永久区 -- JRockit JVM没有永久区所有类的属性和字符串常量放在通常的Heap区域,因此如果它不再被使用,会被马上回收。

 

IBM JVM

 

IBM JVM IBMWebsphere使用,它和JRockit有很多相同地方,它默认的使用一个“连续的Heap”,特别是在Websphere安装过程中,这往往是导致最初的低性能的原因。它和JRockit一样区分大小对象,并默认使用线程本地分配TLA它也没有“永久区”,但是IBM JVM也支持分代模型并且看起来更像HotSpot JVM比如它的分代模型包括“新生区”“老生区”,新生区又分为“分配区(Allocate)”Survior区”,新对象在Allocate区分配并在GC时拷贝到Survior区,这意味着一个对象在被移动到Old区时会被在2个区之间多次拷贝.JRockit一样,IBM JVM有多个选项可以配置“压缩”阶段,可以配置为“关闭”或“每次GC都进行压缩”,JRockit相比,默认的触发条件是由于一系列的触发而不是导致“完全”压缩,而且这个可以被配置选项更改。

 

 

Java 7会宣称“G1 - Production Ready,而且G1是不同的。

posted @ 2013-11-09 11:32 abing 阅读(5483) | 评论 (0)编辑 收藏

2013年9月8日 #

数据库系统中事务的ACID原则是什么啊??
事务的原子性、一致性、独立性及持久性
事务的原子性是指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.
事务的一致性是指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
事务的独立性是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
事务的持久性是指事务运行成功以后,就系统的更新是永久的.不会无缘无故的回滚.

spring事务传播属性和隔离级别
1 事务的传播属性(Propagation) 

1) REQUIRED ,这个是默认的属性 
Support a current transaction, create a new one if none exists. 
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 
被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。 
如图所示: 

2) MANDATORY 
Support a current transaction, throw an exception if none exists.支持当前事务,如果当前没有事务,就抛出异常。 

3) NEVER 
Execute non-transactionally, throw an exception if a transaction exists. 
以非事务方式执行,如果当前存在事务,则抛出异常。 

4) NOT_SUPPORTED 
Execute non-transactionally, suspend the current transaction if one exists. 
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

5) REQUIRES_NEW 
Create a new transaction, suspend the current transaction if one exists. 
新建事务,如果当前存在事务,把当前事务挂起。 
如图所示: 

6) SUPPORTS 
Support a current transaction, execute non-transactionally if none exists. 
支持当前事务,如果当前没有事务,就以非事务方式执行。 

7) NESTED 
Execute within a nested transaction if a current transaction exists, behave like PROPAGATION_REQUIRED else. 
支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 
嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。 

8) PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别 
它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。 
使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。 

2 事务的隔离级别(Isolation Level) 

1) 首先说明一下事务并发引起的三种情况 

i. Dirty Reads 脏读 
一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误数据,这样就造成了脏读。

ii. Non-Repeatable Reads 不可重复读 
一个事务多次读取同一数据,在该事务还未结束时,另一个事务也对该数据进行了操作,而且在第一个事务两次次读取之间,第二个事务对数据进行了更新,那么第一个事务前后两次读取到的数据是不同的,这样就造成了不可重复读。

iii. Phantom Reads 幻像读 
第一个数据正在查询符合某一条件的数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻像读。

iv. 非重复度和幻像读的区别 
非重复读是指同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。(A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data. )

幻像读是指同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。(A transaction reexecutes a query returning a set of rows that satisfies a search condition and finds that another committed transaction has inserted additional rows that satisfy the condition. )

表面上看,区别就在于非重复读能看见其他事务提交的修改和删除,而幻像能看见其他事务提交的插入。 

2) DEFAULT (默认) 
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应 

3) READ_UNCOMMITTED (读未提交) 
这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 

4) READ_COMMITTED (读已提交) 
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 

5) REPEATABLE_READ (可重复读) 
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读 

6) SERIALIZABLE(串行化) 
这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 

7) 隔离级别解决事务并行引起的问题 
Dirty reads non-repeatable reads phantom reads 
Serializable 不会 不会 不会 
REPEATABLE READ 不会 不会 会 
READ COMMITTED 不会 会 会 
Read Uncommitted 会 会 会





事务的隔离级别

注:Spring中事务的隔离级别是由数据库实现的


ISOLATION_DEFAULT
    这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读

ISOLATION_READ_COMMITTED
    保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

ISOLATION_REPEATABLE_READ
    这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

ISOLATION_SERIALIZABLE
    这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。

脏读:
    一个事务读取到另一个事务未提交的更新数据。
不可重复读:
    在同一事务中,多次读取同一数据返回的结果有所不同,即后续读取可以读取到另一事务已提交的更新数据;相反,"可重复读"是指在同一事务中多次读取数据时,能够保证所读取的数据是一样,即后续读取不能读到另一事务已提交的数据。
幻读:
    一个事务读取到另一事务已提交的insert数据。 

posted @ 2013-09-08 17:00 abing 阅读(192) | 评论 (0)编辑 收藏

2013年9月3日 #

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Javascript RegExp</title>
</head>
<script type="text/javascript">
function judge(){
 try {
  var parameter;
  var regex='^([0-9]+)$';
  var pp;
  var flag=false;
  parameter=document.getElementById("parameter").value;
  pp=new RegExp(regex,'gi');
  flag=pp.test(parameter);
  document.getElementById("spanId").innerHTML=flag;
 } catch (e) {
  document.write('e.name='+e.name+',e.message='+e.message);
 }
 
}
</script>
<body>
 <div id="div1">
  INPUT:<br/>
  <input id="parameter" type="text" /><br/>
  <input id="button" type="button" onclick="javascript:judge();" value="猛击我"/><br/>
 </div>
 <span id="spanId"></span>
</body>
</html>
posted @ 2013-09-03 21:42 abing 阅读(168) | 评论 (0)编辑 收藏

2013年8月30日 #

下面是目前本人知道的几种jQuery的ready ()的写法.如果还有其他的写法,望告知
1.最常用也是最标准的 
$(document).ready(){ 
}); 
2.是上面的简写: 
$(function(){ 
}) 
3.这个方式:
jQuery(document).ready(function(){ 
}); 
4. 这个方式:
jQuery(function($){ 
alert($("#ready1").html()); 
}); 


posted @ 2013-08-30 14:39 abing 阅读(178) | 评论 (0)编辑 收藏

2013年8月29日 #

使用jquery真的很方便,比如要控制div的显示与隐藏,一句话就搞定了,请看下面使用说明。

$("#id").show()表示display:block,

$("#id").hide()表示display:none;

$("#id").toggle()切换元素的可见状态。如果元素是可见的,切换为隐藏的;如果元素是隐藏的,切换为可见的。

$("#id").css('display','none'); 
$("#id").css('display','block'); 
或 
$("#id")[0].style.display = 'none';

posted @ 2013-08-29 23:47 abing 阅读(351) | 评论 (0)编辑 收藏

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charsetUTF-8">
<title>Jquery Test</title>
<style type="text/css">
.class1 {left: 0px;top: 0px;height: 180px;width: 240px;display: block;background-color: blue;color: black;}
.class2 {left: 0px;top: 300px;height: 100px;width: 240px;display: none;background-color: blue;color: black;}
.spans {left: 0px;top: 300px;height: 100px;width: 240px;display: none;background-color: blue;color: black;}
</style>
</head>
<script type="text/javascript" src="../js/jquery/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
$("#buttonId").click(function(){
var userName=$("input[name='userName']").val();
var passWord=$("input[name='passWord']").val();
if(userName=='abin'&&passWord=='lee'){
$("#div1").hide();
$("#div2").show();
$("#spanId").show();
$("#spanId").html('userName='+userName+",passWord="+passWord);
}else{
$("#div1").toggle();
$("#div2").toggle();
$("#spanId").show();
$("#spanId").html('userName='+userName);
}
});
});
</script>
<body>
<div id="div1" class="class1">
UserName:<br/>
<input id="userId" name="userName" type="text"/><br/>
PassWord:<br/>
<input id="passId" name="passWord" type="text"/><br/>
<input id="buttonId" name="buttonName" type="button" value="猛击我"/>
</div>
<div id="div2" class="class2">
<span id="spanId" class="spans"></span>
</div>
</body>
</html>
posted @ 2013-08-29 23:45 abing 阅读(230) | 评论 (0)编辑 收藏

2013年8月26日 #

【搭建环境】Linux (Fedora 16)

【基本实现】在自己的电脑上搭建ftp,实现同一网段匿名登录,并能上传下载文件。

【涉及技术】vsftpd,iptables

【方法】

1. 先查看自己的机子上是否已安装vsftpd (very secure FTP Daemon),这是linux上常用的ftpd技术,配置方法比较类似配置Apache。命令行输入:

#rpm -qa | grep vsftp

若出现内容,则表示已安装;若无,则手动抓包下载:

# sudo yum install vsftpd

 

2 .启动vsftpd服务。很多教程写的是/etc/init.d/vsftpd start,但是我试了下后发现不行,应该如下输入:

# sudo service vsftpd start

相应的,start 可换成stop,restart等,从字面意思就知道其意思。

查看是否有启动vsftpd:

# pstree | grep vsftpd

若有则表示启动成功。至此,可通过#ftp 主机名/localhost/127.0.0.1 来测试ftp是否正常工作。

 

3. 配置 相关文件。vsftpd.conf 全局配置文件放在/etc/vsftpd/下。为了防止配置错了,先拷贝一份副本,之后进入文档进行编辑。完成后重启ftp即可。

#cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd1.conf

#sudo vim /etc/vsftpd/vsftpd.conf

为了允许匿名登录,则anonymous_enable必须等于YES,其他相应的配置属性简单列表如下:

anonymous_enable=YES              允许匿名登录
Local_enable=YES                       允许本地用户登录
write_enable=YES                        开放本地用户的写权限
dirmessage_enable=YES              当切换到目录时,显示该目录下的.message隐含文件的内容
xferlog_enab1e =YES                   激活上传和下载日志
connect_from_port_20 = YES      启用FTP数据端口的连接请求
xferlog_std_format =YES            使用标准的ftpd xferlog日志格式
pam_service_name=vsftpd           设置认证服务的配置文件名称,该文件存放在/etc/pam.d/
userlist_enable=YES                   激活vsftpd检查userlist_file指定用户是否可以访问vsftpd服务器

 

4. 本机进行测试。在浏览器上输入ftp://localhost或者ftp://127.0.0.1,若搭建成功,则会有相应的文件夹,而这文件夹是默认在/var/ftp/下,当然以后你还可以进行修改。另一个方法是可以直接在命令行输入:

#ftp 127.0.0.1

因为匿名登录,跳过输入用户名和密码后输入:

ftp>user anonymous

再次跳过输入密码,此时会显示登录成功的字样。

 

5. 关闭防火墙。此时去同一网段的主机访问ftp,会发现一直链接不上。暂时了解到的是现在的linux系统为了更好地控制 IP 信息包过滤和防火墙配置,使用了iptables的东西。首先得关闭SElinux,该配置文件在/etc/selinux/下:

#vim /etc/selinux/config

找到相应语句,将其改成:SELINUX=disabled

重启之后,如果发现还不行,则暂时的办法可以关闭整个防火墙(不推荐):

#sudo service iptables stop

到了此步则肯定能从别的主机访问自己搭建的ftp的,只是可能还需要涉及文件夹权限问题,修改之后就能实现文件上传下载了。

完毕。

 

【补充】

若出现vsftpd: refusing to run with writable anonymous root的错误,大概是ftp目录权限问题,修正方法:

chown root:root /var/ftp
chmod 755 /var/ftp

posted @ 2013-08-26 22:31 abing 阅读(267) | 评论 (0)编辑 收藏