The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

#

    在Linux 系统中,所有的用户和组像一个国家。如果国家要繁荣昌盛的话,需要治理得当,需要有主席或者总统,以及地方官员和老百姓组成。在linux 中如果你对安全需求比较苛刻,完全可以限制用户的各种行为,不同用户的权限是不同的。    
    在linux中系统中,它并不认识帐号名称。它认识的是我们的帐号ID,帐号ID保存在/etc/passwd文件中。我们在登录linux主机时,在输入完帐号和密码时,linux会先查找/etc/passwd文件中是否有这个帐号,如果没有则跳出,如果有的话,他会读取该帐号的user ID和group ID同时该帐号的根目录和shell也读了出来。然后在去核对密码表,在/etc/shadow中找出我们刚刚输入的帐号和userID,核对我们输入密码是否正确。一切正确我们可以登录到当前用户shell。那么,我们首先了解一下用户帐号文件。
    用户管理一般需要知道      /etc/passwd  /etc/shadow  /etc/group 
    add by warden2010 20100104
    1./etc/passwd我们使用more查看一下这个文件
    我们首先看第一行root这一行,一共有七项,每一项使用:分开,他们代表的意思如下:
    帐号名称:帐号名称由于对应用户ID,这个是系统默认用户root超级管理员,在同一个系统帐号名称是唯一的,长度根据不同的linux系统而定,一般是8位。
    密码:由于系统中还有一个/etc/shadow文件用于存放加密后的口令,所以在这里这一项是“x”来表示,如果用户没有设置口令,则该项为空。
    用户ID:这个是系统内部用于来识别不同的用户的,不同的用户识别码不同,其中用户ID有以下几种:
    0代表系统管理员,如果你想建立一个系统管理员的话,可以建立一个普通帐户,然后将该账户的用户ID改为0即可。
    1-500系统预留的ID,500以上是普通用户使用。
    组ID:其实这个和用户ID差不多,用来规范群组,他与/etc/group有关。

    描述信息:这个字段几乎没有什么作用,只是用来解释这个帐号的意义。

    用户根目录:就是用户登录系统的起始目录,用户登录系统后将首先进入该目录。root用户默认的是/root,普通用户的是/home/用户名。

    用户登录shell:就是用户登录系统时使用的shell,关于shell我们会在以后专门的研究一下。

    2./etc/shadow

    在早期的unix操作系统中,用户的帐号信息和口令信息都保存在passwd文件中,尽管系统已经对口令进行了加密,并且以密文的方式保存在passwd文件中,但是由于passwd文件对于系统中的所有用户是可读的,口令比较容易破解,存在较大的安全隐患。现在使用“shadow”文件保存密文的用户口令,使用passwd文件保存用户帐号其它信息。“shadow”文件只有管理员用户才可以读取其中的内容。由于这个文件可能被破解,所以一定不要将该文件内容泄露给他人,保证系统安全。

    同样,我们还是分析第一行,一共有九项,分别说明一下:

    帐户名称:和passwd对应,和passwd的意思相同。

    密码:这才是真正的密码,并且已经加密过了,只能看到一些特殊符号。需要注意的是这些密码很难破解,但是不等于不能。还有密码栏的第一个字符为“*”表示这个用户不用来登录,如果那个用户不想让他登录了,可以在他前面加个星。

    上次改动密码的日期:这段记录了改动密码的最后日期,为什么是13798呢?这是因为linux计算日期的方法是以1970年1月1日作为1,1971年1月1日就是366,依次类推到我修改密码的日期表示为13798了。

    密码不可被改动的天数:由于害怕密码被人盗取而危害到整个系统的安全,所以安排了这个字段,你必须在这个时间内重新修改密码,否则这个帐号将暂时失效。上面的99999,表示密码不需要重新输入,最好设定一段时间修改密码。确保系统安全。

    密码变更期期限快到前的警告期:当帐号的密码失效期限快到时,系统依据这个字段的设定发出警告,提醒用户“再过n天您的密码将过期,请尽快重新设定密码。默认的是七天。

    帐号失效期:如果用户过了警告期没有重新输入密码,使得密码失效,而该用户在这个字段限定的时间内又没有向管理员反映,让帐号重新启用,那么这个帐号将暂时失效。

    帐号取消日期:这个日期跟第三个字段一样,都是使用1970年以来的日期设定方法。这个字段表示:这个帐号在此字段规定的日期之后将无法再使用。这个字段通常用于收费服务系统中,可以规定一个日期让该帐号不能再使用。

    保留:最后一个字段是保留的,看以后有没有新功能加入。

    3. /etc/group查看一下这个文件

    我们还是分析第一行,一共有四项,依次为:

    群组名称:就是群组的名称了。

    群组密码:通常不需设定,因为我们很少使用群组登录。不过这个密码也被记录在/etc/gshadow中了。

    群组ID:也就是组ID了。

    支持帐号的名称:这个群组的所有帐号。如果你想让用户qiuri也属于root这个群组,就在第一行最后加上“,qiuri”注意添加的时候没有空格。

    4. adduser添加用户

    如果没有特殊的要求,通常我们使用adduser 用户名称直接创建用户帐号。例如我们创建qiuri帐户:

    由于一般新创建的帐号都会在刚才我们说的三个文件的最后一行添加一行内容,我们验证一下:

    我们使用这条命令是通过/etc/login.defs和/etc/default/useradd这两个默认帐号设定文件来实现创建用户的。

    这个文件中我们有必要了解一下,SKEL这个选项,用户的根目录内容是从/etc/skel这个目录下复制过去的。在手动添加用户的时候有用。查看一下这个目录下的内容:

    这条命令还有好多的参数举例几个,供大家参考一下:

    adduser [-u uid][-g group][-d home][-s shell]

    -u:直接给出userID -g:直接给出GID

    -d:直接将根目录建立在已存在目录 -s:定义shell

    5.passwd设置用户密码
    默认的情况下,在添加完用户后并没有设置用户的密码,因此建立的用户帐号即使存在也不能登陆系统。需要使用passwd命令对用户帐号设置密码才可以用于登陆系统。这条命令分为管理员给用户修改密码和用户自己登录系统自己修改密码。

    管理员root给用户修改密码,例如:创建用户qiuri,然后设置密码

    管理员给用户设置密码以命令passwd [用户名]来设置密码,在输入密码的过程中为了避免输入错误,将连续输入两次。如果两次输入的密码相同,表示输入的密码正确,同时将密码以加密的方式保存到了shadow文件中。设置完以后我们可以使用用户qiuri登录。qiuri用户自己修改一下密码。
    . 增加一个新用户 
    以下是操作一些具体的语法,可以通过man useradd 查看帮助命令
    在Linux系统中,只有root用户才能够创建一个新用户,如下的命令将新建一个登录名user1的用户。 
    # useradd user1 
    但是,这个用户还不能够登录,因为还没给它设置初始密码,而没有密码的用户是不能够登录系统的。在默认情况下,将会在/home目录下新建一个与用户名相同的用户主目录。如果需要另外指定用户主目录的话,那么可以使用如下命令: 
    # useradd -d /home/xf user1 
    同时,该用户登录时将获得一个Shell程序:/bin/bash,而假如你不想让这个用户登录,也就可以指定该用户的Shell程序为:/bin/false,这样该用户即使登录,也不能够执行Linux下的命令: 
    # useradd -s /bin/false user1 
    在Linux中,新增一个用户的同时会创建一个新组,这个组与该用户同名,而这个用户就是该组的成员。如果你想让新的用户归属于一个已经存在的组,则可以使用如下命令: 
    # useradd -g user user1 
    这样该用户就属于user组的一员了。而如果只是想让其再属于一个组,那么应该使用: 
    # useradd -G user user1 
    完成了这一操作后,你还应该使用passwd命令为其设置一个初始密码。 
    
    2. 删除一个用户 
    删除用户,只需使用一个简单的命令“userdel 用户名”即可。不过最好将它留在系统上的文件也删除掉,你可以使用“userdel -r 用户名”来实现这一目的。 
    
    3. 修改用户属性 
    在前面我们看到了在新建一个用户的时候如何指定它的用户主目录,如何指定它的Shell,如何设置它所属的组…等等。在Linux中提供了一个命令来实现: 
    usermod -g组名 -G 组名 -d 用户主目录 -s 用户Shell 
    还有一种直接的方法,那就是修改/etc/passwd文件,在这个文件中每个用户占用一行,它的内容为: 
    用户名:密码:用户ID:组ID:用户全名:用户主目录:用户Shell 
    不过值得注意的是,密码这一项通常是用一个*号代替的,你是看不到的。 
    
    4. 增加一个组 
    还记得Linux的文件可以为同组的人、非同组的人设置不同的访问权限吗?我们可以根据自己的需要创建用户组: 
    groupadd 组名 
    
    5. 删除一个组 
    同样的,我们有时会需要删除一个组,它的命令就是groupdel 组名。 
    
    6. 修改组成员 
    如果我们需要将一个用户加入一个组,只需编辑/etc/group文件,将用户名写到组名的后面。例如将newuser用户加入到softdevelop组,只需找到softdevelop这一行: 
    softdevelop:x:506:user1,user2 
    然后在后面加上newuser,形成: 
    softdevelop:x:506:user1,user2,newuser 
    另外,在Red Hat Linux中还提供一个图形化的用户管理工具:userconf,通过它可以更直接地进行用户管理。

