﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-wtxtools</title><link>http://www.cppblog.com/wtxtools/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 18:14:12 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 18:14:12 GMT</pubDate><ttl>60</ttl><item><title>J2EE项目10大风险</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/20/15472.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Mon, 20 Nov 2006 12:27:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/20/15472.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/15472.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/20/15472.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/15472.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/15472.html</trackback:ping><description><![CDATA[摘要 <br />当你开始着手组织一个企业级Java项目的时候，就如同开始同时轮回地扔好几个魔术小球： 业主关系处理、持续而漫长的设计开发过程，以及保持健全与完整性，等等。每一个“小球”都会带来其固有的风险，有些显而易见，有些则不易发现。尽管如此，所有这些风险都是完全可以避免的。本文作者Humphrey Sheil分析了威胁到企业级Java项目成功的10大风险， 并一一列出了风险规避的策略方法。 <br /><br />-------------------------------------------------------------------------------- <br /><br />在过去这段时期里，我担任过程序员、高级设计师以及架构设计师等工作，见识过很优秀的企业级Java项目，也见识过不好的，甚至很"丑陋"的项目。有时候我会自己问自己，为什么一个项目可以取得成功，而另一个却走向失败？很难定义出某种规则或标准来表明各个不同的项目应该如何成功，J2EE项目也并不例外。但与此相反的是，我们可以从各个角度和层次上去考察项目失败的原因，如果很好地避开了这些风险，项目就可以取得成功。在本文中，我将提出排名前10位的企业级Java项目风险，供读者参考。 <br /><br />在各种各样的风险中，有些风险只是延缓了项目的进度，有些带来了一些不必要的工作，而另一些则会把成功的可能性彻底地消除。不过，如果预先有了足够的准备和清醒的认识，那么并没有不可避免的事情。这好比如果你是一名旅行者，你清楚地知道前面的道路在什么方向，做了充分的准备，又有一位清楚知道哪里有危险的向导，这样就会比较顺利地到达自己的目的地。 <br /><br />本文采用了以下结构来描述风险：　 <br /><br />风险名称：风险的标题（使用粗体） <br />项目阶段：在哪个项目阶段会发生风险情况 <br />影响阶段：会影响到以后的哪些阶段 <br />症状： 风险产生时的症状 <br />规避方案：如何规避风险或者把其对项目的影响降低到最小程度 <br />备注： 风险相关的补充说明和提示 <br />通过对企业级Java项目的仔细考察，本文将J2EE项目过程分解为以下几个阶段： <br /><br />提供商选择: 在开始你的J2EE项目之前，要选择最合适的提供商，从应用服务器到开发工具组合，一直至工作期间享用的咖啡的厂商。　 <br />设计： 在遵照一系列严格的规范和软件工程方法的前提下，可以开始进行足够充分的设计，然后再很自然地进入开发阶段。在开发之前，要周全地考虑好正在做什么，以及如何往下做的问题。另外，我使用了一些设计模板来确信在进入开发之前，已经想到了所有的问题和可能的解决方案。但是，我有时也在该阶段做一些编码，有时候这样做可以回答一些问题，有效地判断出性能上和模块划分上的问题。　 <br />开发: 也就是程序开发阶段，选择一些好的开发工具，进行精良的设计等等，在这个阶段将显示其优越性，并且可以给开发带来很大的帮助。　 <br />稳定性/负载测试：在该阶段，系统架构师和项目经理应该冻结住产品特性，并把焦点放在质量以及产品参数（允许的并发用户数量，故障恢复情况，等等）上。质量和性能在该阶段应得到足够的重视。当然，最好应该避免在前阶段写出不良的运行缓慢的代码而到本阶段来作很多的修改。 <br />成熟期：这不是一个真正的项目阶段，而是一个固定的准备阶段。过去潜伏的错误（来自于糟糕的设计和开发、错误的厂商选择）可能出现并影响你的系统。 <br /><br />OK，以下让我们进入 top 10 项目风险！ <br />-------------------------------------------------------------------------------- <br /><br />风险1:没有真正理解 Java, EJB, 和J2EE <br /><br />这个问题可以分解为3个部分，以便于分析。 <br /><br />描述: 没有真正理解Java <br /><br />项目阶段:开发 <br /><br />影响阶段：设计、稳定性测试、成熟期 <br /><br />对系统性能的影响：可维护性、可扩展性、性能 <br /><br />症状： <br /><br />重复开发了JDK核心API中的功能或类 <br />不懂得以下列表中的某些项（这只是一些主题或者实际例子而已）： <br />垃圾收集器 (train, generational, incremental, synchronous, asynchronous) <br />对象在何时能被进行垃圾收集 -- dangling references <br />使用的继承机制及其权衡 <br />over-riding和over-loading方法 <br />为什么java.lang.String (在这里用你所中意的类代替) 提供的性能不好 <br />Java中的pass-by参考语义和EJB中pass-by值的语义的比较 <br />使用 == 或者使用equals() 方法 for nonprimitives <br />在不同平台上Java线程的运行顺序方式(例如是否是抢先方式的) <br />新线程和本地线程的比较 <br />Hotspot技术(以及为什么旧的性能调整技术降低了Hotspot 的优化效果) <br />JIT，以及什么时候好的JIT变得不好(未安装的JAVA编译器，以及你的代码运行得刚够良好) <br />API搜集 <br />RMI <br />规避方案： <br />你需要不断改进Java方面的知识，尤其是深入了解Java的优势和不足之处。Java的存在价值已经远不止是一种语言，理解平台(JDK及工具等)也是同样重要的。具体地说，你应该是经过认证的Java程序员，如果你不是的话，也许你有时会为还有那么多不知道的内容而感到惊讶。另外，你可以加入Java的邮件列表。以前我曾加盟过的每一个公司都加入了这样的邮件列表，从同行中学到技术，这将是你最好的资源。 <br /><br />备注: <br />如果你或者你的团队中的成员不真正了解编程语言和平台，怎么还能保持成功的希望呢？强干的Java程序员之于EJB和J2EE，就象是鸭子之于水一样。与此相反，比较弱的、没有经验的程序员只能开发出质量低劣的J2EE应用程序。 <br /><br />描述: 没有真正理解EJB <br /><br />项目阶段: <br />设计 <br /><br />影响阶段: <br />开发、稳定化 <br /><br />对系统的影响: <br />维护 <br /><br />症状: <br /><br />EJB在第一次被调用后没有再被使用到(尤其是stateless session bean) <br />没有重复利用价值的EJB <br />不理解开发者要做什么，容器提供什么 <br />EJB没有依照规范定义(fire线程, 加载了本地库，试图执行I/O，等等) <br />解决方案: <br />要改进关于EJB方面的知识，可以找一个周末来阅读EJB规范 (1.1版有314页)，然后阅读2.0规范(524页!)，这样可以了解到1.1没有定义到的而在2.0规范中补充的内容。EJB开发者从18.1及18.2章节开始阅读是比较合适的。 <br /><br />备注: <br />不要从提供商的角度去看EJB，要确切地知道规范所支持的标准EJB模型和基于这些模型的特殊应用之间的区别。这也会有助于你迁移到别的提供商的时候所用。 <br /><br />描述: 没有真正理解J2EE <br /><br />项目阶段: <br />设计 <br /><br />影响阶段: <br />开发 <br /><br />对系统的影响: <br />维护、扩展性、性能 <br /><br />症状: <br /><br />"Everything is an EJB"的设计方式 <br />用手工事务管理取代了容器-提供的机制 <br />自定义方式的安全处理 -- J2EE平台在企业级计算中，从表示逻辑到后台处理，已具有最完整的集成安全架构；但很少用到其全部功能。 <br />解决方案: <br />学习J2EE的关键组件，并且了解它们的优缺点，依次用它们替代每一个服务；“知识就是力量”在这里是行之有效的。 <br /><br />备注: <br />只有知识能够弥补这些问题。好的Java开发者会成为好的EJB开发者，此后也应逐渐成为J2EE得道高手。Java和J2EE知识掌握得越多，设计和开发工作就会越出色。在设计阶段一切都会有条不紊。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险2: 过度设计(Over-engineering) (采用 EJB或者不采用EJB) <br />项目阶段： <br />设计 <br /><br />影响的项目阶段: <br />开发 <br /><br />对系统的影响: <br />维护、扩展性、性能 <br /><br />症状: <br /><br />过于庞大的EJB <br />开发者无法解释EJB做什么，以及其间的联系 <br />无法重复使用的EJB、组件或者服务 <br />EJB启动了新的事务，而该事务本该由一个已存在的EJB启动 <br />为了安全，把数据分离级别定得太高 <br />解决方案: <br />过度工程化的解决之道直接来自于极限编程 (XP)方法：用最小的设计和编程来满足需求，除此之外别无它干。除非你需要明确知道今后可能的需求，如将来的负载要求，或者系统在最高负载下的表现，否则大可不必为系统将来的情况做太多考虑或猜测。另外，J2EE平台已经定义了可伸缩性及出错恢复等特性，可以让服务器系统为你进行处理。 <br />在最小的系统中，只包含一个个小组件，这些组件只做一件事，只要把这些要求做到的进行实现，系统稳定性就已经得到了提高，而且，你的系统的可维护性会变得很强，在未来要增加功能以满足新的需求也将变得容易。 <br /><br />备注: <br />除了上面所列方案之外，可以推行设计模式 -- 它们可以显著地改进你的系统设计。EJB模型本身也广泛使用了设计模式。例如，每个EJB所带的Home 接口就是Finder和Factory模式的实例。EJB的remote接口扮演了一种实际bean实现的代理，并且对于提供容器的能力也是至关重要的，这些容器截取调用信号并提供诸如透明（transparent）负载均衡的服务。忽视设计模式也是危险的一部分。 <br /><br />我常提到要反对的另外一种危险是：仅仅是为了使用EJB而使用EJB。在你的应用中的某一部分可能并不需要EJB，甚至你的整个应用都不需要。这是过度工程化所走的极端，而且我确实也目睹了一些良好的servlet和JavaBean应用被重构为EJB，而这样做并没有很好的技术上的理由。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险3: 没有将业务规则和逻辑表现形式相分离 <br />项目阶段： <br />设计 <br /><br />影响的项目阶段： <br />开发 <br /><br />对系统的影响: <br />维护、扩展性、性能 <br /><br />症状: <br /><br />过于庞大、没有边际的JSP程序 <br />在业务逻辑改变的时候必须修改JSP <br />在要求改变界面显示的时候需要修改并重新配置EJB和其它后台组件 <br />规避方案: <br />J2EE平台使你有机会将表示逻辑和导航控制相分离，进而与业务规则相分离。这被称为模式2结构。 <br /><br />备注: <br />可以使用具有一致性的设计来进行用户界面框架的连接。(例如可以使用taglib)，这将帮助你避免逻辑分离的问题。有许多现成的好的方法可供选择。对每一个分别进行评估，然后采用最合适的框架。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险4: 没有在开发环境中进行适当的配置 <br />项目阶段： <br />开发 <br /><br />影响的项目阶段: <br />稳定化、并发、成熟期 <br /><br />对系统的影响: <br />你的权衡 <br /><br />症状: <br /><br />经过多日或数周的时间才能过渡到成熟系统 <br />风险存在与过渡期，带有很多不确定性，有些主要的功能场景没有被测试到 <br />实际系统中的数据和开发、测试中的数据不同 <br />无法在开发者机器上进行组建 <br />应用行为在开发、稳定化及产品环境中各不相同 <br />规避方案: <br />解决之道是忠实地在开发环境中配置实际的环境，让开发所用环境接近于要实施产品的环境。如果未来环境是JDK 1.2.2及Solaris 7，那么不要在JDK 1.3及Red Hat Linux上进行开发。对于所用的应用服务器也是如此。同样，要快速地看一下产品数据库中的数据，并将这样的数据用于测试。不要依赖于人工创建的数据。如果产品数据很敏感，则要使之变得不敏感，然后把它配置起来。开发中未能预期到的产品数据将对以下过程产生破坏： <br /><br />数据检验规则 <br />系统测试行为 <br />系统组件构建(特别地包括：EJB-EJB以及EJB-数据库) <br />最为糟糕的是，这样还可能产生异常、空指针，以及你从没见过的问题。 <br /><br />备注: <br />开发人员常把安全性问题放到稳定化阶段才开始解决。要防止这样的陷阱产生，你也可以花费同样多的时间在业务逻辑中改进安全性。 <br /><br />成熟期是一个复杂的过程，其中充满了技术性问题和非技术性问题。你可能会陷于想不到的一大堆问题中，这就是成熟化所意味的一切。开发及稳定化环境过程为你提供了制造更多这样的问题，以及发现这样的问题的地方，不断去做，就可以大大减少风险。 <br /><br />你做的工程越多，你就越能了解什么是可行的，什么是不可行的。你可以对工程问题进行记录，以避免同样的错误重复发生。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险5: 选择了错误的提供商 <br />项目阶段： <br />提供商选择 <br /><br />影响阶段： <br />设计、开发、稳定化/负载测试，成熟化 <br /><br />对系统的影响: <br />可伸缩性、性能、可维护性及稳定性 <br /><br />症状: <br /><br /><br />开发人员要使用更多的时间来处理工具方面的问题，而不是很有成效地使用这些工具 <br />为了应付已知的和未知的问题，而不得不进行显著的系统重新设计 <br />在不同的工具之间很难进行集成（应用服务器与IDE工具，IDE工具与调试器，源码控制与合成工具，等等） <br />对于IDE工具和调试器等，开发人员往往排斥它们，而推崇自己所喜欢的工具 <br />规避方案: <br />为了避免风险5，你需要一个很好的提供商选择过程，风险10的规避也适用于此。 <br /><br />要真正衡量一种IDE工具是否最合适的方法是真正地进行使用。而唯一来评估一种J2EE应用的方法是建立一种概念试验来进行证明，在试验中要包含你的应用框架。事实上，你也不希望在花费了3个月时间进行了培训和开发后，在使用时又发现一些bug。 <br /><br />假设在开发到一半的时候，突然发现你的工具集有问题，那么你早应该知道，有些工具确实比另一些更重要。如果你所选的应用服务器不能充分满足你的需要，你只好修改原先的设定。如果IDE不好，则需要设置最低限度的代码标准，并让开发人员任意选择他们认为最为有效的工具。 <br /><br />备注: <br />要真正了解到哪一个供应商对一项特殊的任务来说最合适，其实并不是一件一次性决定的事情。你需要不断地跟踪与评估这个市场。例如，在过去的一年里我用过4种不同的IDE工具，这取决于我使用了什么样的应用服务器、平台，是否使用EJB等。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险6: 不了解你的提供商 <br />项目阶段： <br />提供商选择 <br /><br />影响阶段: <br />提供商选择阶段后面的所有阶段：设计、开发、稳定化/负载测试、成熟化 <br /><br />对系统的影响: <br />可维护性、可伸缩性、性能 <br /><br />症状: <br /><br />开发所用周期超过了最坏预测的周期1/3以上 <br />提供商已经提供了某项功能，但开发者在不知道的情况下重新进行了该项功能的开发 <br />规避方案: <br />为了规避这样的风险，你可以尽可能地订阅提供商的网上资源，例如邮件列表、新闻组、版本信息（尤其是其中的bug修复补丁的说明等），你能从中得到无法估量之多的收获。 <br /><br />一旦你已经选定了提供商，那么立即就要投资进行培训，并且尽可能赶在项目启动以前。然后，逐渐在团队中建立起对此提供商的认识及信任。试着建立几个EJB并部署一下，再用你的表示层技术 (Swing GUI, JSP等)来调用它们。如果你既要搭建开发环境，又要同时在实现项目目标，就会产生一些不必要的冲突。实际上，我也见到过一直没有进行构建过程的情况：“我们没有时间。”因此，这些工作必须提早进行。有些人会说：“我们的计划中没有为我们提供这些时间。”我的回答是：“你的计划中并没有不给你时间使你不这么做啊。” <br /><br />备注: <br />在J2EE世界里，各提供商产品的技术兼容性究竟如何？让我们看一下IBM和BEA的具体分析吧。两者都分别在各自的应用服务器中支持EJB 1.1。那么，实际上BEA WebLogic 5.1和IBM WebSphere 3.5究竟有多少相似之处呢? <br /><br />BEA WebLogic和IBM WebSphere的系统配置和管理方式几乎完全不同。 <br />IBM在WebSphere中采用了全面的GUI环境，而与之相对的是，BEA 在WebLogic中提供一整套命令行。 <br />IBM WebSphere使用IIOP来和CORBA异常进行通讯，这些异常对程序员来说是可见的；WebLogic根本没有CORBA构造，而缺省使用t3协议。 <br />WebSphere和Visual Age衔接紧密，而WebLogic是IDE无关的，实际上，你几乎可以使用任何的开发工具。 <br />由此可见，差异还是相当多。如果你是一种应用服务器的专家，并不意味着你就是所有应用服务器的专家。这种区别体现在IDE，debugger，build工具，配置管理等等方面。具备某提供商的某项特殊工具的使用经验，可以在评估该提供商的竞争对手产品时具有一些便利。但是，不要奢望在不同产品之间进行无缝的转移或衔接。因此，你不得不花费足够多的时间在熟练掌握这些工具上。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险7: 设计中没有充分考虑到可伸缩性和产品性能 <br />项目阶段： <br />设计 <br /><br />受影响的项目阶段: <br />开发、负载测试及成熟化 <br /><br />对系统的影响: <br />可伸缩性、性能、可维护性 <br /><br />症状: <br /><br />无法忍受的速度缓慢 <br />系统给服务器端增加的沉重负担，而无法利用到一些聚簇技术。 <br />规避方案: <br />把精力集中于性能和可伸缩性方面的需求，明确开发中要达到的性能指标。如果你需要每秒50个事务，而你的EJB设计只能提供40个，那么你就需要考虑替代方案，诸如存储过程，批处理，或者重新考虑OLTP的设计。 <br /><br />尽可能让你的提供商加入进来，他们应该非常清楚其产品的强项和弱处在哪里，然后给你提供最直接的帮助。 <br /><br />备注: <br />本风险与风险2 (over-engineering)似乎有些冲突。实际上，两者相互影响。 我对风险2给出的解决方案是，只在绝对必要的情况下才进行构建。而对与性能和可伸缩性，你要预先划分好什么是必须要做的。 <br /><br />如果你实现就识别出系统需要非常强的可伸缩性，并把它作为一个比较关键的需求，那么你首先需要选择一个带有很强的簇支持及事务型缓存的应用服务器。另外，你应把业务对象设计为EJB，从而可以充分利用服务器架构的优势。 XP也没有问题，你仍然是只做绝对必要的工作。 <br /><br />我把这样的观点看作是一种检查和平衡的方法。我们只需要最简单可能性的系统，该系统只提供客户所需要的功能与行为即可。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险8: 陈旧的开发过程 <br />项目阶段： <br />开发 <br /><br />影响阶段: <br />稳定化，成熟化 <br /><br />对系统的影响: <br />可维护性、代码质量 <br /><br />症状: <br /><br />项目计划看上去似乎类似于瀑布模型: “首先草构设计，然后在一个很长的周期里进行开发。” <br />由于不存在构建（build）过程，每次构建都象是噩梦 <br />构建的日期等于损失开发的日期，因为什么也没有做成 <br />在集成以前组件没有分别被充分地测试过，而集成测试意味着将2个不稳定的组件放在一起，然后查看堆栈里的跟踪结果。 <br />规避方案: <br />好的软件方法学将提高你的软件生命期。此前我已经提到XP方法，你可以在网上找到很多这方面的资料。 <br /><br />备注: <br />JUnit可以用来进行单元测试，Ant工具可以进行编译与构建，这2种工具都对XP方法有很好的支持。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险9: 没有好的架构方式 <br />项目阶段： <br />开发 <br /><br />影响阶段: <br />开发、稳定化、成熟期 <br /><br />对系统的影响： <br />可维护性、可伸缩性、代码质量 <br /><br />症状: <br /><br />在代码中使用了很多次的核心库中发现Bug。 <br />没有建立日志标准 -- 于是系统的输出很难读取或者解析。 <br />不良的不一致的异常处理。在有些站点中我们甚至可以看到，出错信息直接暴露给了最终用户，例如在用户在他的购物车核帐时发送一条SQLException堆栈跟踪信息，用户接着会怎么做？打电话给数据库管理员要求对primary key约束进行修补吗？ <br />以下任务已经被开发者以各种方式处理了无数次了，这些都有必要放在任何构架设计的第一批目标中。　 <br /><br />日志 <br />异常处理 <br />与资源的连接(数据库，名字服务等) <br />构建JSP页 <br />数据合法性检查 <br />规避方案: <br />我是一个轻方法学的信徒和实践者。我在JavaWorld 上的第一篇文章 -- "Frameworks Save the Day" -- 就是研讨在企业Java环境中的架构。即使你已经开始开发了，此时考虑一下架构仍然是值得的。可能你不得不忍受一下重构带来的异常处理和日志处理，但从长远来看还是值得的，这样即省时间又省钱。 <br /><br />备注: <br />让我们想一下在构架中基于组件开发的可重用性的不同等级。第一级别是plumbing，具有0.9以上的可重用比例，也就是说，有90%的项目可以对它重复利用。 服务定义得越详细，重用比例就越低。换句话说，我需要构建一个会计服务，但要提供这些资源与用法的管理，以便于其它50%项目中可以对它们进行重复利用。但是对那些项目来说，能得到这些资源，那真是太好了！ <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />风险10: 项目计划和设计基于市场效应，而脱离了技术现实 <br /><br />备注: 不断有新人加入到Java/EJB的开发领域中来，不理解Java的人数一般比想象中还要多。 <br /><br />项目阶段： <br />所有阶段都会受到影响，包括提供商的选择 <br /><br />影响阶段: <br />所有阶段都会受到影响 <br /><br />对系统的影响: <br />可维护性、可扩展性、设计质量、代码质量 <br /><br />症状: <br /><br />轻率地进行技术决策，认为EJB只是为了便携式处理的方便 <br />选择提供商的时候没有随即进行产品的试用 <br />在项目的生命周期内还需要更换工具 <br />规避方案: <br />不要轻易相信项目外部的任何人的看法，这些人可能已经有一些既得利益，不要相信提供商的说法（除非你早已经了解），也不要相信白皮书。如果你要取得来自真实世界的关于应用服务器的建议，可以在网上取得。你还可以下载这些工具进行评估，用它们做一些原型，并运行一下其中的样例。(好的提供商都有这样的样例)。 <br /><br />总的来说，为你的项目选择最好的提供商及工具需要时间，而你可能没有太多的时间。你可以把选择范围限制在3-4个对象，然后用一周时间进行比较和检验。最后从中选出比较满意的工具和产品。 <br /><br />备注: <br />如果你缺少J2EE经验，则可能会在项目前期就产生问题。在前期所确定的决策会影响整个过程，并进而影响项目的成功。好的J2EE咨询专家将能够帮助你选择好的提供商，并为设计和开发刻划出一个好的构形。 <br /><br /><br />-------------------------------------------------------------------------------- <br /><br />仅仅只有这10项风险吗？ <br /><br />10只是一个特定的数字，显然，还有更多更多的风险会存在。只是我可以保证的是，如果你克服了所列的各项风险，那么你的项目会有出色的表现并已打好了成功的基础。 <br /><br />还有一项需要注意，即没有任何东西可以代替经验和计划。如果你没有经验，那么一定要想办法取得并积累。千万不要一边做项目一边进行培训。在开发之前要预先做好充分的准备，最好是在设计以前就进行准备。可以让你的团队接受Java/J2EE顾问的指导，并确保这样的指导能够传递到整个其他的团队成员。 <br /><br />最后，还有必要提到以下几点： <br /><br />软件工程的外界影响 <br />什么时候进行单元测试，什么时候进行集成测试？ <br />设计模式 <br />异常处理 <br />结论 <br />总的说来，以上10大风险是你在企业级Java项目开发过程中将面对的主要困难。我也相信在你的旅程中一定还有更多的陷阱，但我比较确信的是我所提到的风险已经涵盖了主要的问题。最后让我们按照优先级重新列举一下10大风险：　 <br /><br />没有真正理解Java, 没有真正理解EJB, 没有真正理解J2EE <br />过度设计(Over-engineering) <br />没有将业务规则和逻辑表现形式相分离 <br />没有在开发环境中进行适当的配置 <br />选择了错误的提供商 <br />不了解你的提供商 <br />设计中没有充分考虑到可伸缩性和产品性能 <br />陈旧的开发过程 <br />没有好的架构方式 <br />项目计划和设计基于市场效应，而脱离了技术现实 <br />最后，让我祝你好运！  <br /><img src ="http://www.cppblog.com/wtxtools/aggbug/15472.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-20 20:27 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/20/15472.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随便写了几个方法(转自 我心依旧blog)</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/20/15471.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Mon, 20 Nov 2006 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/20/15471.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/15471.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/20/15471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/15471.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/15471.html</trackback:ping><description><![CDATA[package net;<br /><br /> <br /><br />import java.sql.Connection;<br /><br />import java.sql.Date;<br /><br />import java.sql.ResultSet;<br /><br />import java.sql.SQLException;<br /><br />import java.sql.Statement;<br /><br />import java.util.ArrayList;<br /><br />import java.util.Calendar;<br /><br />import java.util.Iterator;<br /><br />import java.util.Locale;<br /><br /> <br /><br />import javax.naming.InitialContext;<br /><br />import javax.naming.NamingException;<br /><br />import javax.sql.DataSource;<br /><br />/**<br /><br /> * @author 张宏亮<br /><br /> * @Date 2006-3-1<br /><br /> * version 1.0<br /><br /> * explain 通用方法的封装类<br /><br /> * Email it5719@163.com<br /><br /> */<br /><br />public class ActionUtil { <br /><br />       /**<br /><br />     * 截取中文字符串的方法<br /><br />     * @param str 要截取的字符串,bytes截取之后每个串的字节数<br /><br />     * @return 包含截串的结果的ArrayList<br /><br />     * @throws Exception 截取汉字异常<br /><br />     */<br /><br />       public static ArrayList splitString(String str,int bytes) throws Exception{<br /><br />              ArrayList array = new ArrayList();<br /><br />              try {<br /><br />                     String splitStr = str;<br /><br />                     int splitByte = bytes;<br /><br />                     int loopCount = 0;<br /><br />                     loopCount = (splitStr.length()%splitByte==0)?(splitStr.length()/splitByte):(splitStr.length()/splitByte+1);<br /><br />                     //System.out.println("字符串的长度是"+splitStr.length()+",要截取成"+loopCount+"段,因为每段需要截取"+splitByte+"字节!"); <br /><br />                     for(int i=1;i&lt;=loopCount;i++) {<br /><br />                            if(i==loopCount)<br /><br />                                   array.add(splitStr.substring((i-1)*splitByte,splitStr.length()));<br /><br />                            else<br /><br />                                   array.add(splitStr.substring((i-1)*splitByte,(i*splitByte)));<br /><br />                     }<br /><br />                     Iterator it = array.iterator();<br /><br />                     while(it.hasNext()){<br /><br />                            System.out.println(it.next());<br /><br />                     }<br /><br />              } catch (RuntimeException e) {<br /><br />                     e.printStackTrace();<br /><br />                     throw new Exception("截取汉字发生异常");<br /><br />              }<br /><br />              return array;<br /><br />       }<br /><br />       /**<br /><br />     * 测试池连接的方法<br /><br />     * @param name 连接池的名字在TOMCAT中配置,sql 要发送的SQL语句<br /><br />     * @return void<br /><br />     * @throws Exception 数据库连接异常,NamingException JNDI初始化异常<br /><br />     */<br /><br />       public static void poolConnection(String name,String sql) {<br /><br />               Connection con = null;<br /><br />               Statement stmt = null;<br /><br />               try {<br /><br />                        InitialContext ctx = new InitialContext();<br /><br />                        DataSource ds = (DataSource)ctx.lookup(name);<br /><br />                        con = ds.getConnection();<br /><br />                        stmt = con.createStatement();<br /><br />                        ResultSet rs = stmt.executeQuery(sql);<br /><br />                        while(rs.next()) {<br /><br />                             System.out.print(rs.getString(1));<br /><br />                             System.out.print(rs.getString(2));<br /><br />                             System.out.print(rs.getString(3));<br /><br />                        }<br /><br />               } catch (NamingException e) {<br /><br />                     System.out.println("JNDI初始化异常");<br /><br />                     e.printStackTrace();<br /><br />               } catch (SQLException e) {<br /><br />                     System.out.println("数据库连接异常");<br /><br />                     e.printStackTrace();<br /><br />               }<br /><br />               finally {<br /><br />                     try {<br /><br />                            stmt.close();<br /><br />                            con.close();<br /><br />                     } catch (SQLException e) {<br /><br />                            System.out.println("关闭连接池异常");<br /><br />                            e.printStackTrace();<br /><br />                     }<br /><br />               }<br /><br />       }<br /><br />    /**<br /><br />     * 输入身份证号码返回年龄<br /><br />     * @param id 身份证号码<br /><br />     * @return 年龄<br /><br />     * @throws Exception 身份证号码不正确（长度不够）<br /><br />     */<br /><br />    public static int getAge(String id) throws Exception {<br /><br />        int age = -1;<br /><br />        int length = id.length();<br /><br />        String birthday = "";<br /><br />        if (length == 15) {<br /><br />            birthday = id.substring(6, 8);<br /><br />            birthday = "19" + birthday;<br /><br />        } else if (length == 18)<br /><br />            birthday = id.substring(6, 10);<br /><br />        else<br /><br />            throw new Exception("错误的身份证号");<br /><br />        int currentYear = Calendar.getInstance().get(1);<br /><br />        age = currentYear - (new Integer(birthday)).intValue();<br /><br />        System.out.println("您的身份证号码是"+id+",您的年龄是"+age);<br /><br />        return age;<br /><br />    }<br /><br />    /**<br /><br />     * 获得当前日期字符串<br /><br />     * @return 日期字符串<br /><br />     */<br /><br />    public static String getCurrentDate() {<br /><br />        Calendar cal = Calendar.getInstance();<br /><br />        String currentDate = null;<br /><br />        java.util.Date d = cal.getTime();<br /><br />        String currentYear = (new Integer(cal.get(1))).toString();<br /><br />        String currentMonth = null;<br /><br />        String currentDay = null;<br /><br />        if (cal.get(2) &lt; 9)<br /><br />            currentMonth = "0" + (new Integer(cal.get(2) + 1)).toString();<br /><br />        else<br /><br />            currentMonth = (new Integer(cal.get(2) + 1)).toString();<br /><br />        if (cal.get(5) &lt; 10)<br /><br />            currentDay = "0" + (new Integer(cal.get(5))).toString();<br /><br />        else<br /><br />            currentDay = (new Integer(cal.get(5))).toString();<br /><br />        currentDate = currentYear + currentMonth + currentDay;<br /><br />        System.out.println(currentDate);<br /><br />        return currentDate;<br /><br />    }<br /><br />    <br /><br />       public static void main(String[] args) {<br /><br />              try {<br /><br />                     getCurrentDate();<br /><br />                     getAge("220103198601211017");<br /><br />                     //因为池连方法需要数据源,所以在着就不测试了<br /><br />                     splitString("《2005年国民经济和社会发展统计公报》",3);<br /><br />              } catch (Exception e) {<br /><br />                     e.printStackTrace();<br /><br />                     System.out.println("测试发生异常");<br /><br />              }<br /><br />       }<br /><br />} <br /><img src ="http://www.cppblog.com/wtxtools/aggbug/15471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-20 20:23 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/20/15471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>汉诺塔</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14810.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 11:31:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14810.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14810.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14810.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14810.html</trackback:ping><description><![CDATA[
		<font face="Courier New">/*<br /> Name: 汉诺塔 <br /> Copyright: tarena<br /> Author: 王钟沛 <br /> Date: 07-11-06 19:12<br /> Description: 是原来写的。直接复制了一下，还是没用数组写出来T_T <br />*/<br />#include &lt;iostream&gt;<br />using namespace std;<br />                                                                                                            <br />void move (int ,int=1 ,int=2 ,int=3 );//初始柱子编号<br />int main ()<br />{<br />     int number;<br />     cout &lt;&lt; "请输入第一个塔上有多少个盘子(初始值): ";<br />     cin &gt;&gt; number;<br />     move (number);<br />     system("PAUSE");<br />     return 0;<br />}<br />                                                                                                            <br />void move (int n,int fst,int sec,int thr)<br />{<br />      if(n!=0)<br />              {<br />                      move( n-1,fst,thr,sec);   //反复颠倒交换用柱子<br />                      cout &lt;&lt; "移动"&lt;&lt;n&lt;&lt;"号盘从 " &lt;&lt;fst&lt;&lt;  "号塔到 " &lt;&lt;thr&lt;&lt; "号塔"&lt;&lt;endl; //输出移动方向<br />                      move( n-1,sec,fst,thr);   //反复交换柱子<br />              }<br />      else<br />              return;<br />                                                                                                            <br />}</font>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 19:31 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反转字符串</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14809.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 11:29:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14809.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14809.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14809.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14809.html</trackback:ping><description><![CDATA[
		<p>/*<br />  Name: 反转字符串 <br />  Copyright: tarena<br />  Author: 王钟沛 <br />  Date: 07-11-06 19:09<br />  Description: 输入一串字符，对其进行反转 <br />*/<br />#include &lt;iostream&gt;<br />using namespace std;</p>
		<p>void rollback( char *ch )<br />{<br /> int length = strlen( ch );<br /> for( int i=0; i&lt;length/2; i++ )<br /> {<br />  char temp=ch[i];<br />  ch[i] = ch[length-1-i];<br />  ch[length-1-i] = temp;<br /> }<br />}<br />int main()<br />{<br /> char ch[255];<br /> cout &lt;&lt; "请输入一串字符：" ;<br /> cin &gt;&gt; ch;<br /> rollback( ch );<br /> cout &lt;&lt; ch &lt;&lt; endl;<br /> system("PAUSE");<br /> return 0;<br />}</p>
		<p> </p>
		<p> </p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 19:29 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排序函数（递归选择法）</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14790.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 07:54:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14790.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14790.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14790.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14790.html</trackback:ping><description><![CDATA[
		<p>/*<br />  Name: 排序函数（递归选择法）<br />  Copyright: tarena<br />  Author: 王钟沛 <br />  Date: 07-11-06 14:58<br />  Description:对一个整型数组中的n个数进行排序（升序） <br />*/<br />#include &lt;iostream&gt;<br />using namespace std;<br />#include &lt;algorithm&gt; //swap函数所需要的头文件 </p>
		<p>void mysort(int *p,int n)//对数组p中的前n个元素进行排序 <br />{<br />     if(n&lt;=1) return ;//递归出口 ,如果只有一个元素，就不用排序了 <br />     int max_number=0,max_index=0;//分别用来记录最大值和最大值所在位置的索引 <br />     for (int i=0 ; i&lt;n ; i++)<br />     {<br />         if(max_number&lt;p[i])//保存最大值的相关信息 <br />         {<br />            max_number = p[i];<br />            max_index = i;<br />         }<br />     }<br />     if(max_number!=p[n-1])<br />       swap(p[max_index],p[n-1]);//调用了swap()函数，把最大的数交换到数组当前最后一位 <br />     mysort(p,n-1);//递归调用，对n-1个元素进行排序 <br />}<br />int main()<br />{<br />    int index=0,number=0;<br />    int *arrary=NULL; //用与动态创建数组，没学过的同学可以定义一个比较大的数组 <br />    cout &lt;&lt; "请输入数组中有多少个元素:" &lt;&lt; endl;<br />    cin &gt;&gt; index;<br />    cout &lt;&lt; "请输入要对前多少个元素进行排序:" &lt;&lt; endl;<br />    cin &gt;&gt; number;<br />    if ( number &gt; index )//防止越界，保证要排序的元素个数小于或者等于数组长度 <br />    {<br />       cout &lt;&lt; "越界！请检查您的输入" &lt;&lt; endl;<br />       return 0;<br />    } //下面这么做有点不规范。应该申请动态数组的时候用一个常量作为长度 <br />    arrary = new int [index]; //动态申请一个index大小的内存空间 <br />    for( int i=0;i&lt;index;i++)<br />    {<br />         cout &lt;&lt; "请输入第" &lt;&lt; i+1 &lt;&lt; "个元素的值:";<br />         cin &gt;&gt; arrary[i];<br />    } <br />    mysort(arrary,number); <br />    cout &lt;&lt; "排序后的结果为：" &lt;&lt; endl; <br />    for ( int i=0;i&lt;number;i++)<br />    cout &lt;&lt; arrary[i] &lt;&lt; ' ';<br />    cout &lt;&lt; endl;<br />    system("PAUSE");//dev_c++的暂停输出语句，cfree不需要 <br />    return 0;<br />}<br /></p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 15:54 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle里面创建用户</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14782.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14782.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14782.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14782.html</trackback:ping><description><![CDATA[
		<p>SQL&gt; create user 用户名 identified by 密码<br />2 grant create user,drop user,alter user,create any view,drop any view,exp_full_database,imp_full<br />_database,dba,connet,resource,create session to 用户名<br />3 commit<br />4 </p>
		<p>
				<br />我的实验结果：</p>
		<p>SQL&gt; create user wtxtools<br />  2  identified by wtxtools;<br />User created.</p>
		<p>SQL&gt; grant create user,drop user,alter user,create any view,drop any view,exp_full_database,imp_full_database,dba,resource,create session to wtxtools;</p>
		<p>Grant succeeded.</p>
		<p>SQL&gt; commit;<br /> Commit complete.</p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 10:56 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse3.2+Tomcat5.5.17+Oracle9配置</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14781.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14781.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14781.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14781.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14781.html</trackback:ping><description><![CDATA[
		<p>Eclipse3.2+Tomcat5.5.17+Oracle9配置</p>
		<p>
				<br />Java的Web开发环境布置向来很烦琐，还记得在做本科毕业设计时配置JBuilder2005+Weblogic8.1+SQL2k整合环境时的痛苦经历，近来整合配置Eclipse3.2+Tomcat5.5.17+Oracle9i环境又累了N小时，这可不得不怪B/S结构的“苦了开发者，方便千万用户”舍己为人精神，以及各种工具版本纷杂带来的不便与不少不负责任网友的胡乱指引。下面小弟把自己的成功经验向大家汇报，希望有需要的友人能少走弯路。具体步骤如下： </p>
		<p>　　1.安装Java开发环境Eclipse3.2，安装Oracle9i数据库</p>
		<p>　　首先安装SUN的JDK1.4以上版本的Java基础开发环境，配置Java系统变量（这个太基础，不具体展开了）。接着下载解压安装Eclipse3.2开发环境，根据个人需要安装语言包、MyEclipse等插件扩充功能（也可以先不安装）。</p>
		<p>　　安装Oracle9i数据库，创建测试数据库：NBZJU与DBA：LUHAO/11111，建立表空间：LUHAO和测试表：USER_INF。其中USER_INF表具有USER_ID、USER_NAME、USER_TEL字段属性，并添如若干测试记录。</p>
		<p>　　2.安装Tomcat及其插件</p>
		<p>　　下载并解压Tomcat启动插件tomcatPluginV31.zip，将其下目录文件拷入eclipse\plugins目录下（这步若成功执行，eclipse运行后将发现多了Tomcat菜单项及其启动、停止、重启等快捷按钮。若看不到，可能通过删除eclipse\configuration目录下除config.ini外所有文件，再重启eclipse来解决）。</p>
		<p>　　下载Tomcat标准程序apache-tomcat-5.5.17.zip和admin控制台程序apache-tomcat-5.5.17-admin.zip（将后者解压入前者的解压目录下可以获得登陆admin图形管理界面的功能，这将方便后面的数据源配置，不用直接在server.xml中自己输入参数，即通过图形界面配置生成相应的标准XML参数。否则手动输入参考来的配置容易出错，因为不同版本tomcat的XML标记语法解析不同，例如5.1版的参数放入5.5版是无效的。因此，强烈建议用图形界面配置数据源！）</p>
		<p>　　配置系统变量“TOMCAT_HOME”，其值为关联到apache-tomcat-5.5.17目录的路径。打开apache-tomcat-5.5.17\conf\tomcat-users.xml文件，在＜tomcat-users＞＜/tomcat-users＞标记元素中加入：＜user username="luhao" password="12345" roles="admin,manager"/＞，即加入角色身份为admin和manager的管理员luhao，我们之后需要以manager角色上传Web应用程序和以admin角色配置数据员。再打开apache-tomcat-5.5.17\conf目录下server.xml文件，将＜Connector元素后port="8080"的属性改为port="8008"（注意：由于oracle已占用了Tomcat默认的8080访问端口，必须更改其它未被占用的空闲端口，此处假设为8008）。</p>
		<p>　　接下来运行eclipse程序，配置Tomcat属性。打开菜单“窗口/首选项”，打开“Java/已安装的JRE”选项，将运行环境参数位置定位于JDK目录下的JRE目录。打开“Tomcat”选项，Tomcat Version选择5.x，Tomcat Home定位到apache-tomcat-5.5.17目录，其余默认关联即可。打开“Tomcat/JVM Settings”和“Tomcat/Source Path”选项，JRE选择刚配置的已安装的JRE，Automatcially compute source path打勾。再打开“Tomcat Manager App”选项，url输入<a href="http://localhost:8008/manager">http://localhost:8008/manager</a>，username和password填Tomcat中新加入的luhao和12345（这步可以保证将Web应用程序发布到Tomcat，项目Reload也不会出错）。</p>
		<p>　　3.获取Oracle9i相应的JDBC驱动程序，配置Data Sources和Context</p>
		<p>　　拷贝Oracle9i安装目录下ora90/jdbc/lib/classes12.jar驱动文件到Tomcat目录下common/lib公共文件夹下。</p>
		<p>　　然后在eclipse中启动Tomcat（点击那个猫的图标即可），以luhao/12345身份登陆<a href="http://localhost:8008/admin">http://localhost:8008/admin</a>后新建数据源。其中JNDI Name：jdbc/Oracle（此数据源JNDI名字可以随意取，但不可重复），Data Source URL：jdbcracle:thinlocalhost:1521:NBZJU（1521为Oracle访问端口，NBZJU为要访问的数据库名称），JDBC Driver Class：oracle.jdbc.driver.OracleDriver（可打开classes12.jar文件查看到相应的路径，否则驱动有误），Username：luhao和Password：11111（填NBZJU数据库有访问权限的用户即可），其余选项默认即可。数据源保存及递交后，conf目录下server.xml文件的全局命名资源GlobalNamingResources元素内将多一项Resource属性：＜Resource<br />name="jdbc/Oracle"<br />type="javax.sql.DataSource"<br />password="11111"<br />driverClassName="oracle.jdbc.driver.OracleDriver"<br />maxIdle="2"<br />maxWait="5000"<br />username="luhao"<br />url="jdbcracle:thinlocalhost:1521:NBZJU"<br />maxActive="4"/＞ <br />　　数据源配置完成后，还须配置相关的上下文信息context，来使程序获得JDNI初始化引用，从而定位数据源。由于之前定义的是全局资源，我们可在apache-tomcat-5.5.17\conf\context.xml文件中的Context元素中加入关联属性：＜ResourceLink global="jdbc/Oracle" name="jdbc/Oracle" type="javax.sql.DataSource"/＞ <br />4.创建测试Web程序</p>
		<p>　　运行eclipse，新建一个Tomcat项目到任意的当前工作空间，此处项目取名quickstart。当项目一经创建，我们就可以发现apache-tomcat-5.5.17\conf目录下server.xml文件的Host元素内自动增加了以下属性内容（用来关联发布Web应用程序的工作目录）：＜Host<br />appBase="webapps"<br />name="localhost"＞＜Context path="/quickstart" reloadable="true" docBase="E:\luhao\workspace\quickstart" workDir="E:\luhao\workspace\quickstart\work" /＞</p>
		<p>＜/Host＞ <br />　　新建JSP测试页面index.jsp到quickstart工程目录下（JSP页面编辑需要有支持Web开发功能的eclipse插件支持，如MyEclipse、WTP等插件），代码如下：＜%@ page contentType="text/html; charset=gb2312" %＞<br />＜%@ page import="javax.naming.*" %＞<br />＜%@ page import="javax.sql.*" %＞<br />＜%@ page import="java.sql.*" %＞<br />＜html＞＜head＞＜title＞Oracle JDBC Test＜/title＞＜/head＞<br />＜body＞<br />＜%<br />Connection conn=null;<br />Statement stmt=null;<br />ResultSet rs=null;<br />ResultSetMetaData md=null;<br />try{<br />　Context initCtx=new InitialContext(); <br />　//获得JNDI初始化上下文信息，即获取目录上下文的引用<br />　DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/Oracle");<br />　//定位数据源jdbc/Oracle<br />　if(ds!=null){<br />　　out.println("已经获得DataSource");<br />　　out.println(ds.toString());<br />　　conn=ds.getConnection();<br />　　if(conn!=null){<br />　　　out.println("create connection sucess!");<br />　　　stmt=conn.createStatement();<br />　　　out.println("createStatement Success!");<br />　　　rs=stmt.executeQuery("select * from LUHAO.USER_INF");<br />　　　md=rs.getMetaData();<br />　　　out.println("＜table border=1＞");<br />　　　out.println("＜tr＞");<br />　　　for(int i=0;i＜md.getColumnCount();i++){<br />　　　　out.println("＜td＞"+md.getColumnName(i+1)+"＜/td＞");<br />　　　}<br />　　　while(rs.next()){<br />　　　　out.println("＜tr＞");<br />　　　　out.println("＜td＞"+rs.getString(1)+"＜/td＞");<br />　　　　out.println("＜td＞"+rs.getString(2)+"＜/td＞");<br />　　　　out.println("＜td＞"+rs.getString(3)+"＜/td＞");<br />　　　　out.println("＜td＞");<br />　　　}<br />　　　out.println("＜/table＞");<br />　　　conn.close();<br />　　}<br />　}<br />}catch(Exception e){<br />　out.println(e.toString());<br />　System.out.println(e.toString());<br />}<br />%＞<br />＜/body＞<br />＜/html＞ <br />　　5.启动数据库，运行测试程序</p>
		<p>　　运行测试页面前必须先启动后台数据库。办法是打开Oracle SQL Plus，用DBA身份连接入NBZJU数据库：conn luhao/11111 as sysdba，再用命令：startup完成启动数据库（shutdown可以关闭数据库）。</p>
		<p>　　保存工程，启动Tomcat，打开<a href="http://localhost:8008/quickstart/">http://localhost:8008/quickstart/</a>页面。若能看到各种连接成功的消息及完整的USER_INF测试表内容，那么表明整个Web测试程序运行成功了！</p>
		<p>　　总结：</p>
		<p>　　实际的整合配置过程，除上述全局化配置方法可行外，还可以采用局部化配置方法（某些版本Tomcat可能行不通）。局部化配置方法较全局化配置方法区别仅在于将数据源jdbc/Oracle的Resource属性内容加入工程所在quickstart目录下的META-INF\context.xml文件的Context元素中去，而不用改变Tomcat目录的conf子目录下的server.xml和context.xml文件。</p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 10:54 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用unix命令收集</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14780.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14780.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14780.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14780.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14780.html</trackback:ping><description><![CDATA[
		<p>useradd/userdel/usermod/top命令详解2006-07-16 01:13useradd<br />安装solaris10，启动后发现找不到ftp、telnet的关闭方法，上网搜了一下，查到了下面的文章，顺利的关闭了这几个服务。</p>
		<p>Solaris 10中采用了新的SMF体系来控制系统服务和守护进程，比原来的SVR4 RC要复杂<br />多了:_&lt; 类似AIX和Windows NT的体系。 很多原来的rc脚本现在都由SMF/SVC来控制。<br />SMF的基本体系：<br />管理命令 svcadm(服务状态管理，启动、停止等) <br /># svcs <br />查看当前所有的服务状态，可以使用|管道符重定向作更个性化的查找；如<br /># svcs |grep online 查看当前运行服务<br /># svcs |grep offline 查看当前停止服务<br /># svcs |grep inetd 查看inetd服务状态</p>
		<p>#svcadm disable svc:network/ftp<br />#svcadm disable svc:network/telnet<br />#svcadm disable svc:network/smtp:sendmail</p>
		<p>＃useradd –u 1233 –g sun –d /export/home/sun –c “Sun test user.” –m –s /usr/bin/sh sun   <br />功能说明：建立用户帐号。</p>
		<p>语　　法：useradd [-mMnr][-c &lt;备注&gt;][-d &lt;登入目录&gt;][-e &lt;有效期限&gt;][-f &lt;缓冲天数&gt;][-g &lt;群组&gt;][-G &lt;群组&gt;][-s ][-u ][用户帐号] 或 useradd -D [-b][-e &lt;有效期限&gt;][-f &lt;缓冲天数&gt;][-g &lt;群组&gt;][-G &lt;群组&gt;][-s ]</p>
		<p>补充说明：useradd可用来建立用户帐号。帐号建好之后，再用passwd设定帐号的密码．而可用userdel删除帐号。使用useradd指令所建立的帐号，实际上是保存在/etc/passwd文本文件中。</p>
		<p>参　　数：<br />　-c&lt;备注&gt; 　加上备注文字。备注文字会保存在passwd的备注栏位中。　 <br />　-d&lt;登入目录&gt; 　指定用户登入时的启始目录。 <br />　-D 　变更预设值． <br />　-e&lt;有效期限&gt; 　指定帐号的有效期限。 <br />　-f&lt;缓冲天数&gt; 　指定在密码过期后多少天即关闭该帐号。 <br />　-g&lt;群组&gt; 　指定用户所属的群组。 <br />　-G&lt;群组&gt; 　指定用户所属的附加群组。 <br />　-m 　自动建立用户的登入目录。 <br />　-M 　不要自动建立用户的登入目录。 <br />　-n 　取消建立以用户名称为名的群组． <br />　-r 　建立系统帐号。 <br />　-s　 　指定用户登入后所使用的shell。 <br />　-u 　指定用户ID。</p>
		<p>userdel</p>
		<p>功能说明：删除用户帐号。</p>
		<p>语　　法：userdel [-r][用户帐号]</p>
		<p>补充说明：userdel可删除用户帐号与相关的文件。若不加参数，则仅删除用户帐号，而不删除相关文件。</p>
		<p>参　　数：<br />  -r 　删除用户登入目录以及目录中所有文件。</p>
		<p>top</p>
		<p>功能说明：显示，管理执行中的程序。</p>
		<p>语　　法：top [bciqsS][d &lt;间隔秒数&gt;][n &lt;执行次数&gt;]</p>
		<p>补充说明：执行top指令可显示目前正在系统中执行的程序，并通过它所提供的互动式界面，用热键加以管理。</p>
		<p>参　　数：<br />　b 　使用批处理模式。 <br />　c 　列出程序时，显示每个程序的完整指令，包括指令名称，路径和参数等相关信息。 <br />　d&lt;间隔秒数&gt; 　设置top监控程序执行状况的间隔时间，单位以秒计算。 <br />　i 　执行top指令时，忽略闲置或是已成为Zombie的程序。 <br />　n&lt;执行次数&gt; 　设置监控信息的更新次数。 <br />　q 　持续监控程序执行的状况。 <br />　s 　使用保密模式，消除互动模式下的潜在危机。 <br />　S 　使用累计模式，其效果类似ps指令的"-S"参数。 </p>
		<p> </p>
		<p>
				<br />usermod</p>
		<p>功能说明：修改用户帐号。</p>
		<p>语　　法：usermod [-LU][-c &lt;备注&gt;][-d &lt;登入目录&gt;][-e &lt;有效期限&gt;][-f &lt;缓冲天数&gt;][-g &lt;群组&gt;][-G &lt;群组&gt;][-l &lt;帐号名称&gt;][-s &lt;shell&gt;][-u &lt;uid&gt;][用户帐号]</p>
		<p>补充说明：usermod可用来修改用户帐号的各项设定。</p>
		<p>参　　数：<br />　-c&lt;备注&gt; 　修改用户帐号的备注文字。 <br />　-d登入目录&gt; 　修改用户登入时的目录。 <br />　-e&lt;有效期限&gt; 　修改帐号的有效期限。 <br />　-f&lt;缓冲天数&gt; 　修改在密码过期后多少天即关闭该帐号。 <br />　-g&lt;群组&gt; 　修改用户所属的群组。 <br />　-G&lt;群组&gt; 　修改用户所属的附加群组。 <br />　-l&lt;帐号名称&gt; 　修改用户帐号名称。 <br />　-L 　锁定用户密码，使密码无效。 <br />　-s&lt;shell&gt; 　修改用户登入后所使用的shell。 <br />　-u&lt;uid&gt; 　修改用户ID。 <br />　-U 　解除密码锁定。 </p>
		<p> <br />SCO UNIX学习宝典<br />第一节安装准备 <br />1．安装分类：安装分为单启动安装（只启动UNIX）和多启动安装（即可选择启动DOS、WIN98、WIN2000等）。 <br />2．安装概述：硬盘最多支持四个分区，除非你用软件来管理多重启动。Dos及WIN98下有两个分区即Primary 和Expand；Win2000也分为Primary和Expand分区；Unix下分为Root根分区和Swap分区。如何配置，这需要你自己选择。注意：Unix下的两个分区必须要装，言外之意，你只能在选两个分区了。建议：不要DOS、Win98及Win2000的扩展分区。 <br />3．硬盘空间：你可以预留Free的硬盘空间给Unix，也可以在 Unix安装过程中删除其他的分区来安装Unix。但必须在硬盘的8G，及1024柱面之前。 <br />4．启动盘制作：你可以选择软盘启动安装，也可以选择光盘启动安装，只要你的机器支持光盘启动。如果你的机器不支持光盘启动你就要作启动软盘。 <br />方法有四： <br />1．在windows下用gzcp：提示符下运行E：\images\gzcp E：\images\boot\install.img A：。其中A：为你的软盘符，E为你的光盘符。 <br />2．在windows下用floppcp：提示符下运行E：\images\floppcp d/ A： /f E：\images\boot\install.img <br />3．在Unix下：root注册后，在机器上插入3.5寸软盘，并将系统软件光盘放入光驱，然后敲入下面的命令: #mount /dev/cd0 /mnt&lt;回车&gt;#dd if=/mnt/images/boot/N00 of=/dev/rfd0135ds18&lt;回车&gt; OK！ </p>
		<p>第二节安装过程 <br />1．启动机器： <br />1．无论从光盘启动还是从软盘启动，机器会出现下列安装提示符： <br />SCO UNIX Openserver（TM）5.0.X <br />Boot： *你可以在此输入？查询可启动的地址或打回车。 <br />2．安装驱动：如果你的机器有Scsi卡或阵列卡或网卡，你需要在此输入驱动包的地址。 <br />如：defbootstr link=”amird slha” sdsk=amird(0,0,0,0) Srom=wd(0,0,0,0) <br />其中，link＝“amird slha”指出安装时需要联入的驱动程序名称（BTLDs,bootime loadable <br />driver），sdsk＝amird（0，0，0，0）指出系统根盘的位置，几个数字分别为SCSI的适配器号 <br />（adapter number）,总线号（bus number），SCSI ID，逻辑单元号（lun）,Srom=(0,0,0,0)指 <br />出的是EIDE（IDE）CDROM的位置。在这种情况下，(n,n,n,n)分别代表（IDE Controller， <br />Master/Slave,LUN,BUS）,合法值为0和1。在上面的例子中，IDE Controller:0=primary, <br />Master/Slave :0=master,LUN从：0（LUN for an EIDE/IDE device is always 0）,BUS:0(BUS <br />for an EIDE/IDE device is always 0). <br />3．开始安装： <br />⑴．系统检测硬件，等待出现下列提示： <br />⑵．Press &lt;Enter&gt; to begin installation。回车。 <br />⑶．安装介质的选择： <br />Media device to be used：IDE CD ROM *按空格键选择另外的介质 <br />IDE Controller：Secondary *按空格选择Primary <br />Master or Slave：Master *按空格选择Slave <br />Accept above choice回车 <br />注：如果只出现Media device to be used，而不出现下列两项，则需要组合硬盘及光驱的接法，建议都挂主（Master）。 <br />⑷．键盘类型的选择，直接Accept above chioces <br />⑸．许可证： <br />License number： <br />License code： <br />License data： <br />Accept above choices 回车 <br />⑹．安装类型的选择： <br />Upgrade（升级） Fresh（全新安装）回车选OK <br />⑺．配置系统： <br />System name： <br />Domain name： <br />Security profile：Traditional <br />Time zone：China Standard Time *按空格选择此项 <br />Languge：Standard C （English） <br />Accept above choice <br />⑻．系统初始化： <br />…………………………………… <br />…………………………………… <br />…………………………………… <br />…………………………………… <br />Database services：YES *如果你的机器要运行大型数据库按空格选YES <br />Accept above choices <br />⑼．硬盘的配置： <br />Hand disk setup：UNIX only ：Bad Tracking ON <br />Optional software：SCO Openserver Enterprise System，265MB <br />Accept above choice *如果你的硬盘没有其它系统打回车 <br />注：如果你的硬盘安装了多系统或你不打算把整个硬盘给UNIX，就要设置硬盘。 <br />亮条移到上面，回车出现： <br />1．Preservation <br />2．UNIX only <br />3．Customize <br />4．interactive <br />选4 <br />1．Display patition table <br />2．Use entire disk for unix（整个硬盘给UNIX） <br />3．Use rest of disk for unix（把剩余空间给UNIX） <br />4．Create unix patition（创建UNIX分区） <br />5．Active（激活刚分的区） <br />6．Delete（删除） <br />7．Create（创建） <br />选3或4，创建以后别忘了激活刚创建UNIX分区 <br />⑽．选择基本配置： <br />Network card： *按空格选择 <br />Network address： *按空格选择 <br />Video and graphics：VGA <br />Mouse：High Resolution Keyboard Mouse *按空格选择 <br />Email system：MMDF *按空格选择其它 <br />Accept above choices <br />⑾．设置root用户口令 <br />⑿．扫描硬盘的坏磁道 <br />⒀．建立文件系统 <br />⒁．安装进程 <br />⒂．重新启动机器 <br />4．安装完毕： <br />第三节基本配置 <br />1．重启机器。 <br />2．系统出现： <br />SCO OpenServer TM Release 5 <br />Boot <br />： *回车 <br />3．系统出现： <br />INIT：SINGLE USER MODE <br />Type CONTROL-d to proceed with normal startup， <br />（or give root password for system maintenance）： 输入root密码或按CONTROL-d <br />4．按CONTROL-d系统出现： <br />SCO Openserver（TM）Release 5 <br />Login：root <br />Password： <br />5．登录机器，系统提示：# <br />6．配置鼠标： <br />1 mkdev mouse <br />2 add a mouse to system <br />3 ps-2style keyboard mouse <br />4 high resolution keyboard-mouse <br />注意依次选择： <br />7．配置显卡： <br />1．Mkdev graphics <br />8．配置网卡： <br />1．通过custom安装驱动 <br />2．Install new <br />3．Netconfig <br />4．Install new lan adapter <br />9．启动X Window： <br />配置完鼠标和显示器后，#下键入startx就可以进入图形界面了。执行scologin enable 则开机自动进入x-windows的登陆界面。 <br />10．关机操作： <br />1.一般用户：exit；delete键；ctrl+d键 <br />2.超级用户：shutdown；reboot；haltsys；init 0。 <br />3.由多用户模式变为单用户模式：init 1 <br />第四节基本操作 <br />1．Unix认识 <br />2．UNIX发展的历史有点悠久，所以成熟而博大。与历史的兼容，他里面保留了一些古老的命令和文件。热心的扩展使得她对不同的人有不同的答案。在UNIX中，很多问题不是只有唯一的解决办法。这要看你使用的是什么时候，谁的参考书。其实这并不重要，重要的就是你找到了你要的答案。因此，我认为把UNIX摸透很难，也没有必要。因为，即使你精力充沛，你的记忆力恐怕也不会给你面子。掌握基本命令、系统的结构、设计思想是非常重要的，需要的时候再去找你的答案吧！当然，这是我个人的观点，你也许能找到适合你的更好办法。 <br />UNIX家族产品很多，但其一般用户命令均符合POSIX标准。掌握这些基本命令，我们就可以在这个产品平台上开展工作。下面简要介绍SCO OPENSERVER 部分常用命令，其中大部分是POSIX标准的。掌握这些命令的关键是如何从这些命令出发找到自己需要的命令，学会使用联机帮助就是很好的办法。 </p>
		<p>命令执行环境 </p>
		<p>UNIX提供给用户执行命令的环境，称之为SHELL。有sh,ksh,csh等，其中sh为基本SHELL，其余为根据不同用户习惯扩展的。 <br />用户登录后，系统将执行配置文件设置用户工作环境。如果没有在配置文件中exec一个程序或自动退出。用户将得到命令行提示符。此时用户的shell一般对应于/etc/passwd中的设置。 <br />不同SHELL的配置文件为： <br />sh.profile <br />ksh.profile .kshrc <br />csh.login .cshrc </p>
		<p>注意点： <br />用户登录后虽然得到指定的SEHLL环境，只是说明在这个环境中你可以执行这个SHELL的特有命令，在执行另外一个SHELL程序时如无特殊指定（见SHELL编程），被执行程序的环境为sh。 <br />环境变量虽在不同的SHELL中有不同的设置方法，但工作环境的变量，所有运行程序均可使用。 <br />执行程序中设置的环境变量，除非这个程序是被（. dot）调用的，程序执行完后不会带到工作环境中来。 </p>
		<p>输入输出和联机帮助 </p>
		<p>输入输出重定向 <br />在UNIX的SHELL环境中，其输入输出的重定向的功能非常有用。其中可以使用标准输入输出设备，0表示标准输入、1表示标准输出、2表示标准错误输出。 <br />1.&gt; filename输出重定向(更新方式)。 <br />将输出定向到文件，文件为更新方式。 <br />2.&gt;&gt; filename输出重定向（追加方式）。 <br />将输出定向到文件，文件为追加方式。 <br />3.&lt; filename输入重定向。 <br />将文件的内容作为执行程序的输入。 <br />4.&lt;&lt; word输入重定向。 <br />Word为输入结束标志符，将后续输入的内容作为执行程序的输入。输入以word或control-D结束。 <br />5.| 管道。 <br />将前一个命令的输出作为后一个命令的输入。 </p>
		<p>联机帮助 </p>
		<p>UNIX中提供了很详细有用的帮助，使用man 命令可以去看你所需要的命令的帮助。 <br />Man的基本用法：man [段节] 主题 <br />man –k 关键词 <br />段节指主题所属的范畴，有： </p>
		<p>ADM 系统管理命令 <br />C 用户命令 <br />F 文件格式 <br />HW 硬件属性 <br />M 其他的 <br />TCL SCO Visual Tcl(TM) commands <br />只有一个主题有多个范畴的帮助时，才须指定你需要的段节。 <br />Man –k 可以显示帮助文档中出现这个词的所有主题。 </p>
		<p>
				<br />技巧： </p>
		<p>我们需要找一个想要的命令时，man一下我们知道的命令。从相关命令出发就可找到答案。Man –k 搜索也是很好的办法。 <br />在XWINDOW的HELP中找答案会更方便、详细。 </p>
		<p>！警告：不要随意执行你不知道是用来做什么的命令！不要使用 .*做参数 <br />3．基本命令： </p>
		<p>env显示设置命令执行环境 <br />env [ - | -i ] [ name=valuess ] ... [ command [args] ] <br />date显示和设置时间 <br />date [ -u ] [ +format ] <br />date [ -u ] [ MMDDhhmm[YY] | -t [CC]YYMMDDhhmm[.SS] ] <br />clear清除当前屏幕 <br />grep找到与字符串匹配的行 <br />wc计算字、行数、字节数 <br />cat显示文件内容 <br />more分屏显示文件内容 </p>
		<p>
				<br />文件系统操作 </p>
		<p>ls列文件名 <br />cp拷贝文件 <br />mv移动文件 <br />rm删除文件 <br />cd目录切换 <br />mkdir建目录 <br />rmdir删除目录 <br />pwd显示当前所在目录 <br />find搜索文件 <br />sort对文件进行排序 <br />cut对文件进行列切割 <br />paste对文件进行列组合 <br />ln文件或目录链接 <br />进程管理 </p>
		<p>ps显示当前进程状态 <br />kill杀死进程 </p>
		<p>
				<br />用户和权限管理 </p>
		<p>useradd添加用户 <br />userdel删除用户 <br />usermod修改用户 <br />userls列可用用户 <br />passwd修改口令 <br />chmod修改文件目录权限 <br />chown修改文件目录属主 <br />who显示当前在线用户 <br />finger显示用户信息 <br />设备和终端管理 <br />mkdev 设备管理 <br />hwconfig显示当前设备信息 <br />stty设置终端模式 <br />enable打开终端 <br />disable关闭终端 <br />IPC管理 <br />Ipcs显示IPC状态 <br />Ipcrm删除信号量集、消息队列、共享内存 </p>
		<p>
				<br />网络 </p>
		<p>telnet登录远程服务器 <br />ftp文件传输 <br />route路由管理 <br />netstat显示网络状态 <br />traceroute跟踪网络访问路由 <br />netconfig网络配置管理 <br />/etc/hosts网络主机名文件 <br />/etc/services网络服务端口文件 <br />/etc/inetd.conf网络服务文件 <br />4． <br />第五节机器启动的认识： <br />1．Tcp/Ip的启动： <br />⑴．TCP/IP受/etc/tcp脚本文件的控制，在你进入多用户状态时启动，在你进入单用户状态时关闭/etc/tcp文件操作内容：他是一个脚本文件，其功能如下：通过配置支持TCP/IP所必须的流设备来启动或关闭TCP/IP，并启动或关闭与TCP/IP相关的daemon. <br />⑵．以ROOT登录，使用命令行：TCP START或TCP STOP手工启动或关闭TCP/IP。该文件与etc/rc2.d和/etc/rc0.d目录下的文件都有链连关系，使得/etc/tcp在系统进入或退出多用户状态时，可以运行START或STOP选项。无论你通过Network Confugration Manager 来增加还是删除一个网络接口，都会在脚本中增加或删除 ifconfig命令，修改/etc/tcp文件，同时导致/etc/strcf文件也被修改。下面列出了启动TCP/IP时系统的工作步骤： <br />。 Initializes STREAMS and sockets 　 <br />。 Sets the host name 　 <br />。 Configures Interfaces 　 <br />。 Starts network daemons 　 <br />。 Undoes all of the above on shurdown <br />⑶．/etc/tcp的操作：TCP/IP核心支持的配置仅需一次即可完成。主要包括TCP/IP所需的STREAMS模块栈的设置。系统核心在引导时即设置STREAMS栈。前提条件即是在BOOT：提示符下不用 ksl.disable引导串。设置STREAMS栈时，/etc/tcp脚本文件会调用slink命令，在进行任何其他设置或启动之前先建立STREAMS栈。 <br />2．UNIX5的启动： <br />㈠．UNIX5 基本可分为六步： <br />1、PC机的BIOS将Master Boot Block 装入内存。（读取硬盘的Track 0 ， Sector 0处的信息 <br />2、Master Boot Block将分区引导块（boot0）装入。（读取活动分区的sector0处的信息）。 <br />3、若 Unix 分区是活动的，则继续装入boot1。 <br />4、boot1装入/stand/boot 。（读取Unix的可引导文件系统区的信息，一般为boot文件系统） <br />5、/stand/boot负责执行所有在.bootrc中发现的命令,并读取/stand/etc/default/boot 文件中的参数. <br />6、/stand/boot 显示Boot：提示符，引导成功。 <br />7、 <br />㈡．UNIX5 启动的说明： <br />1、/stand 是UNIX5缺省的引导系统/dev/boot的挂接点。一般标记为“read only”。若想修改其中内容，须将其卸载后重新挂载。 <br />2、.bootrc is especially useful in network installations , where a packet driver and tftp driver may have to be load before user can load a kernel from network . <br />3、在Boot：后可以使用外部bootos 程序。Bootos 可以识别的标识有：ccpm （Concurrent CP/M）、dos、dos_12/16/32、dos_ext、nt、os2、os2.hpfs、unix、xenix等。 <br />　 可用bootos ？列出现有已安装文件系统。Bootos 后跟分区标识或分区号即可引导对应系统。 <br />4、unix5中一般有四个核心，存放于/stand目录中。除unix、unix.old外，另两个核心为unix.install(安装盘上的原始核心备份)、unix.safe(第一次重连核心后的备份)。 </p>
		<p>3．UINX5的命令： <br />4．常用的几个命令主要有： <br />一、 PS <br />我们可以用ps 的 – l 选项,得到更详细的进程信息. <br />&amp;#61548; F(Flag)：一系列数字的和，表示进程的当前状态。这些数字的含义为： <br />00：若单独显示，表示此进程已被终止。 <br />　 01：进程是核心进程的一部分，常驻于系统主存。如：　　　 <br />　　　　sched、 vhand 、bdflush 等。 <br />02：Parent is tracing process. <br />　　04 ：Tracing parent's signal has stopped the process; the parent　is waiting ( ptrace(S)). <br />　　10：进程在优先级低于或等于25时，进入休眠状态，而且不能用信号唤醒，例如在等待一个inode被创建时　　　 <br />　　 20：进程被装入主存（primary memory） <br />　　 40：进程被锁在主存，在事务完成前不能被置换　　　e <br />&amp;#61548; S(state of the process ) <br />O：进程正在处理器运行　 <br />　 S：休眠状态（sleeping） <br />R：等待运行（runable）　　　 <br />I：空闲状态（idle） <br />　 Z：僵尸状态（zombie）　　　 <br />　 T：跟踪状态（Traced） <br />B：进程正在等待更多的内存页 <br />&amp;#61548; C(cpu usage)：cpu利用率的估算值　 <br />二、 Sar：统计单CPU系统的系统活动情况 <br />Cpusar：多处理器系统中单个处理器的活动情况 <br />Mpsar：多处理器系统中处理器的总体活动情况 <br />&amp;#61548; Sar -u：检查是否有逃逸进程大量占用CPU <br />此命令的显示有四个字段，含义如下： <br />%usr：执行用户进程的时间 <br />%sys：执行系统进程的时间 <br />%wio：等待完成I/O的时间 <br />%idle：空闲时间 <br />显示结果分析说明： <br />1) 一般情况下，%usr与%sys的值基本相等 <br />2) 在一般的多用户系统中，%idle通常大于40% <br />3) 若%wio经常&gt;15%，意味着硬盘有可能会造成瓶颈 <br />4) 若%idle经常小于30%，意味着处理器能力较弱 <br />5) 若%idle经常小于10%，表明处理器负担过重，或者存在逃逸进程 <br />6) 若%idle接近于0，并且%sys又远远高于%usr，则可能是因为内存短缺引起了大量的swapping和paging <br />&amp;#61548; Sar -p：检查系统中是否有过多的等待进程 <br />此命令有四个相关字段： <br />runq-sz：内存（memory）中可以运行的进程数 <br />%runocc：进程进入内存等待的概率 <br />swpq-sz：对换区（swap）中等待运行的进程数 <br />%swpocc：进程进入swap等待的概率 <br />显示结果分析汇总如下： <br />1) 若runq-sz经常大于2并且%runocc经常大于90%，意味着处理器负载过重 <br />2) 若%swpocc不为0，表示系统已经置换出了进程。可以采用增加内存或减少缓冲的方法来减少swap和paging。 <br />&amp;#61623; 自动统计程序： <br />对系统运行状况的判断不能依赖于某个特定时期的数据，它需要一个长期的积累和收集的过程。Unix5提供了两个基于月的自动统计程序sa1（以二进制形式收集、存放于目录/usr/adm/sa中，以sadd为文件名，dd是一个数字，表示当月第几天）、sa2（以可读文本形式存放在目录/usr/adm/sa中，文件名为：sardd）。这两个命令可以通过crontab启动。相关文件位于/usr/spool/cron/crontabs下sys和 root。 <br />&amp;#61623; 激活自动记录： <br />/usr/lib/sa/sar_enable　-y <br />&amp;#61623; 显示记录内容： <br />sar –q　-f　/usr/adm/sa/sa10 </p>
		<p>5． <br />第六节软件安装 <br />1．安装方法： <br />1．custom <br />2．Install new <br />或 <br />3．dd if=/dev/fd0 of=/mnt/super *（super为新建的文件） <br />4．mv super VOL.000.000 <br />5．Install new <br />6．选择安装介质。 <br />2．删除方法： <br />1．custom <br />2．remove <br />第七节高级进阶 <br />1．问题：我改了 hosts 文件，譬如： 127.0.0.1 localhost改成： 127.0.0.1 local 不重起系统，怎样让它生效？ <br />答：# tcp stop <br /># tcp start <br />建议：好多地方要用到本机的反馈地址的，建议不要修改！！！ <br />2．问题：我想修改主机名，如何修改？ <br />答：如果想修改主机名，用uname -S 主机名。 <br />3．问题：怎么看我的SCO是多少用户？ <br />答：uname －X <br />在liences manager中也可以看到！！ <br />uname -A 更好 <br />4．问题：如何使可以访问软驱和光驱？ <br />答：访问软驱：#mount /dev/fd0135ds18 /mnt <br />#cd /mnt <br />/mnt下的内容就是软盘的内容 <br />#umount /dev/fd0135ds18 <br />访问光驱：#mount /dev/cd0 /mnt <br />#cd /mnt <br />/mnt下的内容就是光驱的内容 <br />#umount /dev/cd0 <br />软去考出和考入 c 文件还可以用doscp <br />5．问题：系统开发包（开发系统）在何处，怎么找到，如何安装？是用系统盘引导系统安装，还是其他方式安装？ <br />答：就在你的光盘上，用custom安装。在ROOT下:scoadmin-&gt;soft <br />6．问题：我gzip压缩软件，应该有unix版的，因我对*.tar.gz解压后文件以远大于软盘容量，无法tar进unix系统。我应到那里下载gzip，应怎样安装？恳请帮助！ <br />答：<a href="ftp://sdccf.mine.nu">ftp://sdccf.mine.nu</a>或<a href="ftp://ftp2.caldera.com/pub/skunkware/osr5/vols/">ftp://ftp2.caldera.com/pub/skunkware/osr5/vols/</a><br />7．问题：SCO UNIX 5.0.5 装了开发系统，再装网卡驱动。PING 自己通，PING 别人不同，这和安装开发系统有关吗？怎样解决？ <br />答：IP地址在同一个网段吗？如是，网线接法对吗？不在一个网段上要加路由的！！ <br />8．问题： 如何构建WEB服务器？ <br />答：Internet/Intranet的网络应用过程中，Web服务器的建设必不可少，而国内的企事业单位在组网方案中多考虑向Intranet靠拢,构建自己的Web服务器，利用其中的WWW、E-mail等服务提高办公效率。在国内，SCO UNIX作为一个技术成熟的商用网络操作系统，广泛地应用在金融、保险、邮电等行业中。其自身内建了丰富的网络功能，自SCO OpenServer 5.0版以后，各项网络服务内容大大加强，加上其良好的稳定性和安全性，无需追加任何投资完全可以配置成企业内部的Web服务器，利用各客户端（Win 9x）的浏览器软件即可实现WWW的各项功能，是充分利用已有投资、降低成本的好办法；UNIX Web服务器在一些商业网站中被成功地使用，如果你熟悉SCO UNIX，可以考虑选用SCO UNIX网络操作系统建立企业级Internet Web服务器。 <br />　　本文以SCO OpenServer 5.0.5为例，介绍在已有办公网的基础上构建企业网Web服务器的方法。在A网段中构建一个SCO UNIX Web服务器（IP地址：205.100.100.52），在该局域网内客户机操作系统是Win 95/98/NT，浏览器为IE，这样具有良好的网页编辑环境和浏览界面（当然，也可以选用Linux环境下的网页浏览环境）。其中，有一台Win 9x客户机（IP地址：205.100.100.170）具有远程管理Web服务器和上传网页的功能；在广域网内的另一个B网段，有一些Web浏览的客户机，其中有一台Win 9x客户机（IP地址：204.1.191.2）也设置为具有远程管理Web服务器的功能。 <br />1．Internet Manager软件包的安装 <br />2．SCO OpenServer 5.0.5系统的安装及网络配置在此就不讲述了，只是用户需要注意在安装过程中选择缺省 <br />软件包安装，这样该系统就包括了Intranet/Internet的Web服务功能。如果没有选择缺省软件包安装，就 <br />要安装Netscape Communicator (Ver 4.0.5b)和SCO OpenServer Enterprise System Internet FastStart <br />(Ver 5.0.5m)软件包。具体步骤是插入SCO OpenServer 5.0.5的系统安装光盘，用#scoadmin→software命 <br />令，选择安装光盘中的上述两个软件包进行安装，安装完毕，重新启动主机。 <br />3．WWW服务器远程管理的设置 <br />　　虽然SCO OpenServer 5.0.5在主控台的图形界面中提供了管理WWW服务器的功能，但是对WWW服务器远程管 <br />理的设置，使管理员能够更方便灵活地通过远程客户机维护WWW服务器。在这里WWW服务器IP地址为： <br />205.100.100.52，WWW服务器远程管理的客户机IP地址为：205.100.100.170，WWW主页存放在目录/usr/www下 <br />(系统缺省WWW的主页目录为/usr/internet/ns_httpd/docs)。 <br />4．Internet Manager配置：用root 登录SCO UNIX主机，编辑/usr/internet/admin/access/site文件，在文件 <br />中加入远程管理服务器的本地客户机IP地址：205.100.100.170。 </p>
		<p>　　编辑/usr/internet/admin/conf/httpd.conf文件，将“ServerName localhost ”一行改为 “ServerName <br />205.100.100.52”。 <br />5．重启主机，更新配置。 </p>
		<p>　　Netscape FastTract Server 的配置：用root 登录，编辑/usr/internet/ns_httpd/admserv/ns-admin.conf <br />文件，将“ServerName scosysv.ccb”一行改为“ServerName 205.100.100.52”；将“Addresses 127.0.0.1” <br />一行改为“Addresses 205.100.100.170”。 <br />6．重启主机，更新配置。进入/usr/internet/ns_httpd/httpd-80目录，运行stop，停止http服务管理程序； <br />7．远程启动 Internet Manager <br />　　在windows 95/98/NT客户机启动IE浏览器，在地址栏输入服务器的IP地址和Internet Manager的端口号（615） <br />及首页文件名——http://205.100.100.52:615/mana/mana/menu.mana，系统提示输入用户名和密码， <br />首次登录时可使用系统默认的Internet Manager的管理用户“admin”和缺省口令“root”,登录后进入 <br />Internet Manager的界面。 </p>
		<p>　　系统显示了各种服务内容，单击“Web”按钮，进入“Netscape FsatTrack Server”的管理入口，选择超 <br />链结Netscape FastTrack Server (port 80),出现管理界面的登录对话框，输入admin用户名和缺省口令 <br />root，成功登录后进入Netscape FastTrack Server 2.01的管理画面。 <br />8．对Web Server Manager的配置进行修改 <br />　　在管理界面上一排选项中，单击System Settings，再通过选择“Network Settings”、“performance tuning” <br />等选项，可对服务器主目录、服务器名、httpd的监听端口号（缺省为80）、服务器的进程数等参数进行设 <br />置。 </p>
		<p>　　在管理界面上一排选项中，单击Content Mgmt，再单击左边“Primary Document Directory”，在正文区 <br />的Primary Directory框中，输入将存放WWW主页的主路径名“/usr/www”；如果在主文档目录中需要为新 <br />用户myweb建立一个目录 ，那么一定要对所建立的目录设置访问控制权限。 </p>
		<p>　　#cd /usr/www </p>
		<p>　　#mkdir myweb </p>
		<p>　　#chown nouser myweb </p>
		<p>　　#chgrp nouser myweb </p>
		<p>　　#chmod 755 myweb </p>
		<p>　　进入Internet Manager的界面后，单击System Settings，再单击左边“Document preferences”，可增加或 <br />修改缺省首页HTML文件名,点击OK按钮，选择“save and apply”，使修改有效。该系统缺省首页HTML文件 <br />名为index.html、home.html。 </p>
		<p>　　进入Internet Manager的界面后，点击Security，选择Set Internet Manager Password,可修改admin的口 <br />令；也可以用root身份登录，在字符模式下键入/etc/internetpw来进行。 </p>
		<p>　　进入Internet Manager的界面后，点击Security，选择Control Access from Remote Sites,输入204.1.19 <br />1.2，这样可以增加一个远程管理Web服务器的客户机。该方法比在UNIX字符环境下编辑/usr/internet/admin/access/site <br />文件更加方便快捷。 </p>
		<p>　　Web服务器设置完成后，将网页上传到WWW主页的主路径/usr/www下，系统缺省首页文件名为：index.html，在SCO UNIX系 <br />统中，文件名是严格区分字母大小写的，所以上传到UNIX主机中的网页文件名的字母大小写有可能和Win 9x上的不同。 <br />网页上传完成后，这样在客户机上就能浏览到SCO UNIX系统中Web服务器上的网页了。 <br />9．问题：机器上如何安装开发系统？ <br />答： 放入安装介质， custom-&gt;Software-&gt;Install New-&gt;CD-ROM-&gt; Sco Openserver Development Sys-tem 输入系列好！！ <br />10．问题：如何添加网关和DNS服务？（unkonwn host name） <br />答：route add default xxx.xxx.xxx.xxx <br />答：网关需要在/etc/rc2.d/目录下的S打头的文件中加入 <br />route add default xxx.xxx.xxx.xxx 1 <br />这么一行，要不然每次启动后都要在#下执行一次 <br />添加DNS服务：vi /etc/resolv.conf 内容为nameserver xxx.xxx.xxx.xxx ，既DNS地址。 <br />11．问题：如何启动时自动添加网关？ <br />答：可以在/etc/rc2.d目录下用vi创建一个名为S10route的文件，内容为： <br />route add default xxx.xxx.xxx.xxx 2 其中xxx.xxx.xxx.xxx为网关。 <br />答：在vi /etc/tcp 找到route 那行修改一下岂不更为简单？在ifconfig后。 <br />在/etc/tcp文件里面添加也可以。 <br />答：在/etc/rc中更方便 <br />答：SCO UNIX环境下自动增加网关的两种方法： <br />1．方法一:编辑产生一个/etc目录下的gateways文件。 </p>
		<p>以root注册。 </p>
		<p>#cd /etc </p>
		<p>#vi gateways </p>
		<p>在该文件中增加以下语句: </p>
		<p>net目的网络gateway网关地址metric valuess [passive/active] </p>
		<p>　　其中valuess表示一个到达目的网络所经过的路程段的数目即跳数。passive,active表示 网关为被动的或主动的。例如,笔者单位局域网上的unix主机要访问上级行100.88.1.0局域 网段,可用如下语句: </p>
		<p>net 100.88.1.0 gateway 100.88.198.1 metric 2 passive </p>
		<p>　　其中100.88.198.1是本单位路由器的局域网IP地址。同样要访问别的分行的局域网可按 上述方法增加相应的语句。 </p>
		<p>2．方法二:编辑产生一个/etc/rc2.d目录下以大写S开头的文件如S96gateway。 </p>
		<p>　　我们知道,在UNIX中有几种运行级,如运行级0表示系统停机状态,运行级1表示系 统管理状态,运行级2是系统常规运行级即多用户状态,而每个运行级都对应一个/etc/rcn .d目录。如运行级2对应/etc/rc2.d目录,这个目录包含一些shell文件,unix系统启动进入 多用户状态自动执行这些文件中的命令,而且这些shell文件名具有如下格式:Snnname。S 表示系统进入这个运行级需执行该文件以启动文件中指定的进程;nn是一个00-99的数字, 该数字是这个进程被启动的顺序号;name文件名,根据这一特点,我们可以编辑产生一个文 件如S96gateway达到机器启动自动加入网关的目的。 </p>
		<p>以root注册。 </p>
		<p>#cd /etc/rc2.d </p>
		<p>#vi S96gateway </p>
		<p>在该文件中,增加以下语句: </p>
		<p>route add net目的网络　网关地址　跳数 </p>
		<p>如前例为访问100.88.1.0网段,上述语句为: </p>
		<p>route add net 100.88.1.0 100.88.198.1 2 </p>
		<p>　　其中100.88.198.0是本单位路由器IP地址。访问不同的网络,可相应增加对应的语句。 如果局域网上仅有一个路由器,可指定其为缺省网关,方法是在S96gateway中加入: </p>
		<p>route add default 网关地址 1 </p>
		<p>　　如路由器地址为:100.88.198.1上述语句就是: </p>
		<p>route add default 100.88.198.0 1 </p>
		<p>12．问题：如何启动X Windows？ <br />答：安装完后，如何进入sco unix图形界面装完后要先配置鼠标和显示器，startx就可以进入图形 <br />界面了 <br />执行scologin enable <br />则开机自动进入x-windows的登陆界；在/etc/default/中 #vi boot,在最后一行添加TIME=3保存，重启。下次开机就会直接进入图形界面。 <br />13．问题：如何修改主机的域？？ <br />答：用vi 直接修改 /etc/hosts，不REBOOT使修改后的域生效！！可以在运行netconfig时修改。 <br />14．问题：我能Ping得通别人的机子，但别人却Ping不通我的机子，还有，我能Ping 得通所有局域网内的机子，但就是Ping不通INternet上的主机。 (Ping IP地址也不行，提示，not router) <br />答：你PING不通INTERNET是因为你没设好网关， <br />网关可以用route命令设置的 <br />你的电脑能PING通其他机子，其他电脑不能PING能你的电脑倒是很奇怪，不知道你是不是PING电脑的IP地址的，还是机器名的？ <br />检查一下自己机器的 /etc/hosts 还有在/etc/tcp文件中增加一条语句 route add default 网关 1 <br />或者在/etc/rc2.d目录下创建一个文件，名为S10route，内容为： <br />route add default xxx.xxx.xxx.xxx 1 <br />其中xxx.xxx.xxx.xxx是网关。 <br />15．问题：unix下如何解.tar.gz文件？ <br />答：一般来说,我们都会顺便将.tar档用compress压缩成.Z档,节省储存空间; <br />要还原时,要先uncompress,再解tar: <br />% compress backup.tar 压缩 <br />% ls -l backup* <br />% uncompress backup.tar.Z 解压缩 <br />% tar xf backup.tar 解tar压缩 <br />你还可以用gzip/gunzip来代替compress/uncompress。 <br />16．问题：将一台WINDOWS 2000操作系统的机器作为代理服务器，用SCO OPENSERVER5。06作为客户端上网，不知有什么办法，把配置98的机器网关可以吗？ <br />答： <br />（1）配置网卡，IP地址要和服务器在同一个网段。 <br />（2）在/etc/rc2.d下用VI编辑S10route ，加入网关，既服务器网卡的IP地址,如192.168.0.1 <br />（3）vi /etc/resolv.conf 内容为nameserver xxx.xxx.xxx.xxx ，既DNS地址。就是说把UNIX下的网关的DNS服务器设为WINDOWS主机就能上网了！ <br />17．问题：20G的硬盘在sco unix 5.05中没什么没有完全认到。1　track 是多大？ <br />答：1.安装时，在“boot”提示符下，输入以下内容： <br />defbootstr biosgeom=(25249,16,63) 括号中的值是你硬盘的参数(cylinder/heads/sectors-per-track)，不要照搬。 <br />2.选择“interactive/divvy”方式，然后手动调整硬盘的cylinder/heads/sectors-per-track的值。以后的安装按照通常的方式。 <br />3.继续安装，ok <br />18．问题：SCSI硬盘的驱动怎样做，defbootstr link=...这里应怎样写？ <br />答：Boot：提示符时输入：defbootstr link=”amird slha” sdsk=amird(0,0,0,0) Srom=wd(0,0,0,0) <br />其中，link＝“amird slha”指出安装时需要联入的驱动程序名称（BTLDs,bootime loadable <br />driver），sdsk＝amird（0，0，0，0）指出系统根盘的位置，几个数字分别为SCSI的适配器号 <br />（adapter number）,总线号（bus number），SCSI ID，逻辑单元号（lun）,Srom=(0,0,0,0)指 <br />出的是EIDE（IDE）CDROM的位置。在这种情况下，(n,n,n,n)分别代表（IDE Controller， <br />Master/Slave,LUN,BUS）,合法值为0和1。在上面的例子中，IDE Controller:0=primary, <br />Master/Slave :0=master,LUN从：0（LUN for an EIDE/IDE device is always 0）,BUS:0(BUS <br />for an EIDE/IDE device is always 0). <br />19．问题：很多软件产品完工之后，都会做成一个软件包，以便于用户用custom工具进行安装。 <br />哪位能详细描述一下，做软件包的过程？ <br />答：SCO OPENSERVER 下custom发布软件的制作方法 <br />在SCO OPENSERVER5.0.x下，软件都用cutsom管理用户通过该工具，可以很好地进行软件的安装、升级、删除；开发商通过该工具，可以很好地管理好开发的发布软件的版本。利用SCO OPENSERVER下的一个工具——Custom Distribution Master ToolKit,本文提供了custom发布软件的制作方法。 <br />　　CDMT生成的发布软件，根据其介质可为软盘、磁带或光盘版。其中光盘发布软件的生成比较困难，这是由于SCO OPENSERVER支持的光盘刻录机比较少，往往只好借助于windows或linux下的刻录工具。然而，现在软件大都通过光盘来安装，因此，光盘发布软件的制作显得尤为重要。下面将具体介绍CDMT生成发布软件的具体过程，包括软盘、磁带和光盘。 <br />　　 <br />　　一、确定你的产品结构 <br />　　 <br />　　SCO OPENSERVER下，custom按照如下层次组织系统上安装的软件： <br />　　如产品SCO OpenServer 5.0.x被分成很多组件，如Xclient和Wserver,每一个组件又分成多个包，如man等。 <br />　　为了说明方便，我们所举的例中名称都取为一个，并且只有一个组件和一个包，名字全部为test。 <br />　　 <br />　　二、确定每个文件的属性 <br />　　 <br />　　属性有shared(/opt)和non－shared(/var/opt)之分，其中shared的文件为只读，non－shared的文件为可读可写。本处为说明方便，所举的例子中的文件全部为shared。 </p>
		<p>　　三、构件软件的目录结构 <br />　　 <br />　　所安装的test软件的目录结构为： <br />　　/usr/test/.profile <br />　　　　　　　database/ <br />　　　　　　　dblog/ <br />　　　　　　　bin/ <br />　　　　　　　tmp/ <br />　　 <br />　　四、设置CDMT的环境 <br />　　 <br />　　设置生成该Distribution的根目录CDMT－DIR环境变量，在命令行下键入： <br />　　＃CDMT－DIR=/usr/test <br />　　＃export CDMT－DIR <br />　　 <br />　　五、生成CDMT命令所需的输入文件 <br />　　 <br />　　包括三个文件，分别是： <br />　　＄CDMT－DIR/input/test.prd <br />＄CDMT－DIR/input/test.cmpnt <br />＄CDMT－DIR/input/test.pkg上述三个文件可以用vi生成，也可以用如下两条命令生成后用vi修改： <br />　　在＄CDMT－DIR目录下： <br />　　find.－print&gt;/tmp/TEST.files <br />cdmtConvert/tmp/TEST.files <br />在input目录下，生成了四个文件，其中一个是为生成cdmt.config文件的。 <br />　　转到＄CDMT－DIR目录下，执行命令： <br />　　＃vi＄CDMT－DIR/cdmt.config <br />　　在该文件下输入： <br />　　CONFIG： <br />　　ArchiveMedia=CD <br />　　CD－MEDIA: <br />　　DistCode=“CDDist” <br />　　再把input目录下的test.config文件中的内容拷贝到test.config中。 <br />　　以上的config文件是为生成光盘介质，生成其它介质的config也类似，可以参考随机手册。 <br />　　 <br />　　六、生成SSO树 <br />　　 <br />　　在CDMT－DIR宏已设定的条件下，在任何目录下(当然，一般都在＄CDMT－DIR/下)先后执行以下三个命令： <br />　　1cdmtParse,该命令软件存储对象(SSO)数据库，它读取CDMT的input文件，并把生成的SSO放在＄CDMT－DIR/sso下。 <br />　　2CdmtCompress,该命令构件SSO的目录，并压缩它。 <br />　　3CdmtArchive,该名另生成可custom安装的格式。 <br />　　 <br />　　七、从硬盘上移到指定介质上 <br />　　 <br />　　1若是FLOPPY，可以用以下命令 <br />　　cdmtArchive －media FLOPPY －copy <br />　　默认状态下，系统用cpio拷贝到软盘上，cpio有个缺点，不检查写得是否正确；用tar也一样。往往在多张软盘tar到硬盘上时，发现最后一张盘有问题，而不得不从头来。 <br />　　2若是TAPE，可以用以下命令 <br />　　cdmtArchive －media TAPE －copy <br />　　默认状态下，在磁带上生成一个文件系统。此步完成即完成整个制作过程。 <br />　　3若是CD介质，比较复杂 <br />　　(1)＃cd /usr/test/sso＃ls可在其下看见—opt目录 <br />　　(2)用mkisofs工具生成ISO9660的文件系统 <br />　　mkisofs可从internet上downlad下来，编译后可以使用 <br />　　mkisofs －r －T －o cd－image.iso <br />　　其中，表示对当前目录操作，不可改为opt。 <br />　　此时，在/usr/test目录下，生成文件cd－image.iso，该文件即是用来刻录的镜像文件。 <br />　　(3)把cd－image.iso移到windows操作系统下，在该操作系统下进行刻录。可以用ftp方式(windows和openserver不在同一计算机中)，也可以用mount方式(windows和openserver在同一计算机中)。用windows下的刻录软件刻录该软件。 <br />20．问题：Unix下如何访问DOS分区？ <br />答：mount /dev/hd0d /mnt 安装硬盘上的DOS分区，只能访问FAT16格式，不访问FAT32格式。 <br />21．问题：如何在系统启动时自动启动Oracl或其他应用程序？ <br />答：在/etc/rc中加入执行命令。或在 /etc/rc2.d目录下，建立脚本文件！！！就是建立一个文件，文件的内容就是你要启动应用程序的命令。如让系统启动时自动加上网关，可在/etc/rc2.d目录下 <br />#vi S96gateway（这个为文件名） <br />然后在S96gateway中写如下内容（其实就是加网关的命令） <br />route add default 192.168.1.1(如果你要启动应用程序，可在此换为你启动应用程序的命令)。 </p>
		<p>Oracle这样加： <br />vi S20dbadmin <br />su -u oracle -c svrmgrl&lt;&lt;EOF <br />connect internal <br />startup <br />exit <br />EOF <br />su -u oracle -c "lsnrctl start";启动侦听 <br />关机时自动关掉oracle在/etc/rc0.d目录里建一个文件 <br />vi K20dbadmin <br />su -u oracle -c svrmgrl&lt;&lt;EOF <br />connect internal <br />shutdown immediate <br />exit <br />EOF <br />su -u oracle -c "lsnrctl stop" <br />22．问题：sco unix5.06如何配置DNS？ <br />答：vi /etc/resolv.conf 内容为：nameserver xxx.xxx.xxx.xxx。xxx.xxx.xxx.xxx就是实际的DNS。 <br />23．问题：NetScape如何使用？ <br />答：1．加网关 <br />以超级用户登录，并键入以下命令： <br />route add default 192.168.0.1 (IP 地址为网关地址) <br />同时可以用vi /etc/rc2.d/S99route建立文件，使机器开机后会自动加载网关 <br />文件内容为： <br />route add default 192.168.0.1 <br />2. 加dns <br />修改/etc/resolv.conf，加入： <br />nameserver 192.168.0.1 <br />(nameserver为dns 服务器，后面的IP是dns服务器的IP) <br />重启即可 <br />3.netscape的代理配置： <br />edit-&gt;preferences-&gt;点击advanced前边的小三角形-&gt;proxies-&gt;manual proxy <br />configuration view 设置就行了。 <br />24．问题：ps/2鼠标在unix下设置的步骤是什么? <br />答：1 mkdev mouse <br />2 add a mouse to system <br />3 ps-2style keyboard mouse <br />4 high resolution keyboard-mouse <br />25．问题：我在修改scounix5.0.5 ip地址后，同时也把hostname修改了，（用netconfig命令，改网卡的tcp/ip属性）。但是重新链接后打入hostname命令显示主机名仍然为原来的，ping自己，别人（用修改后的ip地址）均正常。 能否告诉我如何把主机名也修改调？我这样修改为什么不幸？ <br />答：直接修改/etc/hosts文件或uuinstall,uname -S nodename 都可以. <br />26．问题：本单位有一台COMPAQ 3000 服务器，配一个4.3G SCIS硬盘，由于全部安装 <br />好informix 数据库数据后容量超过4.3G,现想在加一块4.3G SCIS硬盘专门存放informix 数据，问是否可行，如何实现？ <br />答：当然可以，首先使用超级用户mkdev hd 输入SCIS HOST ADAPTER ID（DEFAULT 0），LUN ID（DEFAULT 0），SCIS ID（硬盘的实际ID，例如4），然后用divvy分区，只要一个分区，做成裸设备名称为data（文件系统类型选用NON FS），做好后重新启动机器，修改属性chmod 666 /dev/rdata，chown informix：informix /dev/rdata；现在可以用INformIX用户执行tbmonitor（5。0 version）或者onmonitor（version 7。0以上），选择spaces-》add chunk，输入PATH：/dev/rdata，SIZE：2000000k，OFFSET：0，注意由于每个CHUNK 最多2G，所以只能SIZE输入最大200000K，增加第二个时只要OFFSET设置为2000001即可，增加第三个时为4000001。 <br />27．问题：请教挂接软驱、磁带机的命令--tar的具体用法？ <br />答：列文件 <br />tar tv6 <br />tar tv8 <br />向软盘、磁带上拷贝文件 <br />tar cv6 files <br />tar cv8 files <br />从软盘、磁带上拷贝文件到硬盘 <br />tar xv6 <br />tar xv8 <br />6、8代表设备名，在/etc/tar里面有详细的说明，最后一行为缺省的软盘设备。 <br />28．问题：何谓NFS？ <br />答：SCO NFS详解 <a href="http://www.xici.net/">http://www.xici.net/</a> 作者: 大鹰 (2001-05-11 20:38:11) <br />我现在向大家介绍一下SCO的NFS，在大都数UNIX版本中都用NFS（Net File System）来访 <br />问局域网内的远程文件系统。它是系统用户被动使用的工具，通常用户是感觉不到正在使用 <br />NFS。作为系统管理员，如果对NFS进行适当地配置，你的任务会变的更加容易，因为你的用 <br />户可以在网上透明地使用磁盘空间。 <br />NFS语序管理员将一个主机上整个文件系统或目录提供给其他主机使用，这些主机将磁盘空间 <br />看成是自己的一样。NFS通过语序用户安装（mount）远程磁盘资源来实现磁盘的共享，而安装 <br />远地磁盘资源与安装本地文件系统没有什么区别。 </p>
		<p>1，NFS概念 <br />　 作为一个系统管理员，你可能需要用mount命令手工在磁盘上安装文件系统。这种可安装文件系统的概念允许系统管理员以透明的方式给系统增加磁盘空间。 <br />　网络文件系统允许用户将远程主机的文件系统看做好象是本地文件系统一样，并且是可安装的，可读的和可写的。系统使用与本地文件系统一样的命令mount把NFS文件系统挂接在本地文件树结构上。但对这些文件系统的所有管理（如fsck,mkfs等）必须在实际拥有物理盘的系统上进行。 <br />2，NFS术语 <br />　拥有实际的物理磁盘并且通过NFS将这个磁盘共享的主机叫NFS文件服务器，通过NFS访问远程文件系统的主机叫NFS客户机。一个NFS客户机可以利用许多NFS服务器提供的服务。相反，一个NFS服务器可以与多个NFS客户机共享它的磁盘。一个共享了部分磁盘的NFS服务器可以是另一个NFS服务器的客户机。 <br />　 NFS服务器输出的目录叫远程资源并且通常写作：host : pathname 其中host是文件服务器的名字而pathname是服务器上被输出目录的绝对路径。 <br />　 远程资源被安装到客户机上的饿那个目录叫安装点（mount point)。 <br />3，NFS输入输出规则 <br />　 规则一：NFS输出目录。 <br />　 服务器输出的是目录而不是文件系统。 <br />　规则二：如果服务器已经输出了一个目录，如/usr/local，并且有一个文件系统安装在/usr/local <br />/extra，那么/usr/local/extra的内容在客户端看不到，除非服务器明确地输出了它，或客户机明确地安装了它。 <br />　规则三：客户机可以安装一个输出目录的子目录，前提是此子目录不是另一个文件系统。 <br />　规则四：一个主机不可以将一个输入的目录再次输出。例如，如果一个主机通过NFS安装/usr/local,它就不能将/usr/local输出给另外的主机。 <br />　规则五：一个已经输出目录的子目录不可以再输出，除非子目录在一个不同的文件系统上。这可能不太好明白，还是举个例子：假设你要按只读方式输出根文件系统的跟（/）目录，但是又要按读写方式输出/tmp目录。你不可能做到这一点，除非/tmp被安装在不同于跟的文件系统上。 <br />　 对NFS有大概的了解了么？下面我会向大家介绍NFS在SCO中的具体配置。 </p>
		<p>
				<br />　 了解了NFS的概念后，我们来看一下如何配置客户机和服务器。 <br />　 配置NFS客户机和服务器可以用scoadmin中的Filesystem Manager，也可以通过修改相关文件并执行简单的命令来手工配置（我推荐大家的是遇到这种配置问题，都要寻个究竟，具体到某某的配置文件，在自己的系统里调出来看看，修改修改，才能真正了解它，scoadmin是个好的管理工具，那是针对简单用户的，我们毕竟是高级用户嘛，哈哈这样无论是LINUX，SCO，SOLARIS对于你来说都是一样了。）。 <br />作为一个标准，用scoadmin执行大多数系统管理任务更容易一些。 <br />　 1，配置服务器 <br />配置NFS文件服务器非常简单，它只不过是把那些要输出的目录列出来，然后指明这些目录是向哪些客户机输出。 <br />　 scoadmin中输出一个新文件系统，选择scoadmin--Filesystem--Filesystem Manager--Export NFS--Add Export Configuration。按以下规则填充这个表。 <br />Directory to Export <br />　 输入希望输出的目录名。 <br />Read-only and Read-Write clients <br />　表上的这两个条目协同工作并指出文件系统是否以只读或读写方式输出。如果将Read-only Clients按钮设置为All systems，那么Read-Write按钮就默认为None。这表示目录将以只读方式输出，并且任何主机可以安装它。如果你将Read-only Clients按钮设为Selected Systems,那么Read-write clients按钮自动变为none。它表示目录以只读方式输出并且只有那些选择的主机可以安装输出的文件系统。如果你将Read-only clients按钮设为none，那么READ-WRITE CLIENTS按钮自动边为ALL。它表示目录以读写方式输出并且所有的主机可以安装输出的目录。 <br />　如果一个目录可以让一个主机以读写方式访问，那么这个主机可以按读写安装NFS文件系统或以只读方式安装。如果一个目录可以让一个主机以只读方式访问，那么这个主机只可以按只读方式安装NFS文件系统。 <br />Export Now <br />　 如果现在就要求Filesystem Manager运行exportfs,将这个选择设为Yes;如果设为No，那么输出将在瑕疵启动NFS时起作用。 <br />Advancded Options <br />　通过直接编辑/etc/exports文件而能得到所有NFS的特点没有在这个图形接口中全部体现出来，但是对大多数需要来说，接口提供的选择已经足够用了。 <br />　手工配置：在NFS文件服务器上配置和重新配置NFS服务器包括两个步骤：1，更改NFS服务器与其他系统共享的文件系统列表，并确定以什么方式与它们共享。在NFS中，共享又叫输出。这些信息保存在、/etc/exports文件中。2，同志mountd输出列表已经改变。可以通过exportfs命令来实现此目的。 <br />　 下面介绍一下/etc/exports文件。 <br />　 /etc/exports文件包含一个目录列表，这些不路就是NFS服务器共享给客户机的那些目录。可以将它配置成只允许一组限定的主机来访问一个NFS文件系统，或者配置成让网络上的所有主机都可以访问NFS文件系统。也可以对每个主机允许的访问权限进行配置，例如只读或读写。 <br />　注意：启动NFS守护进程的脚本文件叫/etc/nfs，它通常只启动用于NFS客户操作的守护进程。只有/etc/exports文件存在时，它才会启动用于NFS服务器的守护进程，如mountd。 <br />　不论你对/etc/exports文件做如何的修改操作，用户都需要巡行exportfs命令来通知mountd输出列表已经改变。按如下步骤操作： <br />-u选项运行exportfs，取消所有输出文件的输出。 <br />-a选项运行exportfs，将/etc/exports文件中现存记录都进行输出。 </p>
		<p>29．问题：怎样改x-windows中的刷新率？ <br />答：mkdev graphics <br />30．问题：如何安装IMG文件？ <br />答：用HD-COPY恢复到软盘进行安装。 <br />31．问题：装完网卡后，该机子ping通了局域网中其他机子，但是上不了网。 <br />该局域网是这样的：windows2000代理局域网中各机子上网。装有unix的机子通过交换机挂在局域网上。 <br />现在的问题是该机子怎样才能上网呢？又怎样共享其他机子上的资源呢？ 其他机子又如何共享该机子上的资源？ <br />答：在/etc/rc中加route add default windows2000代理机IP地址 1 <br />其他机子共享该机子上的资源通过telnet和ftp谢谢！ <br />运行netscape，提示没有DNS入口。该这么设置vi /etc/resolv.conf <br />内容为： <br />nameserver DNS地址(例如：202.102.128.68) <br />32．问题：怎样安装大硬盘？ <br />答：这个问题复杂一点，需要多费点笔墨。一般来SCO UNIX只能管 理8G以内的硬盘，如果你 <br />的硬盘大于8G，你的SCO UNIX也只能安装在前8G的空间里，而且 8G以外的硬盘分区也只能 <br />用WINDOWS下的fdisk或其它分区工具来做，DOS和UNIX的FDISK对 此无能为力。因此， <br />如果你要对一个大于8G的硬盘安双系统（也只能安装双系统，除非你 打算不用剩余的空间）， <br />你就应该按下面的方法做：（1）、在WIN998的DOS下划分硬盘区间，其中 主分区必须在8G以 <br />内，其余空间划给扩展分区。（2）、在UNIX下用FDISK将DOS主分区删 除，然后再创建一个 <br />分区给DOS（空间必须从第一块开始），然后将其余空间留给UNIX。 （3）、为了使UNIX创建 <br />的DOS分区能够使用，你可还要在DOS下用FDISK将UNIX下创建的 DOS主分区删除后重建。<br /></p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 10:53 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在solaris 10上安装oracle 10g</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14779.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 02:52:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14779.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14779.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14779.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14779.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14779.html</trackback:ping><description><![CDATA[
		<p>一、首先下载<br />solarisx86_CCD_10_1_0_3_Disk1.cpio.gz<br />solarisx86_CLIENT_10_1_0_3_Disk1.cpio.gz<br />solarisx86_CRS_10_1_0_3_Disk1.cpio.gz<br />solarisx86_DB_10_1_0_3_Disk1.cpio.gz</p>
		<p>然后看oracle 10g for solaris/x86 的快速安装指南。指南上说必须是solaris 9(我的是10),内存不能小于512M,交换分区大小,/tmp分区大小，可用空间我的机器都满足。不满足两个软件要求：<br />SUNWi1cs和SUNWi15cs没有安装。 要求安装一些补丁，补丁下载地址位于：<a href="http://sunsolve.sun.com/">http://sunsolve.sun.com/</a>。我用的是solaris 10/x86,因此我什么补丁也不打。</p>
		<p>二、必须建用户和组，oinstall和dba组，oracle用户。<br />groupadd oinstall<br />groupadd dba<br />useradd -g oinstall -G dba oracle<br />passwd oracle<br />建立oracle的基目录和数据库目录<br />mkdir -p /export/home/app/oracle<br />mkdir /export/home/oradata<br />改变目录的属主和组<br />chown -R oracle:oinstall /export/home/app/oracle<br />chown -R oracle:oinstall /export/home/oradata</p>
		<p>改变目录权限<br />chmod -R 775 /export/home/app/oracle<br />chmod -R 775 /export/home/oradata<br />三、设置内核参数</p>
		<p>sysdef |grep SEM<br />sysdef |grep SHM</p>
		<p>我按照以下步骤调整</p>
		<p>cd /etc<br />cp system system.orig<br />gedit system<br />添加以下内容：<br />set semsys:seminfo_semmni=100<br />set semsys:seminfo_semmns=1024<br />set semsys:seminfo_semmsl=256<br />set semsys:seminfo_semvmx=32767<br />set shmsys:shminfo_shmmax=4294967295<br />set shmsys:shminfo_semmni=100</p>
		<p>从新启动<br />四、设置oracle环境<br />以root身份登陆后<br />su - oracle<br />进入 /export/home/app/oracle<br />建立文件 .profile<br />内容如: umask=022<br />运行：<br />. ./.profile<br />ORACLE_BASE=/export/home/app/oracle<br />ORACLE_SID=sales<br />export ORACLE_BASE ORACLE_SID<br />env | more 看看正确吗？<br />五、安装<br />我进入 /home/yansw<br />gunzip solarisx86_DB_10_1_0_3_Disk1.cpio.gz<br />cpio -idcmv &lt;solarisx86_DB_10_1_0_3_Disk1.cpio<br />生成 Disk1<br />运行 .runInstaller<br />提示我的版本是solaris 5.10,退出！！</p>
		<p>六、修改 Disk1/install下的 oraparam.ini和oraparam.var文件,在5.8，5.9后面添加5.10<br />退出root,以oracle 身份登陆到Java Enviroment 或 CDE,找到 Disk1/runInstaller,双击运行它！<br />提示输入Inventory目录的完整路径时，我输入：</p>
		<p>/export/home/app/oracle/oraInventory<br />继续<br />打开其他终端，以root 身份运行 指定目录下的orainstRoot.sh<br />提示创建 /var/opt/oracle/oraInst.loc<br />转回正常安装界面，选继续，所安装产品的目录名称为 OraDblog_home1<br />路径为 /export/home/app/oracle/OraHome-1<br />选企业版，创建通用启动数据库。全局数据库名为 sales SID为： sales<br />选择数据库字符集为 ZHS16GBK<br />创建带样本方案的数据库。<br />选择存储机制时我选 文件系统。<br />制定位置：<br />/export/home/app/oracle/oradata<br />这个地方很明显我错了。我该指定：/export/home/oradata 后悔呀！<br />不启动自动备份。<br />所有用户使用同一口令：Iamafool<br />这个时候我还傻，忘了 SYS,SYSMON.....这几个都是Iamafool口令的用户了！</p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14779.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 10:52 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14779.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solaris 10 x86开启root远程telnet登陆</title><link>http://www.cppblog.com/wtxtools/archive/2006/11/07/14778.html</link><dc:creator>传统的浪漫</dc:creator><author>传统的浪漫</author><pubDate>Tue, 07 Nov 2006 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/wtxtools/archive/2006/11/07/14778.html</guid><wfw:comment>http://www.cppblog.com/wtxtools/comments/14778.html</wfw:comment><comments>http://www.cppblog.com/wtxtools/archive/2006/11/07/14778.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/wtxtools/comments/commentRss/14778.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wtxtools/services/trackbacks/14778.html</trackback:ping><description><![CDATA[
		<p>  Solaris 10和后续版本为了保护系统安全，缺省只提供ssh服务，而且还不允许root用户直接登录，这对于开发和调试系统的使用用户来说很不方便。在Solaris 10上开放telnet服务并允许root用户登录的方法如下：</p>
		<p>1. 打开telnet服务<br />  # svcadm enable telnet</p>
		<p>   svcadm是Solaris下最新的网络服务管理系统，要了解它和svcs的使用方法，请参见其帮助手册。<br />2. 开放root登录权限</p>
		<p>  修改/etc/default/login文件，注释掉其中的：<br />   CONSOLE=/dev/console</p>
		<p>3. 修改root用户的缺省shell为bash</p>
		<p>  修改/etc/passwd文件，将root用户的shell改为/usr/bin/bash</p>
		<p>  root:x:0:0:Super-User:/:/usr/bin/bash</p>
		<p>  不需要重新启动，你再试一试，哈哈，能够telnet登录了吧 <br /></p>
<img src ="http://www.cppblog.com/wtxtools/aggbug/14778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wtxtools/" target="_blank">传统的浪漫</a> 2006-11-07 10:51 <a href="http://www.cppblog.com/wtxtools/archive/2006/11/07/14778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>