人若无名,便可专心练剑

系统连上vpn后没法链接本地特定办公网络解决方案

  |   0 评论   |   2,517 浏览

由于自己一直有使用vpn的习惯,但是每当连上vpn后本地网络就断开了

其实这是由于我们连接vpn后将,vpn程序或者本机系统会自动的将所有流量路由到vpn链路上,问题就出现在了这里

呵呵,既然是路由的问题,那我们当然可以很好的解决哦,同样的办法操作本地路由,由于自己平时办公使用的电脑

为win,而自己下班后使用的为linux,因此给出两种方案:

一,win 下解决方案 

语法:


ROUTE [-f] [-p] [command [destination]
                  [MASK netmask]  [gateway] [METRIC metric]  [IF interface]

  -f           Clears the routing tables of all gateway entries.  If this is
               used in conjunction with one of the commands, the tables are
               cleared prior to running the command.
  -p           When used with the ADD command, makes a route persistent across
               boots of the system. By default, routes are not preserved
               when the system is restarted. Ignored for all other commands,
               which always affect the appropriate persistent routes. This
               option is not supported in Windows 95.
  command      One of these:
                 PRINT     Prints  a route
                 ADD       Adds    a route
                 DELETE    Deletes a route
                 CHANGE    Modifies an existing route
  destination  Specifies the host.
  MASK         Specifies that the next parameter is the 'netmask' value.
  netmask      Specifies a subnet mask value for this route entry.
               If not specified, it defaults to 255.255.255.255.
  gateway      Specifies gateway.
  interface    the interface number for the specified route.
  METRIC       specifies the metric, ie. cost for the destination.

All symbolic names used for destination are looked up in the network database
file NETWORKS. The symbolic names for gateway are looked up in the host name
database file HOSTS.

If the command is PRINT or DELETE. Destination or gateway can be a wildcard,
(wildcard is specified as a star '*'), or the gateway argument may be omitted.

If Dest contains a * or ?, it is treated as a shell pattern, and only
matching destination routes are printed. The '*' matches any string,
and '?' matches any one char. Examples: 157.*.1, 157.*, 127.*, *224*.
Diagnostic Notes:
    Invalid MASK generates an error, that is when (DEST & MASK) != DEST.
    Example> route ADD 157.0.0.0 MASK 155.0.0.0 157.55.80.1 IF 1
             The route addition failed: The specified mask parameter is invalid. (Destination & Mask) != Destination.

Examples:

    > route PRINT
    > route ADD 157.0.0.0 MASK 255.0.0.0  157.55.80.1 METRIC 3 IF 2
             destination^      ^mask      ^gateway     metric^    ^
                                                         Interface^
      If IF is not given, it tries to find the best interface for a given
      gateway.
    > route PRINT
    > route PRINT 157*          .... Only prints those matching 157*
    > route CHANGE 157.0.0.0 MASK 255.0.0.0 157.55.80.5 METRIC 2 IF 2

      CHANGE is used to modify gateway and/or metric only.
    > route PRINT
    > route DELETE 157.0.0.0
    > route PRINT


场景:

vpn 内网地址网络:192.168.33.0/24 连上后分配的ip为:192.168.33.2  网关:192.168.33.1 vpn 外网地址: 180.97.33.67

本地内网哪个网络:192.168.30.0/24 本地ip地址为:192.168.30.113 网关:192.168.30.1

本地常用其他办公地址:192.168.0.0/24 网关:192.168.0.1  或者 192.168.77.0/24  网关:192.168.77.1 需要连接的地址:如:数据库:192.168.0.87  svn地址:192.168.77.187


连上vpn后,系统会自动加上路由如:


C:\Documents and Settings\Administrator>route print
===========================================================================
Interface List
0x1 ........................... MS TCP Loopback interface
0x2 ...00 25 11 6b 3e 34 ...... NVIDIA nForce 10/100 Mbps Ethernet
0xb0004 ...00 53 45 00 00 00 ...... WAN (PPP/SLIP) Interface
===========================================================================
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0     192.168.30.1  192.168.30.113       21
          0.0.0.0          0.0.0.0     192.168.33.2    192.168.33.2       1 <<================ 所有的流量全走这条路由了
     180.97.33.67  255.255.255.255     192.168.30.1  192.168.30.113       20
        127.0.0.0        255.0.0.0        127.0.0.1       127.0.0.1       1
   192.168.30.113  255.255.255.255        127.0.0.1       127.0.0.1       20
   192.168.30.255  255.255.255.255   192.168.30.113  192.168.30.113       20
     192.168.33.2  255.255.255.255        127.0.0.1       127.0.0.1       50
   192.168.33.255  255.255.255.255     192.168.33.2    192.168.33.2       50
一般连上vpn之后我们的,因此我们的所有流量都会默认走vpn链路,因此数据库不能链接,svn没法更新。:-),那么我们来看看解决方案:


由于办公地址为这两个网段:192.168.0.0/24 或者 192.168.77.0/24 需要连接的地址:如:数据库:192.168.0.87  svn地址:192.168.77.187

因此我们可以加上如下两条路由:


route add 192.168.0.0 mask 255.255.255.0 192.168.30.1 metric 1 if 2
route add 192.168.77.0 mask 255.255.255.0 192.168.30.1 metric 1 if 2
这样我们就保证工作时,既能连上vpn畅游internet ,又可以安全无障碍的办公 



二,linux解决方案:(具体场景还是如一中所说)

语法:


  route [-CFvnee]

       route  [-v]  [-A  family]  add  [-net|-host]  target  [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate]
              [[dev] If]

       route  [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm] [metric N] [[dev] If]

       route  [-V] [--version] [-h] [--help]

DESCRIPTION
       Route manipulates the kernel's IP routing tables.  Its primary use is to set up static routes to specific hosts or networks via an interface after
       it has been configured with the ifconfig(8) program.

       When  the add or del options are used, route modifies the routing tables.  Without these options, route displays the current contents of the rout‐
       ing tables.
linux连上后的路由:


如:


root@c2y2:/home/exp# route -F
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         U     0      0        0 ppp0 <<===============所有的流量全走这条路由了
180.97.33.67   192.168.30.1    255.255.255.255 UGH   0      0        0 eth1
180.97.33.67   192.168.30.1    255.255.255.255 UGH   0      0        0 eth1
192.168.33.1    *               255.255.255.255 UH    0      0        0 ppp0
同样我们加上和一一样的路由即可进行正常办公:


方法如下:


route add -net 192.168.0.0/24 gw 192.168.30.1 dev eth1
route add -net 192.168.77.0/24 gw 192.168.30.1 dev eth1
这样即可实现



后记:这里面涉及到一些路由知识,但此不作具体释疑,具体了解:戳这里 或者 戳这里

将上周用于github登录的ssh-key用于自己的远程服务器免密码登录

  |   0 评论   |   2,178 浏览

上一篇:http://www.c2y2.org/articles/2014/06/14/1402726550534.html

前情:上周生成了ssh密钥用于github的免密码登录,:-),由于自己每次管理服务器时都习惯于输入密码

:-),no zuo no die,算了还是解脱哈吧。


注意:配置ssh公钥和私钥时一定要注意相应目录的权限,否则可能导致没法免密码登录(原则系统当前用户~/.ssh 具有读写权限 不能扩大到其他组别或者其他用户)

         其实只要我们自己没去改过权限,一般默认的都是可以使用的。

      一般权限设置如:

        设置authorized_keys权限
        $ chmod 600 authorized_keys 
        设置.ssh目录权限
        $ chmod 700 -R .ssh

操作步骤:
1,首先将~/.ssh/id_rsa.pub 的内容复制出来,然后复制到远程服务器上,并在其~/.ssh/目录下建立authorized_keys文件,将内容复制到其中,然后保存,并授权(权限自己可写可读)
2,然后回到本地就可以直接ssh连接了,不过第一次时,会让我们输入我建立密钥时设置的密码,验证通过了才能成功进行登录,然后成功后,以后每次登录基本都不需要
      输入密码了,不过貌似,换你ip后,第一次连接还是会让你输入一次密钥的密码的。不过比起每次都输入来说已经相当不错了。:-),算是解放了哈



java 打包工具jar的使用

  |   0 评论   |   2,585 浏览

虽说工作以来一直都搞java开发,但对于java打包工具jar的使用却相对较少(平时大多使用ide解决),

因此觉得自己很有必要总结总结

root@c2y2:/home/exp# jar --help


非法选项:-
用法: jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
选项包括:
    -c  创建新的归档文件
    -t  列出归档目录
    -x  解压缩已归档的指定(或所有)文件
    -u  更新现有的归档文件
    -v  在标准输出中生成详细输出
    -f  指定归档文件名
    -m  包含指定清单文件中的清单信息
    -e  为捆绑到可执行 jar 文件的独立应用程序
        指定应用程序入口点
    -0  仅存储;不使用任何 ZIP 压缩
    -M  不创建条目的清单文件
    -i  为指定的 jar 文件生成索引信息
    -C  更改为指定的目录并包含其中的文件
如果有任何目录文件,则对其进行递归处理。
清单文件名、归档文件名和入口点名的指定顺序
与 "m"、"f" 和 "e" 标志的指定顺序相同。

示例 1:将两个类文件归档到一个名为 classes.jar 的归档文件中:
       jar cvf classes.jar Foo.class Bar.class 
示例 2:使用现有的清单文件 "mymanifest" 并
           将 foo/ 目录中的所有文件归档到 "classes.jar" 中:
       jar cvfm classes.jar mymanifest -C foo/ .
具体使用实例:


ox01:jar 打成普通jar包的使用方法


root@c2y2:/media/work/javaExamples/java/HttpConnectTest$ jar -cvf c2y2.jar bin lib src
added manifest
adding: bin/(in = 0) (out= 0)(stored 0%)
adding: bin/META-INF/(in = 0) (out= 0)(stored 0%)
adding: bin/META-INF/MANIFEST.MF(in = 75) (out= 74)(deflated 1%)
adding: bin/META-INF/MANIFEST.MF~(in = 61) (out= 62)(deflated -1%)
adding: bin/org/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/test/(in = 0) (out= 0)(stored 0%)
adding: bin/org/c2y2/test/HttpConnectTestCase.class(in = 3507) (out= 1954)(deflated 44%)
adding: bin/org/c2y2/test/MultiThread.class(in = 1441) (out= 863)(deflated 40%)
adding: bin/org/c2y2/test/MultiThreadGetHash.class(in = 5789) (out= 3225)(deflated 44%)
adding: bin/org/c2y2/test/RegexGetString.class(in = 11207) (out= 2221)(deflated 80%)
adding: bin/org/c2y2/test/writeLog.class(in = 9335) (out= 4985)(deflated 46%)
adding: lib/(in = 0) (out= 0)(stored 0%)
adding: lib/json-lib-2.4-jdk15.jar(in = 159123) (out= 145395)(deflated 8%)
adding: src/(in = 0) (out= 0)(stored 0%)
adding: src/org/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/test/(in = 0) (out= 0)(stored 0%)
adding: src/org/c2y2/test/HttpConnectTestCase.java(in = 2517) (out= 947)(deflated 62%)
adding: src/org/c2y2/test/MultiThreadGetHash.java(in = 5177) (out= 1848)(deflated 64%)
adding: src/org/c2y2/test/RegexGetString.java(in = 10783) (out= 1766)(deflated 83%)
adding: src/org/c2y2/test/writeLog.java(in = 9241) (out= 2474)(deflated 73%)
ox02,可执行jar包的使用:


这个可能稍微麻烦点:

要很两部,第一步需要建立

manifest.mf 文件(对jar执行路径,及主函数等相关设置)

常见如:

Manifest-Version: 1.0
Main-Class: org.c2y2.test.writeLog
Class-Path: .

我们一般会在项目的主文件夹建立META-INF文件夹,并将manifest.mf文件放到下面

如:

exp@c2y2:/media/work/javaExamples/java/HttpConnectTest/bin$ ls
META-INF  org
exp@c2y2:/media/work/javaExamples/java/HttpConnectTest/bin$ ls META-INF/
MANIFEST.MF 
那么我们怎么打成可运行的jar包呢

:-),next -》

exp@kali:/media/work/javaExamples/java/HttpConnectTest/bin$ jar -cvfm writeLog.jar META-INF/MANIFEST.MF org/c2y2/test/writeLog.class 
added manifest
adding: org/c2y2/test/writeLog.class(in = 9335) (out= 4985)(deflated 46%)
exp@kali:/media/work/javaExamples/java/HttpConnectTest/bin$ java -jar writeLog.jar 
请输入用户名

其中有个值的注意的地方:参数 -cvfm 中fm的顺序不能改变,改变了就会报错(我这是这样,具体情况具体而言吧)


特别提示:这些都是建立在已编译的基础上的。

为github生成SSH密钥

  |   0 评论   |   2,318 浏览

第1步:检查SSH密钥

首先,我们需要检查您的计算机上现有的SSH密钥。打开你的终端,然后键入:

root@c2y2:~/Dropbox/crack/GitHub/shell$ ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts
检查清单,看看是否有一个名为无论是文件的目录的id_rsa.pub 和id_dsa.pub中

如果你没有任何这些文件转到步骤2,否则,你可以跳到第3步

第2步:生成一个新的SSH密钥

要生成新的SSH密钥,复制和粘贴下面的文字,并确保替代在您的电子邮件。默认设置是首选,

所以当你问到“输入要保存的密钥文件”,“只要按下回车键继续。

root@c2y2:~$ ssh-keygen -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/exp/.ssh/id_rsa):

接下来,您将被要求输入一个密码(我们可以将密码设置为强度较高的)

然后会生成的如:

root@c2y2:~/Dropbox/crack/GitHub/git-command$ ssh-keygen -C "your_email@example.com" -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
70:68:3f:83:69:25:3f:10:26:aa:bc:9f:bd:dc:d5:e7 your_email@example.com
The key's randomart image is:
+--[ RSA 2048]----+
|    . o          |
|   . o o         |
|  .   * o        |
|..   . @         |
|..    + S        |
|  .  .   +.      |
| .       . . .   |
|  . + . .   o    |
|   o +..     E   |
+-----------------+

用文本编辑器打开 〜/ .ssh / id_rsa.pub文件,并手动复制文件的内容