posted @ 2013-06-15 22:55 Eric_jiang 阅读(229) | 评论 (0)编辑 收藏

按ESC键 跳到命令模式,然后:

:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
q: 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑
posted @ 2013-06-15 21:27 Eric_jiang 阅读(2437) | 评论 (0)编辑 收藏

1.在图像界面关闭x window:
1.1 shell中运行 init 3  进入文本模式,同时会关闭相关的服务(Xserver 肯定关闭)
1.2 Alt+Ctrl+F1~F6到字符界面,root登陆,ps aux|grep /usr/X11R6/bin/X,得到X进程号,
kill -9 进程号,其实这时已经到文本界面了,没必要关X。(这样太粗鲁了)
2.如果你想一开机后不进入X Window:
编辑/etc/inittab
vi /etc/inittab
id:5:initdefault:改成
id:3:initdefault:
:x 文件保存
:q 退出VI
3.在文本模式打开图形界面(X window):
在shell中输入:startx 或者 init 5
      1.进入字符界面
  为了在Linux启动时直接进入Console界面,我们可以编辑/etc/inittab文件。找到id:5: initdefault:这一行,将它改为id:3:initdefault:后重新启动系统即可。我们看到,简简单单地将5改为3,就能实现启动时进入X-window图形操作界面或Console字符界面的转换,这是因为Linux操作系统有六种不同的运行级(run level),在不同的运行级下,系统有着不同的状态,这六种运行级分别为:
  0:停机(记住不要把initdefault 设置为0,因为这样会使Linux无法启动 )
  1:单用户模式,就像Win9X下的安全模式。
  2:多用户,但是没有 NFS 。
  3:完全多用户模式,标准的运行级。
  4:一般不用,在一些特殊情况下可以用它来做一些事情。
  5:X11,即进到 X-window 系统。
  6:重新启动 (记住不要把initdefault 设置为6,因为这样会使Linux不断地重新启动)。
  其中运行级3就是我们要进入的标准Console字符界面模式。
  2.自由转换字符界面和X-window图形界面
  在了解了启动自动进入X-window图形操作界面和Console字符操作界面的转换后,也许你会想,这两种操作界面各有各的好处,我能不能“贪心”一点,同时拥有这两种操作界面呢?在无所不能的Linux操作系统中,这个要求当然是可以得到满足的。
  在X-window图形操作界面中按“Alt+Ctrl+功能键Fn n=1~6 ”就可以进入Console字符操作界面。这就意味着你可以同时拥有X-window加上6个Console字符操作界面,这是一件多么令人振奋的事情啊!
  在Console字符操作界面里如何回到刚才的X-window中呢?很简单,按“Alt+Ctrl+F7”即可。这时Linux默认打开7个屏幕,编号为tty1~tty7。X-window启动后,占用的是tty7号屏幕,tty1~tty6仍为字符界面屏幕。也就是说,用“Alt+Ctrl+Fn”组合键即可实现字符界面与X window界面的快速切换。
Linux的老用户们都知道,X-window是一个非常方便地图形界面,它能使用户用鼠标最简单的进行操作,但是它也有不少缺点:比如启动和运行速度慢、稳定性不够、兼容性差、容易崩溃等。但是一旦X-window系统出了问题,并不会使整个Linux系统的崩溃而导致数据丢失或系统损坏,因为当X-window由于自身或应用程序而失去响应或崩溃时,我们可以非常方便地退出X-window进入Console进行故障处理,要做的只是按“Alt+Ctrl+Backspace”键,这意味着只要系统没有失去对键盘的响应,X-window出了任何问题,都可以方便地退出。
posted @ 2013-06-15 13:29 Eric_jiang 阅读(402) | 评论 (0)编辑 收藏

Android is a Linux-based operating system designed primarily for touchscreen mobile devices such as smartphones and tablet computers, developed by Google in conjunction with the Open Handset Alliance. The Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language. Apache log4j is a logging library for Java and an Apache Software Foundation Project and developed by a dedicated team of Committers of the Apache Software Foundation. Here we will explain how to integrate Log4J in Android based Java applications.

Step 1

Download Log4J library from http://logging.apache.org/log4j/1.2/download.html

Step 2

Configuring Log4J library the normal way - using XML configuration file - can't be used in Android based Java application as the configuration classes of Log4J use beans from the package "java.beans" (e.g. PropertyDescriptor). Not all classes of this package are supported in Android, so using Log4J directly in Android Java application will case exceptions like the following one to be thrown:

11-23 09:44:56.947: D/dalvikvm(1585): GC_FOR_MALLOC freed 3278 objects / 311568 bytes in 31ms
rejecting opcode 0x21 at 0x000a
rejected Lorg/apache/log4j/config/PropertySetter;.getPropertyDescriptor
(Ljava/lang/String;)Ljava/beans/PropertyDescriptor;
Verifier rejected class Lorg/apache/log4j/config/PropertySetter;
Exception Ljava/lang/VerifyError; thrown during Lorg/apache/log4j/LogManager;.
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x400259f8)
FATAL EXCEPTION: main
java.lang.ExceptionInInitializerError
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:64)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:253)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:265)
...
Caused by: java.lang.VerifyError: org.apache.log4j.config.PropertySetter
at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:772)
at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)
at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:547)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:483)
at org.apache.log4j.LogManager.(LogManager.java:127)
... 20 more

There is a project called android-logging-log4j, which provides a convenient way to configure the log4j system properly.

Download "Android Logging Log4J" library from http://code.google.com/p/android-logging-log4j/downloads/list

Step 3

Add Both libraries "log4j" and "android-logging-log4j" to your application libraries

Step 4

In order to log to a file on the external storage, the following permission needs to be placed in AndroidManifest.xml

  1. <uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />

Step 5

In your application Main class:

  1. package com.android.myapp ;
  2.  
  3. import java.io.File ;
  4.  
  5. import org.apache.log4j.Level ;
  6. import org.apache.log4j.Logger ;
  7.  
  8. import android.app.Application ;
  9. import android.os.Environment ;
  10. import de.mindpipe.android.logging.log4j.LogConfigurator ;
  11.  
  12. public class MyApplication extends Application {
  13.         @Override
  14.         public void onCreate ( ) {
  15.                 super . onCreate ( ) ;
  16.                 LogConfigurator logConfigurator = new LogConfigurator ( ) ;
  17.                 logConfigurator. setFileName ( Environment . getExternalStorageDirectory ( )
  18.                                 + File . separator + "MyApp" + File . separator + "logs"
  19.                                 + File . separator + "log4j.txt" ) ;
  20.                 logConfigurator. setRootLevel ( Level. DEBUG ) ;
  21.                 logConfigurator. setLevel ( "org.apache" , Level. ERROR ) ;
  22.                 logConfigurator. setFilePattern ( "%d %-5p [%c{2}]-[%L] %m%n" ) ;
  23.                 logConfigurator. setMaxFileSize ( 1024 * 1024 * 5 ) ;
  24.                 logConfigurator. setImmediateFlush ( true ) ;
  25.                 logConfigurator. configure ( ) ;
  26.                 Logger log = Logger. getLogger ( MyApplication. class ) ;
  27.                 log. info ( "My Application Created" ) ;
  28.         }
  29. }