并将它添加到GitHub上:

  1. 帐户设置按钮在任一页面右上角的用户栏上,单击帐户设置
  2. SSH密钥菜单单击SSH密钥在左侧边栏。
  3. SSH密钥按钮点击添加SSH密钥
  4. 在标题字段中,为新键添加一个描述性的标签。例如,如果您使用的是个人的Mac,你可能会调用这个关键的“个人的MacBook Air”。
  5. 主键字段您的密钥粘贴到“密钥”字段中。
  6. 加号键按钮点击添加键
  7. 输入您的GitHub的密码确认操作。

步骤4:测试

为了确保一切工作,你会尝试ssh方式连接到GitHub上。当你这样做,你将被要求使用密码,

这是您之前创建的口令来验证此操作。打开你的终端,然后键入:

root@c2y2:~/Dropbox/crack/GitHub/git-command$ ssh -v git@github.com
如果出现类似以下内容的提示,则证明SSH连接工作正常了:

Hi c2y2! You've successfully authenticated, but GitHub does not provide shell ac

步骤5:测试应用

先远程创建一个测试应用,然后使用如下命令再在本地建立引用仓库

touch README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:你的git账户/应用名.git
git push -u origin master
这样我们以后就可以直接添加更改等操作了,也不再需要每次提交等操作都需要用户名密码等繁琐操作了


linux shell 正则表达式(BREs,EREs,PREs)差异比较

  |   0 评论   |   2,193 浏览

文章出处:http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html

正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。这些是正则表达式的定义。 由于起源于unix系统,因此很多语法规则一样的。但是随着逐渐发展,后来扩展出以下几个类型。了解这些对于学习正则表达式。

一、正则表达式分类:

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)


说明:只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

  

二、Linux 中常用文本工具与正则表达式的关系 

常握 Linux 下几种常用文本工具的特点,对于我们更好的使用正则表达式是很有帮助的

  • grep , egrep 正则表达式特点:

1)grep 支持:BREs、EREs、PREs 正则表达式

grep 指令后不跟任何参数,则表示要使用 ”BREs“ 

grep 指令后跟 ”-E" 参数,则表示要使用 “EREs“

grep 指令后跟 “-P" 参数,则表示要使用 “PREs"

 

2)egrep 支持:EREs、PREs 正则表达式

egrep 指令后不跟任何参数,则表示要使用 “EREs”

egrep 指令后跟 “-P" 参数,则表示要使用 “PREs"

 

3)grep 与 egrep 正则匹配文件,处理文件方法

a. grep 与 egrep 的处理对象:文本文件

b. grep 与 egrep 的处理过程:查找文本文件中是否含要查找的 “关键字”(关键字可以是正则表达式) ,如果含有要查找的 ”关健字“,那么默认返回该文本文件中包含该”关健字“的该行的内容,并在标准输出中显示出来,除非使用了“>" 重定向符号,

c. grep 与 egrep 在处理文本文件时,是按行处理的

 

  • sed 正则表达式特点

1)sed 文本工具支持:BREs、EREs

sed 指令默认是使用"BREs"

sed 命令参数 “-r ” ,则表示要使用“EREs"

2)sed 功能与作用

a. sed 处理的对象:文本文件

b. sed 处理操作:对文本文件的内容进行 --- 查找、替换、删除、增加等操作

c. sed 在处理文本文件的时候,也是按行处理的

  • Awk(gawk)正则表达式特点

1)Awk 文本工具支持:EREs

awk 指令默认是使用 “EREs"

2)Awk 文本工具处理文本的特点

a. awk 处理的对象:文本文件

b. awk 处理操作:主要是对列进行操作

 

 

 

三、常见3中类型正则表达式比较

字符 说明 Basic RegEx Extended RegEx python RegEx Perl regEx
转义   \ \ \ \
^ 匹配行首,例如'^dog'匹配以字符串dog开头的行(注意:awk 指令中,'^'则是匹配字符串的开始) ^ ^ ^ ^
$ 匹配行尾,例如:'^、dog$'匹配以字符串 dog 为结尾的行(注意:awk 指令中,'$'则是匹配字符串的结尾) $ $ $ $

^$

匹配空行

^$ ^$ ^$ ^$
^string$ 匹配行,例如:'^dog$'匹配只含一个字符串 dog 的行 ^string$ ^string$ ^string$ ^string$
\< 匹配单词,例如:'\<frog' (等价于'\bfrog'),匹配以 frog 开头的单词 \< \< 不支持 不支持(但可以使用\b来匹配单词,例如:'\bfrog')

\>

匹配单词,例如:'frog\>'(等价于'frog\b '),匹配以 frog 结尾的单词 \> \> 不支持 不支持(但可以使用\b来匹配单词,例如:'frog\b')

\<x\>