Now you will have log4j configured to log to Path: (Environment.getExternalStorageDirectory() + File.separator + "MyApp" + File.separator + "logs" + File.separator + "log4j.txt") with DEBUG level and ERROR lever for "org.apache" package with file pattern "%d %-5p [%c{2}]-[%L] %m%n" and other configuration parameters

posted @ 2013-06-07 14:02 Eric_jiang 阅读(503) | 评论 (0)编辑 收藏

安装Apache SOAP
  下载需要的资源:
   Apache SOAP 2.3 http://apache.linuxforum.net/dist/ws/soap/version-2.3.1/soa
p-bin-2.3.1.zip
   mail.jar from JavaMail http://java.sun.com/products/javamail
   activation.jar from JavaBeans Activation Framework http://java.sun.com/prod
ucts/beans/glasgow/jaf.html
   a JAXP compatible, namespace-aware XML parser such as Apache Xerces (v1.1.2
 or later) http://xml.apache.org/xerces-j
   Tomcat 4.1.x http://jakarta.apache.org/tomcat
   安装tomcat:
      网上很多介绍的文章,这里不再赘述。
   安装Apache SOAP:
      把下载回来的soap-2.3.1.zip解压到c:\soap-2_3_1。把c:\soap-2_3_1\lib下的两
个文件复制到%TOMCAT_HOME%\common\lib下面;把c:\soap-2_3_1\webapps下的soap.war
复制到%TOMCAT_HOME%\webapps下面;把其他的几个jar文件(mail.jar,activation.jar,x
erces.jar)复制到%TOMCAT_HOME%\common\lib下面。
   设置classpath变量:
      把上面的四个jar文件路径添加到classpath变量中
      %TOMCAT_HOME%\common\lib\soap.jar
      %TOMCAT_HOME%\common\lib\mail.jar
      %TOMCAT_HOME%\common\lib\activation.jar
      %TOMCAT_HOME%\common\lib\xerces.jar
      PS:我的做法是把这四个jar文件合成一个soap-all.jar文件,并不路径添加到clas
spath中去,这样省点事。
   测试客户端配置:
      1.打开web浏览器,访问http://127.0.0.1:8080/soap/servlet/rpcrouter,如果出
现提示: “Sorry, I don't speak via HTTP GET- you have to use HTTP POST to tal
k to me”,第一步测试通过。
      2.命令行测试:在命令行下输入下面命令 
        >java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:808
0/soap/servlet/rpcrouter list
        如果输出只是"Deployed Services:",没有得到其他任何输出信息,否则请检查
classpath配置是否正确
运行HelloWorldService服务
   HelloWorldService.java
   __________________________________   
     public class HelloWorldService
    {
      String getMessage()
       {
        return "Hello World!";
       }
    }
   _________________________________
   创建部署描述符:
   部署描述符其实就是一个xml文件。当SOAP请求被发送给org.apache.soap.server.htt
p.RPCRouterServlet时,RPCRouterServlet使用部署描述符来决定把请求路由至何处。下
面将叙述用Apache SOAP的命令行工具注册服务。
   HelloWorld.xml
   ---------------------------------
   <?xml version="1.0"?>
    <isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment" id="urn
:HelloWorldService">
     <isd:provider type="java" scope="Request" methods="getMessage">
     <isd:java class="HelloWorldService" static="false"/>
     </isd:provider>
   </isd:service>
   ---------------------------------
   注册服务:
   在命令行下输入(注意要在HelloWorldService.xml文件所在目录下)
   > java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/so
ap/servlet/rpcrouter deploy HelloWorld.xml
   如果没有错误提示则注册成功,可以用下面的几个命令来查看已经注册的服务
   > java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/so
ap/servlet/rpcrouter list
   出现提示“Deployed Services: urn:HelloWorldService”
   注销服务:
   > java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/so
ap/servlet/rpcrouter undelpoy "urn:HelloWorldService"
   还可以查询服务属性:
   > java org.apache.soap.server.ServiceManagerClient http://127.0.0.1:8080/so
ap/servlet/rpcrouter query "urn:HelloWorldService"
  HelloWorld服务客户端
  HelloWorldClient.java
  _______________________
import org.apache.soap.Constants;
import java.net.URL;
import org.apache.soap.Fault;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Response;
import org.apache.soap.rpc.Parameter;

public class HelloWorldClient {
  static String DEFAULT_ENDPOINT = "http://localhost:8080/soap/servlet/rpcrout
er";

  public static void main(String args[]) throws Exception {

    String endPoint = DEFAULT_ENDPOINT;

    //Process Arguments
    if (args.length == 1)
      endPoint = args[0];
    else if (args.length > 1)
      System.out.println("java HelloWorldClient [endpoint]");

      // Build the SOAP RPC request message using the Call object
      Call call = new Call();
      call.setTargetObjectURI("urn:HelloWorldService");
      call.setMethodName("getMessage");
      call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);

      // Create a URL object, which represents the endpoint
      URL url = new URL(endPoint);

      // Send the SOAP RPC request message using invoke() method
      Response resp = call.invoke(url, "");

      // Check the response.
      if (resp.generatedFault()) { // Error Occured
        Fault fault = resp.getFault();
        System.out.println("The Following Error Occured: ");
        System.out.println("  Fault Code   = " + fault.getFaultCode());  
        System.out.println("  Fault String = " + fault.getFaultString());
      } else { // Completed Successfully
        Parameter result = resp.getReturnValue();
        System.out.println(result.getValue());
      }
  }
}
-----------------------------------------------
     运行服务:
     首先把HelloWorldService.class打包成jar文件放到%tomcat_home%/common/lib或者
直接把HelloWorldService.class放到%tomcat_home%/common/classes下
     按照上面讲的方法注册服务,然后运行HelloWorldClient,屏幕输出"HelloWorld!"

 

posted @ 2013-05-31 11:03 Eric_jiang 阅读(237) | 评论 (0)编辑 收藏

点击图片查看8地市120家大米镉含量超标名单

(通讯员粤食安)今年4月,广东省组织省开展了大米质量安全摸查工作,摸查结果日前已经向社会公布。广东省各地食品安全监管部门也加强了对辖区内大米生产、流通、餐饮等环节大米进行抽检。截至5月22日,省食安办共收到10个地市上报大米镉含量抽检数据,其中广州等8个地市有不合格批次,茂名、潮州等2个地市全部合格。现将大米镉含量抽检不合格名单予以公布。

在不合格名单中,超标最严重的是由清远市清城区石角粮食管理所粮食加工厂生产的连州油粘米,超标将近6倍,每公斤达含镉量达1.12毫克(标准值为不超过0.2毫克。)

省食安办要求各地对抽检中发现的问题及时追踪,对不合格大米就地封存,切实做好后续处置工作,依法从严查处粮食质量安全案件,严厉打击粮食质量安全违法犯罪行为。

附:

镉大米名单第二批120批次

镉大米名单第一批39批次

posted @ 2013-05-23 22:33 Eric_jiang 阅读(170) | 评论 (0)编辑 收藏

读属性文件
Properties prop = new Properties();
InputStream in = getClass().getResourceAsStream("/IcisReport.properties");
prop.load(in);
Set keyValue = prop.keySet();
for (Iterator it = keyValue.iterator(); it.hasNext();)
{
String key = (String) it.next();
}
------------------------
outputFile = new FileOutputStream(fileName);
propertie.store(outputFile, description);
outputFile.close();
-----------------------------------------------------------------------------------------
Class.getResourceAsStream ("/some/pkg/resource.properties");
ClassLoader.getResourceAsStream ("some/pkg/resource.properties");
java.util.ResourceBundle rs = java.util.ResourceBundle.getBundle("some.pkg.resource");
rs.getString("xiaofei");
-----------------------------------------------------------------------------------------
写属性文件
Configuration saveCf = new Configuration();
saveCf.setValue("min", "10");
saveCf.setValue("max", "1000");
saveCf.saveFile(".\config\save.perperties","test");

总结:java的properties文件需要放到classpath下面,这样程序才能读取到,有关classpath实际上就是java类或者库的存放路径,在java工程中,properties放到

class文件一块。在web应用中,最简单的方法是放到web应用的WEB- INF\classes目录下即可,也可以放在其他文件夹下面,这时候需要在设置classpath环境变量的

时候,将这个文件夹路径加到 classpath变量中,这样也也可以读取到。在此,你需要对classpath有个深刻理解,classpath绝非系统中刻意设定的那个系统环境变


量,WEB-INF\classes其实也是,java工程的class文件目录也是。

发个例子大家自己看哈.
package control;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

public class TestMain {
 
 //根据key读取value
 public static String readValue(String filePath,String key) {
  Properties props = new Properties();
        try {
         InputStream in = new BufferedInputStream (new FileInputStream(filePath));
         props.load(in);
         String value = props.getProperty (key);
            System.out.println(key+value);
            return value;
        } catch (Exception e) {
         e.printStackTrace();
         return null;
        }
 }
 
 //读取properties的全部信息
    public static void readProperties(String filePath) {
     Properties props = new Properties();
        try {
         InputStream in = new BufferedInputStream (new FileInputStream(filePath));
         props.load(in);
            Enumeration en = props.propertyNames();
             while (en.hasMoreElements()) {
              String key = (String) en.nextElement();
                    String Property = props.getProperty (key);
                    System.out.println(key+Property);
                }
        } catch (Exception e) {
         e.printStackTrace();
        }
    }

    //写入properties信息
    public static void writeProperties(String filePath,String parameterName,String parameterValue) {
     Properties prop = new Properties();
     try {
      InputStream fis = new FileInputStream(filePath);
            //从输入流中读取属性列表(键和元素对)
            prop.load(fis);
            //调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
            //强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
            OutputStream fos = new FileOutputStream(filePath);
            prop.setProperty(parameterName, parameterValue);
            //以适合使用 load 方法加载到 Properties 表中的格式,
            //将此 Properties 表中的属性列表(键和元素对)写入输出流
            prop.store(fos, "Update '" + parameterName + "' value");
        } catch (IOException e) {
         System.err.println("Visit "+filePath+" for updating "+parameterName+" value error");
        }
    }

    public static void main(String[] args) {
     readValue("info.properties","url");
        writeProperties("info.properties","age","21");
        readProperties("info.properties" );
        System.out.println("OK");
    }


 发个例子大家自己看哈.

package control;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Properties;

public class TestMain {
 
 //根据key读取value
 public static String readValue(String filePath,String key) {
  Properties props = new Properties();
        try {
         InputStream in = new BufferedInputStream (new FileInputStream(filePath));
         props.load(in);
         String value = props.getProperty (key);
            System.out.println(key+value);
            return value;
        } catch (Exception e) {
         e.printStackTrace();
         return null;
        }
 }
 