匹配一个单词或者一个特定字符,例如:'\<frog\>'(等价于'\bfrog\b')、'\<G\>' \<x\> \<x\> 不支持 不支持(但可以使用\b来匹配单词,例如:'\bfrog\b'

()

匹配表达式,例如:不支持'(frog)' 不支持(但可以使用\(\),如:\(dog\) () () ()

\(\)

匹配表达式,例如:不支持'(frog)' \(\) 不支持(同()) 不支持(同()) 不支持(同())

匹配前面的子表达式 0 次或 1 次(等价于{0,1}),例如:where(is)?能匹配"where" 以及"whereis" 不支持(同\?)
\? 匹配前面的子表达式 0 次或 1 次(等价于'\{0,1\}'),例如:'where\(is\)\? '能匹配 "where"以及"whereis" \? 不支持(同?) 不支持(同?) 不支持(同?)
? 当该字符紧跟在任何一个其他限制符(*, +, ?, {n},{n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个"o",而 'o+' 将匹配所有 'o' 不支持 不支持 不支持 不支持
. 匹配除换行符('\n')之外的任意单个字符(注意:awk 指令中的句点能匹配换行符) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:'(^$)|(.) . .(如果要匹配包括“\n”在内的任何一个字符,请使用:' [.\n] '
* 匹配前面的子表达式 0 次或多次(等价于{0, }),例如:zo* 能匹配 "z"以及 "zoo" * * * *
\+ 匹配前面的子表达式 1 次或多次(等价于'\{1, \}'),例如:'where\(is\)\+ '能匹配 "whereis"以及"whereisis" \+ 不支持(同+) 不支持(同+) 不支持(同+)
+ 匹配前面的子表达式 1 次或多次(等价于{1, }),例如:zo+能匹配 "zo"以及 "zoo",但不能匹配 "z" 不支持(同\+) + + +

{n}

n 必须是一个 0 或者正整数,匹配子表达式 n 次,例如:zo{2}能匹配 不支持(同\{n\}) {n} {n} {n}
{n,} "zooz",但不能匹配 "Bob"n 必须是一个 0 或者正整数,匹配子表达式大于等于 n次,例如:go{2,} 不支持(同\{n,\}) {n,} {n,} {n,}
{n,m} 能匹配 "good",但不能匹配 godm 和 n 均为非负整数,其中 n <= m,最少匹配 n 次且最多匹配 m 次 ,例如:o{1,3}将配"fooooood" 中的前三个 o(请注意在逗号和两个数之间不能有空格) 不支持(同\{n,m\}) {n,m} {n,m} {n,m}

x|y

匹配 x 或 y,例如: 不支持'z|(food)' 能匹配 "z" 或"food";'(z|f)ood' 则匹配"zood" 或 "food" 不支持(同x\|y) x|y x|y x|y

[0-9]

匹配从 0 到 9 中的任意一个数字字符(注意:要写成递增) [0-9] [0-9] [0-9] [0-9]

[xyz]

字符集合,匹配所包含的任意一个字符,例如:'[abc]'可以匹配"lay" 中的 'a'(注意:如果元字符,例如:. *等,它们被放在[ ]中,那么它们将变成一个普通字符) [xyz] [xyz] [xyz] [xyz]

[^xyz]

负值字符集合,匹配未包含的任意一个字符(注意:不包括换行符),例如:'[^abc]' 可以匹配 "Lay" 中的'L'(注意:[^xyz]在awk 指令中则是匹配未包含的任意一个字符+换行符) [^xyz] [^xyz] [^xyz] [^xyz]
[A-Za-z] 匹配大写字母或者小写字母中的任意一个字符(注意:要写成递增) [A-Za-z] [A-Za-z] [A-Za-z] [A-Za-z]
[^A-Za-z] 匹配除了大写与小写字母之外的任意一个字符(注意:写成递增) [^A-Za-z] [^A-Za-z] [^A-Za-z] [^A-Za-z]

\d

匹配从 0 到 9 中的任意一个数字字符(等价于 [0-9]) 不支持 不支持 \d \d

\D

匹配非数字字符(等价于 [^0-9]) 不支持 不支持 \D \D
\S 匹配任何非空白字符(等价于[^\f\n\r\t\v]) 不支持 不支持 \S \S
\s 匹配任何空白字符,包括空格、制表符、换页符等等(等价于[ \f\n\r\t\v]) 不支持 不支持 \s \s
\W

匹配任何非单词字符 (等价于[^A-Za-z0-9_])

\W \W \W \W
\w 匹配包括下划线的任何单词字符(等价于[A-Za-z0-9_]) \w \w \w \w
\B 匹配非单词边界,例如:'er\B' 能匹配 "verb" 中的'er',但不能匹配"never" 中的'er' \B \B \B \B

\b

匹配一个单词边界,也就是指单词和空格间的位置,例如: 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的'er' \b \b \b \b
\t 匹配一个横向制表符(等价于 \x09和 \cI) 不支持 不支持 \t \t
\v 匹配一个垂直制表符(等价于 \x0b和 \cK) 不支持 不支持 \v \v
\n 匹配一个换行符(等价于 \x0a 和\cJ) 不支持 不支持 \n \n
\f 匹配一个换页符(等价于\x0c 和\cL) 不支持 不支持 \f \f
\r 匹配一个回车符(等价于 \x0d 和\cM) 不支持 不支持 \r \r
\\ 匹配转义字符本身"\" \\ \\ \\ \\

\cx

匹配由 x 指明的控制字符,例如:\cM匹配一个Control-M 或回车符,x 的值必须为A-Z 或 a-z 之一,否则,将 c 视为一个原义的 'c' 字符 不支持 不支持   \cx

\xn

匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长,例如:'\x41' 匹配 "A"。'\x041' 则等价于'\x04' & "1"。正则表达式中可以使用 ASCII 编码 不支持 不支持   \xn

\num

匹配 num,其中 num是一个正整数。表示对所获取的匹配的引用 不支持 \num \num  
[:alnum:] 匹配任何一个字母或数字([A-Za-z0-9]),例如:'[[:alnum:]] ' [:alnum:] [:alnum:] [:alnum:] [:alnum:]
[:alpha:] 匹配任何一个字母([A-Za-z]), 例如:' [[:alpha:]] ' [:alpha:] [:alpha:] [:alpha:] [:alpha:]
[:digit:] 匹配任何一个数字([0-9]),例如:'[[:digit:]] ' [:digit:] [:digit:] [:digit:] [:digit:]
[:lower:] 匹配任何一个小写字母([a-z]), 例如:' [[:lower:]] ' [:lower:] [:lower:] [:lower:] [:lower:]
[:upper:] 匹配任何一个大写字母([A-Z]) [:upper:] [:upper:] [:upper:] [:upper:]
[:space:] 任何一个空白字符: 支持制表符、空格,例如:' [[:space:]] ' [:space:] [:space:] [:space:] [:space:]
[:blank:] 空格和制表符(横向和纵向),例如:'[[:blank:]]'ó'[\s\t\v]' [:blank:] [:blank:] [:blank:] [:blank:]
[:graph:] 任何一个可以看得见的且可以打印的字符(注意:不包括空格和换行符等),例如:'[[:graph:]] ' [:graph:] [:graph:] [:graph:] [:graph:]
[:print:] 任何一个可以打印的字符(注意:不包括:[:cntrl:]、字符串结束符'\0'、EOF 文件结束符(-1), 但包括空格符号),例如:'[[:print:]] ' [:print:] [:print:] [:print:] [:print:]

[:cntrl:]

任何一个控制字符(ASCII 字符集中的前 32 个字符,即:用十进制表示为从 0 到31,例如:换行符、制表符等等),例如:' [[:cntrl:]]'

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:cntrl:]

[:punct:] 任何一个标点符号(不包括:[:alnum:]、[:cntrl:]、[:space:]这些字符集) [:punct:] [:punct:] [:punct:] [:punct:]
[:xdigit:] 任何一个十六进制数(即:0-9,a-f,A-F) [:xdigit:] [:xdigit:] [:xdigit:] [:xdigit:]

 

四、三种不同类型正则表达式比较

注意: 当使用 BERs(基本正则表达式)时,必须在下列这些符号前加上转义字符('\'),屏蔽掉它们的 speical meaning  “?,+,|,{,},(,)” 这些字符,需要加入转义符号”\”

 

注意:修饰符用在正则表达式结尾,例如:/dog/i,其中 “ i “ 就是修饰符,它代表的含义就是:匹配时不区分大小写,那么修饰符有哪些呢?常见的修饰符如下:

g   全局匹配(即:一行上的每个出现,而不只是一行上的第一个出现)
s    把整个匹配串当作一行处理
m    多行匹配
i    忽略大小写
x    允许注释和空格的出现
U    非贪婪匹配

 

以上就是linux 常见3种类型正则表达式异同之处,整体了解这些,我相信在使用这些工具的时候,就可以更加清楚明晰了

debian linux 升级内核后virtualbox 模块无法正常加载问题解决

  |   0 评论   |   2,464 浏览

由于系统前两天系统进行内核升级,一直没有用virtualbox 所有没法发现

刚好今天准备一项测试,需要搭建一个目标系统,于是运行vitualbox 发现无法正常加载

进行模块重新设置:

root@c2y2:/home/exp# /etc/init.d/vboxdrv setup
Stopping VirtualBox kernel modules ...done.
Removing old VirtualBox pci kernel module ...done.
Removing old VirtualBox netadp kernel module ...done.
Removing old VirtualBox netflt kernel module ...done.
Removing old VirtualBox kernel module ...done.
Recompiling VirtualBox kernel modules ...done.
Starting VirtualBox kernel modules ...failed!
  (modprobe vboxdrv failed. Please use 'dmesg' to find out why)
还是失败,

然后再次模块加载:

root@c2y2:/home/exp# modprobe vboxdrv 
ERROR: could not insert 'vboxdrv': Exec format error
继续失败:

网上搜你哈相关的问题,说是内核问题,需要重新编译哈,各有说个的

于是乎发现了如下一个链接,算是给问题解决了。

virtualbox-dkms

可能每个人问题会不一样,因此请视具体情况而定,少走冤路,仅次参考

相关链接:http://unix.stackexchange.com/questions/52500/virtualbox-on-debian

对于URL你知道多少呢

  |   0 评论   |   2,112 浏览

URL 全称:Uniform Resource Locator 统一资源定位器,一个URL 即代表一个“独一无二“的资源。

通俗?易懂?

呵呵,我来好好的认识哈吧

一 ,URL 结构

(1),协议名称(必须)
(2),层级URL的标记符号(固定)
(3),访问认证(可选)
(4),访问地址(对应主机ip或者域名)(必须)
(5),资源服务器端口(web 80端口可不写)(可选)
(6),路径,指向说需要访问资源的路径(可选)
(7),查询字段参数(可选)
(8),片段ID (可选)
其中:(3,4,5)三部分为授权信息部分

依次分解下吧:

协议名称:协议名称由一串不区分大小写的字符串组成,以单个冒号:,协议的作用即表示请求资源时所需要使用的协议(常用的如:http,https,ftp 当然也有些伪协议如:javascript)

层级URL:固定:// 当然具体的表示各浏览器而定(有浏览器没有也认可,有的则不行)

访问认证:有些资源访问时必须验证权限如ftp,另外我们经常见到的家用路由器也可以使用如:http://admin:admin@192.168.1.1 进行直接登录

访问地址:对于完整的URL,必须指定域名,ip(4,6)地址,ipv6时 使用方括号 [0:0:0:0:0:0:0:1], 然而我们可以进行一些变通实现,将其转为 十六进制,八进制,以及十进制  工具 http://7fvdhi.com1.z0.glb.clouddn.com/#misc

服务器端口:可选,不同的端口可能代表不同的协议,但也可以执行更改如将web改为8080

资源路径: 如:/articles/2014/05/29/1401294202645.html ,也可以使用相对路径,前提是必须加上基准路径

查询字符串:可选,如 query=a多个使用&隔开如:a=1&b=2

片段ID:又名锚点,用于浏览器当前页快速定位(可选)

二,浏览器对URL的解析

ox1,提取协议名称

浏览器会扫描第一个“:”字符,该字符左边便为我们本次所需要使用的协议。如果获取的协议名称无法识别或者非法字符,则可能会认为为相对URL,而获得不是协议名称

ox2,去除层级URL标记符

字符串"//"跟在协议名称的后面。如果发现存在该字符则跳过,没发现则不管(对于// 不同的浏览器有不同的识别标准,有的\\也会识别)

ox3,获取授权部分

依次扫描"/","?","#" 字符,那个先出现以哪个为准进行截取,从URL提取出来的部分便为授权部分信息包括(3,4,5)三部分

    解析授权部分:

                        a,首先定位登录信息,扫描"@"字符,如果发现则其左边便为登录信息,然后查找":"号,如果有则前面为 登录用户名,后面则为登录密码

                        b, 提取服务器地址:登录信息提取后的变为服务器地址和端口号。

ox4,确定路径

如果有的化,授权部分提取后结尾跟着一个正斜杠(不一定是这样,视具体场景而言),然后一次扫描下一个"?","#"或者字符结尾符 那个想出现以哪个为准。

ox5,提取查询字符串

如果存在查询字符串,跟在0x4,后面的第一个"?"号,然后依次扫描下一个"#"号,没有则到字符结尾,谁先出现以谁为准

0x6,提取片段

如果存在,跟在上一条信息的"#"号,然后从这个字符到整个字符串的最后,提取出的整个字符串便为 片段ID ,即当前页面的锚点


至此6步,整个URL基本解析完成

虽然6步看似普通易懂,但是真实场景却是千变万化的如下一些场景:

例1,http://www.baidu.com&query=c2y2.org@1002196319/
呵呵,想想:我们到底访问的哪个网站呢 百度呢?还是 ,呵呵 我们采用上面的6步来分析吧,其实其访问的为:1002196319这个地址即:59.188.77.95 转换传送:http://7fvdhi.com1.z0.glb.clouddn.com/#misc


例2:

http://www.c2y2.org\@baidu.com/

我们此时访问的啥呢:

好吧,此时情况有点特殊了,此时要是具体情况而言了:chrome会把我们带到 http://www.c2y2.org 这个网站 而firefox 会把我们带到 百度了

firefox:



chrome谷歌:



由于:firefox 会将 www.c2y2.org\认为合法的登录信息,其他浏览器则会将"\",认为分隔符,如谷歌浏览器解析到www.c2y2.org 这个网站


另外在IE 中还有根奇怪的

http://www.baidu.com;.c2y2.org/

如果www.baidu.com;.c2y2.org 该域名确实存在,那么IE 成功解析到c2y2.org 这个域名。二IE 以外的浏览器则会将其变为:http://www.baidu.com/;.c2y2.org 或者干脆无法解析



后记:看着我们每天都要使用的URL 我真的想说一句,你原来还那么的神奇。

        呵呵,url奇怪的样式,更大的用途就是用于社工,钓鱼,如果我将一个变形的地址发给你,你真的会认识么。

       推荐大家看一本书:《web之困》 很不错哦。。。。看着深有体会.

      该书作者博客:http://coredump.cx 或者http://lcamtuf.coredump.cx 以及http://lcamtuf.blogspot.com/

       推荐一个链接:http://drops.wooyun.org/tips/750 里边会更详细的讲解,以及根详细禅明奇怪URL 的特殊用途 :-)(-;


继上一篇文章 http get乱码 问题(彻底释疑)

  |   0 评论   |   2,365 浏览

做j2ee开发已差不多两年了,昨天遇到的问题真的还是纳闷了呢,也算是第一次遇到,可能以前都用post中文了,网上搜了哈,没什么可信的答案

 :-) 为什么只支持iso 8859-1 呢?

疑惑,于是呼,想到了自己买的一个web方面的书未怎么看,回去找找可能有什么要找的答案呢。

正如我所料果然上面有。

:呵呵,于是乎就有了这篇文章


主要原因:

浏览器编码问题:

常用系统一些常用编码无法满足所有字符的表示(参看很多字符根本就不是拉丁体系字母表的),而系统常用ascii表示字符集,so,so 问题出现了

为了解决几乎所有字符集的展示,于是产生了各种8位代码页,使用的是各种高位字符集:ISO 8859-1 CP850 和用于西欧语言体系的windows 1252

;用于东欧和中欧体系iso 8859-2 ,CP 852 windos 1250 ;用于俄文的KOI 8-R windows 1251.。而有些预言字符远非256个字符空间能表示,于是

就产生了一些宽字节编码方式。于是乎产生了另外一种编码格式:uncode以及其改进版本utf-8 ,理论上来说utf-8对于传统8位格式编码应用是安全的。

然而这编码诞生原落后相关web协议的固定基础成型时间,因此就出现另外一种情况。

浏览器开发商似乎有点不知所措,而且没有一个统一的解决方案,于是浏览器一般都会将url的路径信息部分进行内部转码UTF-8(甚至如有可能,

只按照ISO 8859-1 格式编码以及解析),而查询字符部分则按照当前编码进行编码

:-),我们来看看get方式请求吧

 对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://lwww.c2y2.org/admin-index.do?a=1&b=2,而如果查询字段部分不是常用的拉丁字符,那么乱码就会出现,因此浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字 符串 "%82" 表示,其中82为该字节的两位十六进制表示形式。

这里说的可能不清楚,具体介绍可以看下java.net.URLEncoder类的介绍在这里。了解了 URL encode的过程,我们能看到2个很重要的问题,

第一:需要URL encode的字符一般都是非ASCII的字符(即非拉丁字符),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;

第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置 浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用 javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 {附注:这里会将这个编码统一转为一种格式,最后都会被转为 8859_1这种格式,也就是说接收到的都是8859-1格式的.}完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说 几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。 

另外一个关键的就是对于我们服务器端接受信息来说,我们自己的服务器没有特别设置url编码的化url

一般都会采用iso8859-1 进行编码,因此我们接收到数据后需按照如下去值

String chinese = request.getParameter ("chinese" )
chinese = new String(chinese.getBytes( "iso8859-1"),"utf8" )


1,相当于我们url信息部分进行url decode 按照iso8859-1

2,后面哪个utf8 是我们页面对信息部分进行的编码


来个总结性的吧:

从form get提交数据到后台接收,并显示

1,提交form (浏览器对url进行utf-8 编码,如:http://www.baidu.com ,对于查询字段部分 如"abc=123&nam=乱码 "按照当前页面编码进行编码)

2,服务器端,如果没有设置特定的url编码:一般会进行iso 8859-1 再次进行编码(此时是整个url)

3,服务器端接收数据:

                        String chinese = request.getParameter ("chinese" )//此时是乱码的

                        解码:两步

                                0x1,按iso 8859-1 进行解码,获取二进制字节

                                ox2 将上一步获取到的二进制字节 按页面上的编码生成相应的信息(此时信息还原,一般都不会乱码拉)




后记:哎,看来没有一个统一的规则,真的很乱(浏览器百家争鸣),呵呵,规则,规定,制度,要是生活中没有了这些,社会将会是怎样的呢!!!!!