 //读取properties的全部信息
    public static void readProperties(String filePath) {
     Properties props = new Properties();
        try {
         InputStream in = new BufferedInputStream (new FileInputStream(filePath));
         props.load(in);
            Enumeration en = props.propertyNames();
             while (en.hasMoreElements()) {
              String key = (String) en.nextElement();
                    String Property = props.getProperty (key);
                    System.out.println(key+Property);
                }
        } catch (Exception e) {
         e.printStackTrace();
        }
    }

    //写入properties信息
    public static void writeProperties(String filePath,String parameterName,String parameterValue) {
     Properties prop = new Properties();
     try {
      InputStream fis = new FileInputStream(filePath);
            //从输入流中读取属性列表(键和元素对)
            prop.load(fis);
            //调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。
            //强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。
            OutputStream fos = new FileOutputStream(filePath);
            prop.setProperty(parameterName, parameterValue);
            //以适合使用 load 方法加载到 Properties 表中的格式,
            //将此 Properties 表中的属性列表(键和元素对)写入输出流
            prop.store(fos, "Update '" + parameterName + "' value");
        } catch (IOException e) {
         System.err.println("Visit "+filePath+" for updating "+parameterName+" value error");
        }
    }

    public static void main(String[] args) {
     readValue("info.properties","url");
        writeProperties("info.properties","age","21");
        readProperties("info.properties" );
        System.out.println("OK");
    }
}
posted @ 2013-05-17 09:51 Eric_jiang 阅读(205) | 评论 (0)编辑 收藏

    电线的规格在国际上常用的有三个标准:分别是美制(AWG)、英制(SWG)和我们的(CWG)。
    几平方是国家标准规定的的一个标称值,几平方是用户根据电线电缆的负荷来选择电线电缆。
    电线平方数是装修水电施工中的一个口头用语,常说的几平方电线是没加单位,即平方毫米。
    电线的平方实际上标的是电线的横截面积,即电线圆形横截面的面积,单位为平方毫米。
    一般来说,经验载电量是当电网电压是220V时候,每平方电线的经验载电量是一千瓦左右。
    铜线每个平方可以载电1-1.5千瓦,铝线每个平方可载电0.6-1千瓦。因此功率为1千瓦的电器只需用一平方的铜线就足够了。
    具体到电流,短距送电时一般铜线每平方可载3A到5A的电流。散热条件好取5A/平方毫米,不好取3A/平方毫米。
换算方法:
    知道电线的平方,计算电线的半径用求圆形面积的公式计算:
    电线平方数(平方毫米)=圆周率(3.14)×电线半径(毫米)的平方
    知道电线的平方,计算线直径也是这样,如:
    2.5方电线的线直径是:2.5÷ 3.14 = 0.8,再开方得出0.9毫米,因此2.5方线的线直径是:2×0.9毫米=1.8毫米。
知道电线的直径,计算电线的平方也用求圆形面积的公式来计算:
    电线的平方=圆周率(3.14)×线直径的平方/4
    电缆大小也用平方标称,多股线就是每根导线截面积之和。
电缆截面积的计算公式:
    0.7854 × 电线半径(毫米)的平方 × 股数
    如48股(每股电线半径0.2毫米)1.5平方的线:
    0.785 ×(0.2 × 0.2)× 48 = 1.5平方

 (国标1.5平方 导体直径1.38 BV 塑铜线 ## BLV 塑铝线)
(国标2.5平方 导体直径1.78 BV 塑铜线 ## BLV 塑铝线)
(国标4平方 导体直径2.25 BV 塑铜线 ## BLV 塑铝线)
(国标6平方 导体直径2.76 BV 塑铜线 ## BLV 塑铝线)
(国标10平方 导体直径1.33*7 BV 塑铜线 ## BLV 塑铝线)
(国标16平方 导体直径170*7 BV 塑铜线 ## BLV 塑铝线)
(国标25平方 导体直径210*7 BV 塑铜线 ## BLV 塑铝线)
(国标35平方 导体直径250*7 BV 塑铜线 ## BLV 塑铝线)
(国标50平方 导体直径178*19 BV 塑铜线 ## BLV 塑铝线)
(国标70平方 导体直径210*19 BV 塑铜线 ## BLV 塑铝线)
( 国标95平方 导体直径250*19BV 塑铜线 ## BLV 塑铝线)

25℃时铜线的载流量是
    1mm     15A
    1.5      18A
    2.5      26A
    4       38A
    6       44A
    10      68A
    16      80A
    25       109A
    35       125A
    50       163A
    70       202A
    95       243A
    120       285A
    150       320A



如果是铜芯线: 
1.5平方最大可承载12A——13.5A
2.5平方最大可承载16A——18A
4平方最大可承载32A——36A
6平方最大可承载48A——54A

如果是铝芯线: 
1.5平方最大可承载6A——6.75A
2.5平方最大可承载8A——9A
4平方最大可承载16A——18A
6平方最大可承载24A——27A

1.5P空调器的制冷量是3300W,按能效比2.8计,电功率约1178W,工作电流约5.4A。单相电机的启动电流是工作电流的5-7倍,即启动电流为32A左右,持续时间不长。两台空调器同时启动,瞬间电流可以达到65A左右。


电线多少平方,指的是电线导体的截面积。 能一眼看出来的,是凭经验,目测。 6mm^2的直径是1.38mm;4mm^2的直径是1.13mm;2.5mm^2的直径是0.89mm
posted @ 2013-05-17 09:18 Eric_jiang 阅读(212) | 评论 (0)编辑 收藏

1广东省博物馆(APM线歌剧院)
2农讲所纪念馆(1号线农讲所)
3黄埔军校旧址纪念馆 (5号线鱼珠站,下车后还有1.4公里才到目的地)
4三元里抗英斗争纪念馆(2号线三元里B出口)
5广州起义纪念馆(1或2号线公园前J出口)
6 "三.二九”起义指挥部旧址纪念馆(1号线农讲所D出口)
7陈树人纪念馆(1号线东山口A出口)
8高剑父纪念馆(2号线越秀公园E出口)
9东征烈士陵园
10詹天佑纪念馆(1号线黄沙B出口)
11天河区博物馆
12番禺博物馆
13冼星海纪念馆
14花都区博物馆
15从化市博物馆
16增城市博物馆
17东风公园(3号线林和西C出口,下车后还有1.3公里)
18云溪生态公园
19广州儿童公园
20人民公园(1号线公园前H出口)
21海珠广场(2号线海珠广场)
22庄头公园(8号线沙园站,下车后还有1.3公里)
23海印公园
24磨碟沙公园(8号线赤岗站D2出口,下车后还有1.2公里)
25增埗公园(5号线西村站D出口,下车后还有1公里)
26醉观公园(1号线芳村站C出口)
27青年公园(5号线中山八站D出口)
28沙面公园(1号线黄沙站D出口)
29大夫山森林公园
30芙蓉旅游度假区(花都)
31九龙湖社区(花都) 
32花果山公园(花都) 
33萝岗香雪公园
34义务植树园
35凤凰山公园
36湖心岛
37中山纪念堂(主体建筑和陈列馆除外)(2号线纪念堂D2出口)
38东平大押(1号线农讲所B出口)
1越秀公园(2号线越秀公园站)
2流花湖公园
3文化公园
4黄花岗公园(5号线区庄站E出口)
5广州起义烈士陵园(1号线烈士陵园站)
6珠江公园(5号线猎德C出口)
7雕塑公园
8聚芳园
9星海园
10东山湖公园
11三元里抗英斗争纪念公园(2号线三元里站A1出口)
12荔湾湖公园(5号线中山八站D出口) 
13双桥公园(5号线坦尾G出口)
14天河公园
15晓港公园(8号线晓港站D出口)
16聚龙山森林公园
17火炉山森林公园
18龙眼洞森林公园
19凤凰山森林公园
20龙头山森林公园
21金坑森林公园
22白兰花森林公园
23大夫山森林公园 (番禺区)
24滴水岩森林公园 (番禺区)
25十八罗汉森林公园(番禺区)
26黄山鲁森林公园 (南沙区)
27九龙潭森林公园 (花都区 )
28风云岭森林公园 (从化市)
29蕉石岭森林公园 (增城市)
30南香山森林公园 (增城市)
31中新森林公园 (增城市)
32白洞森林公园 (增城市)
33陈李济中药博物馆(2号线南洲站C出口,下车后还有1.5公里)
34广东中医药博物馆
35"神农草堂"中医药博物馆(3号线同和站C出口,下车后还有2.1公里)
36美容化妆品博物馆
1广东革命历史博物馆(越秀区)(1或2号线公园前J出口)
2中华全国总工会旧址纪念馆(越秀区)
3 中共三大会址纪念馆(越秀区)(1号线东山口站A出口)
4广州艺术博物院(越秀区)(5号线小北D出口)
5广州发展公园 (越秀区)
6花果山公园(越秀区)
7潘鹤雕塑艺术园(海珠区)(2号线江泰路站D出口,下车后还有2.1公里)
8孙中山大元帅府旧址纪念馆(海珠区)
9洪秀全纪念馆(花都区)
10荔枝湾涌(1号线长寿路B出口/5号线中山八站B出口)
11广州城隍庙(1号线公园前E出口)
12鲁迅纪念馆(1号线农讲所C出口) (目前正在修葺,6月对外开放)
13鲁迅纪念公园(1号线烈士陵园站B3出口)

 

 

posted @ 2013-05-10 10:58 Eric_jiang 阅读(315) | 评论 (1)编辑 收藏

什么是SSH隧道
首先看下面这张图,我们所面临的大部分情况都和它类似。我们的电脑在右上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连接着你和路由器,但是在我们的问题中交换机并不起到什么关键性的作用)。右下脚的部分是一个网站的服务器,它是我们公司防火墙策略的一部分,也就是说公司不希望我们访问这个服务器。在右上角还有一台机器,它也是属于我们的。但是这台机器并不在我们公司里面,换句话说他不受到公司防火墙的限制。最后也是最重要的一点是,我们能够在公司通过互联网直接访问这台机器。或者说这台位于公司防火墙外面的机器需要拥有一个独立的互联网IP,同时公司的防火墙规则不会屏蔽这台机器,并且这台机器运行着一个OpenSSH服务器。
如何使用ssh建立隧道(转载) - Search - Search的博客



现在,我们清楚地知道了自己所处的网络环境。并且不难理解我们在公司无法访问那个服务器的原因是:线路A-B-C上A-B之间的防火墙屏蔽了对那个服务器的访问。与此同时,我们也很快注意到,线路A-B-D之间、D-C之间是不受阻碍的。相信你已经想到了,在A-B之间的防火墙不会屏蔽对机器d的访问。因此我们可以通过机器d建立一个通道A-B-D-C,从而访问到机器c上的数据。

这条通道可以用很多技术来建立,这里我们仅仅介绍如何使用SSH服务器来建立这样一个通道-他被称为SSH隧道。

如何建立本地SSH隧道
在我们计划建立一个本地SSH隧道之前,我们必须清楚下面这些数据:

中间服务器d的IP地址
要访问服务器c的IP地址
要访问服务器c的端口
现在,我们把上面这张图变得具体一些,给这些机器加上IP地址。并且根据下面这张图列出我们的计划:
如何使用ssh建立隧道(转载) - Search - Search的博客



需要访问234.234.234.234的FTP服务,也就是端口21
中间服务器是123.123.123.123
现在我们使用下面这条命令来达成我们的目的

ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
ftp localhost:2121 # 现在访问本地2121端口,就能连接234.234.234.234的21端口了
这里我们用到了SSH客户端的三个参数,下面我们一一做出解释:

-N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
-f 告诉SSH客户端在后台运行
-L 做本地映射端口,被冒号分割的三个部分含义分别是
需要使用的本地端口号
需要访问的目标机器IP地址(IP: 234.234.234.234)
需要访问的目标机器端口(端口: 21)
最后一个参数是我们用来建立隧道的中间机器的IP地址(IP: 123.123.123.123)
我们再重复一下-L参数的行为。-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。

在这条命令成功执行之后,我们已经具有绕过公司防火墙的能力,并且成功访问到了我们喜欢的一个FTP服务器了。

如何建立远程SSH隧道
通过建立本地SSH隧道,我们成功地绕过防火墙开始下载FTP上的资源了。那么当我们在家里的时候想要察看下载进度怎么办呢?大多数公司的网络是通过路由器接入互联网的,公司内部的机器不会直接与互联网连接,也就是不能通过互联网直接访问。通过线路D-B-A访问公司里的机器a便是不可能的。也许你已经注意到了,虽然D-B-A这个方向的连接不通,但是A-B-D这个方向的连接是没有问题的。那么,我们能否利用一条已经连接好的A-B-D方向的连接来完成D-B-A方向的访问呢?答案是肯定的,这就是远程SSH隧道的用途。

与本地SSH一样,我们在建立远程SSH隧道之前要清楚下面几个参数:

需要访问内部机器的远程机器的IP地址(这里是123.123.123.123)
需要让远程机器能访问的内部机器的IP地址(这里因为是想把本机映射出去,因此IP是127.0.0.1)
需要让远程机器能访问的内部机器的端口号(端口:22)
在清楚了上面的参数后,我们使用下面的命令来建立一个远程SSH隧道

ssh -N -f -R 2222:127.0.0.1:22 123.123.123.123
现在,在IP是123.123.123.123的机器上我们用下面的命令就可以登陆公司的IP是192.168.0.100的机器了。

ssh -p 2222 localhost
-N,-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部分的含义分别是:

远程机器使用的端口(2222)
需要映射的内部机器的IP地址(127.0.0.1)
需要映射的内部机器的端口(22)
例如:-R X:Y:Z 就是把我们内部的Y机器的Z端口映射到远程机器的X端口上。

建立SSH隧道的几个技巧
自动重连

隧道可能因为某些原因断开,例如:机器重启,长时间没有数据通信而被路由器切断等等。因此我们可以用程序控制隧道的重新连接,例如一个简单的循环或者使用 djb’s daemontools . 不管用哪种方法,重连时都应避免因输入密码而卡死程序。关于如何安全的避免输入密码的方法,请参考我的 如何实现安全的免密码ssh登录 。这里请注意,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数。

保持长时间连接

有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。

另一种方法是,去掉-N参数,加入一个定期能产生输出的命令。例如: top或者vmstat。下面给出一个这种方法的例子:

ssh -R 2222:localhost:22 123.123.123.123 "vmstat 30"
检查隧道状态

有些时候隧道会因为一些原因通信不畅而卡死,例如:由于传输数据量太大,被路由器带入stalled状态。这种时候,往往SSH客户端并不退出,而是卡死在那里。一种应对方法是,使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在ServerAliveCountMax次请求后都没能响应,那么SSH客户端就自动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置方法分别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义。

如何将端口绑定到外部地址上

使用上面的方法,映射的端口只能绑定在127.0.0.1这个接口上。也就是说,只能被本机自己访问到。如何才能让其他机器访问这个端口呢?我们可以把这个映射的端口绑定在0.0.0.0的接口上,方法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的一个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc/sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。

如何寻找中间服务器

如果你家里使用ADSL上网,多半你会比较幸运。一般的ADSL(例如 联通 的ADSL)都是有互联网地址的。你只需要在家里的路由器上一台装有OpenSSH server机器的SSH端口映射出去即可。同时一些提供SSH访问的虚拟主机也可以用于这一用途。例如: Hostmonser 或者 Dreamhost .

通过SSH隧道建立SOCKS服务器
如果我们需要借助一台中间服务器访问很多资源,一个个映射显然不是高明的办法(事实上,高明确实没有用这个方法)。幸好,SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。

通过下面的命令我们可以建立一个通过123.123.123.123的SOCKS服务器。

ssh -N -f -D 1080 123.123.123 # 将端口绑定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 将端口绑定在0.0.0.0上
通过SSH建立的SOCKS服务器使用的是SOCKS5协议,在为应用程序设置SOCKS代理的时候要特别注意。

总结
至此,我们已经对如何利用SSH隧道有一个基本的认识了。现在,文章开始时的那些问题应该迎刃而解了吧。这里要特别说一下,由于SSH隧道也使用了SSH加密协议,因此是不会被防火墙上的内容过滤器监控到的。也就是说一切在隧道中传输的数据都是被加密的。当然,离开隧道后的数据还是会保持自己原有的样子,没有加密的数据还是会被后续的路由设备监控到。
posted @ 2013-04-11 09:51 Eric_jiang 阅读(536) | 评论 (1)编辑 收藏

仅列出标题
共57页: First 上一页 24 25 26 27 28 29 30 31 32 下一页 Last