blogjava-凯发k8网页登录http://www.blogjava.net/xzclog/category/32185.htmlzh-cntue, 04 sep 2018 08:32:21 gmttue, 04 sep 2018 08:32:21 gmt60hive集成sentry的sql用法。http://www.blogjava.net/xzclog/archive/2018/09/03/433353.htmlxzcxzcmon, 03 sep 2018 10:19:00 gmthttp://www.blogjava.net/xzclog/archive/2018/09/03/433353.htmlhttp://www.blogjava.net/xzclog/comments/433353.htmlhttp://www.blogjava.net/xzclog/archive/2018/09/03/433353.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/433353.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/433353.html

xzc 2018-09-03 18:19 发表评论
]]>
linux系统查看当前主机cpu、内存、机器型号及主板信息http://www.blogjava.net/xzclog/archive/2017/09/10/432806.htmlxzcxzcsun, 10 sep 2017 08:37:00 gmthttp://www.blogjava.net/xzclog/archive/2017/09/10/432806.htmlhttp://www.blogjava.net/xzclog/comments/432806.htmlhttp://www.blogjava.net/xzclog/archive/2017/09/10/432806.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/432806.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432806.htmllinux系统查看当前主机cpu、内存、机器型号及主板信息:


查看cpu信息(型号)
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

 

查看内存信息
# cat /proc/meminfo

 

查看主板型号:
# dmidecode |grep -a16 "system information$"

 

查看机器型号
# dmidecode | grep "product name"

 

查看当前操作系统内核信息
# uname -a

 

查看当前操作系统发行版信息
# cat /etc/issue | grep linux



xzc 2017-09-10 16:37
]]>
python日期的加减等操作http://www.blogjava.net/xzclog/archive/2017/08/14/432743.htmlxzcxzcmon, 14 aug 2017 15:09:00 gmthttp://www.blogjava.net/xzclog/archive/2017/08/14/432743.htmlhttp://www.blogjava.net/xzclog/comments/432743.htmlhttp://www.blogjava.net/xzclog/archive/2017/08/14/432743.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/432743.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432743.html1. 日期输出格式化

所有日期、时间的api都在datetime模块内。

1. datetime => string

now = datetime.datetime.now()
now.strftime('%y-%m-%d %h:%m:%s')
#输出2012-03-05 16:26:23.870105

strftime是datetime类的实例方法。

2. string => datetime

t_str = '2012-03-05 16:26:23'
d = datetime.datetime.strptime(t_str, '%y-%m-%d %h:%m:%s')

strptime是datetime类的静态方法。

2. 日期比较操作

在datetime模块中有timedelta类,这个类的对象用于表示一个时间间隔,比如两个日期或者时间的差别。

构造方法:

datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

所有的参数都有默认值0,这些参数可以是int或float,正的或负的。

可以通过timedelta.days、tiemdelta.seconds等获取相应的时间值。

timedelta类的实例,支持加、减、乘、除等操作,所得的结果也是timedelta类的实例。比如:

year = timedelta(days=365)
ten_years = year *10
nine_years = ten_years - year

同时,date、time和datetime类也支持与timedelta的加、减运算。

datetime1 = datetime2  /- timedelta
timedelta = datetime1 - datetime2

这样,可以很方便的实现一些功能。

1. 两个日期相差多少天。

d1 = datetime.datetime.strptime('2012-03-05 17:41:20', '%y-%m-%d %h:%m:%s')
d2 = datetime.datetime.strptime('2012-03-02 17:41:20', '%y-%m-%d %h:%m:%s')
delta = d1 - d2
print delta.days

输出:3

2. 今天的n天后的日期。

now = datetime.datetime.now()
delta = datetime.timedelta(days=3)
n_days = now   delta
print n_days.strftime('%y-%m-%d %h:%m:%s')

输出:2012-03-08 17:44:50

#coding=utf-8
import datetime
now=datetime.datetime.now()
print now
#将日期转化为字符串 datetime => string
print now.strftime('%y-%m-%d %h:%m:%s')
t_str = '2012-03-05 16:26:23'
#将字符串转换为日期 string => datetime
d=datetime.datetime.strptime(t_str,'%y-%m-%d %h:%m:%s')
print d
#在datetime模块中有timedelta类,这个类的对象用于表示一个时间间隔,比如两个日#期或者时间的差别。
#计算两个日期的间隔
d1 = datetime.datetime.strptime('2012-03-05 17:41:20', '%y-%m-%d %h:%m:%s')
d2 = datetime.datetime.strptime('2012-03-02 17:41:20', '%y-%m-%d %h:%m:%s')
delta = d1 - d2
print delta.days
print delta
#今天的n天后的日期。
now=datetime.datetime.now()
delta=datetime.timedelta(days=3)
n_days=now delta
print n_days.strftime('%y-%m-%d %h:%m:%s')


xzc 2017-08-14 23:09
]]>
linux shell 多线程执行程序http://www.blogjava.net/xzclog/archive/2017/08/02/432719.htmlxzcxzcwed, 02 aug 2017 09:01:00 gmthttp://www.blogjava.net/xzclog/archive/2017/08/02/432719.htmlhttp://www.blogjava.net/xzclog/comments/432719.htmlhttp://www.blogjava.net/xzclog/archive/2017/08/02/432719.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/432719.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432719.htmlshell中并没有真正意义的多线程,要实现多线程可以启动多个后端进程,最大程度利用cpu性能。

直接看代码示例吧。

(1) 顺序执行的代码

 1 #!/bin/bash  2 date  3 for i in `seq 1 5`  4 do  5 {  6     echo "sleep 5"  7     sleep 5  8 }  9 done 10 date 

输出:

sat nov 19 09:21:51 cst 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 sat nov 19 09:22:16 cst 2016

(2) 并行代码

使用'&' wait 实现“多进程”实现

 1 #!/bin/bash  2 date  3 for i in `seq 1 5`  4 do  5 {  6     echo "sleep 5"  7     sleep 5  8 } &  9 done 10 wait  ##等待所有子后台进程结束 11 date

输出:

sat nov 19 09:25:07 cst 2016 sleep 5 sleep 5 sleep 5 sleep 5 sleep 5 sat nov 19 09:25:12 cst 2016

 (3) 对于大量处理任务如何实现启动后台进程的数量可控?

  简单的方法可以使用2层for/while循环实现,每次wait内层循环的多个后台程序执行完成

  但是这种方式的问题是,如果内层循环有“慢节点”可能导致整个任务的执行执行时间长。

  更高级的实现可以看(4)

(4) 使用命名管道(fifo)实现每次启动后台进程数量可控。 

 1 #!/bin/bash  2   3 function my_cmd(){  4     t=$random  5     t=$[t%15]  6     sleep $t  7     echo "sleep $t s"  8 }  9  10 tmp_fifofile="/tmp/$$.fifo"  11 mkfifo $tmp_fifofile      # 新建一个fifo类型的文件 12 exec 6<>$tmp_fifofile     # 将fd6指向fifo类型 13 rm $tmp_fifofile    #删也可以 14  15 thread_num=5  # 最大可同时执行线程数量 16 job_num=100   # 任务总数 17  18 #根据线程总数量设置令牌个数 19 for ((i=0;i<${thread_num};i  ));do 20     echo 21 done >&6  22  23 for ((i=0;i<${job_num};i  ));do # 任务数量 24     # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行, 25     # fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制 26     read -u6  27  28     #可以把具体的需要执行的命令封装成一个函数 29     {    30         my_cmd 31     } & 32  33     echo >&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个 34 done 35  36 wait 37 exec 6>&- # 关闭fd6 38 echo "over"

 

参考:http://lawrence-zxc.github.io/2012/06/16/shell-thread/



xzc 2017-08-02 17:01
]]>
ontab 在固定时间或固定间隔执行某文件或命令 http://www.blogjava.net/xzclog/archive/2017/07/27/432699.htmlxzcxzcthu, 27 jul 2017 10:59:00 gmthttp://www.blogjava.net/xzclog/archive/2017/07/27/432699.htmlhttp://www.blogjava.net/xzclog/comments/432699.htmlhttp://www.blogjava.net/xzclog/archive/2017/07/27/432699.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/432699.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432699.html1. crontab 命令:用于在某个时间,系统自动执行你所希望的程序文件或命令。
2. crontab 的参数
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)
3.下面进行一个例子:在8月6号18时每隔3分钟执行以下命令:who >> /apple/test_crontab.log
   步骤一:先创建一个文件cronfile:内容为如下:
           */3 18 6 8 * who >> /apple/test_crontab_log
   步骤二:将文件cronfile 加入到cron守护进行(命令为:crontab cronfile)
4. 检查是否加入到守护进程cron中,用命令:crontab -l
   如何出来的内容中包含你刚刚的内容,则加入成功。每隔3分钟查看下test_crontab.log文件,看看是否有内容。
5. 对crontab内容格式的解释:f1 f2 f3 f4 f5 program
   f1 是表示分钟(0-59),f2 表示小时(0-23),f3 表示一个月份中的第几日(1-(31、30、29、28)),f4 表示月份(1-12),f5 表示一个星期中的第几天(0-6(0表示周日))。program 表示要执行的程式(可以理解为文件或命令)
   f1:为*时候表示每隔1分钟,如果为*/n 表示每隔n分钟,如果为3,4 表示第3,4分钟,如果为2-6表示第2分钟到第6分钟。
   f2:为*时候表示每隔1小说。如果为*/n 表示每隔n小时,如果为3,4 表示第3,4小时,如果为2-6表示第2小时到第6小时
   f3: 为*时候表示每天。n 表示第n天
   f4: 为*时候表示每月。n 表示第n个月
   f5: 为*时候表示每周。0表示周日,6表示周六,1-4表示周一到周六
6. 具体例子:(来自crontab百度百科)
   a. 每月每天每小时的第 0 分钟执行一次 /bin/ls :   0 * * * * /bin/ls   
   b. 在 12 月内, 每天的早上 6 点到 12 点中,每隔 20 分钟执行一次 /usr/bin/backup :
      */20 6-12 * 12 * /usr/bin/backup  
  c. 周一到周五每天下午 5:00 寄一封信给 alex_mail_name :  
      0 17 * * 1-5 mail -s "hi" alex_mail_name < /tmp/maildata   
   d. 每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"   
      20 0-23/2 * * * echo "haha"   
   e. 晚上11点到早上8点之间每两个小时和早上8点 显示日期  0 23-7/2,8 * * * date 

xzc 2017-07-27 18:59
]]>
shell时间处理、加减、以及时间差http://www.blogjava.net/xzclog/archive/2017/07/06/432649.htmlxzcxzcthu, 06 jul 2017 08:33:00 gmthttp://www.blogjava.net/xzclog/archive/2017/07/06/432649.htmlhttp://www.blogjava.net/xzclog/comments/432649.htmlhttp://www.blogjava.net/xzclog/archive/2017/07/06/432649.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/432649.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432649.html
最近一段时间,在处理shell 脚本时候,遇到时间的处理问题。 时间的加减,以及时间差的计算。 
 
1。 时间加减
 
这里处理方法,是将基础的时间转变为时间戳,然后,需要增加或者改变时间,变成 秒。 
 
如:1990-01-01 01:01:01  加上 1小时 20分
处理方法:
a.将基础时间转为时间戳
time1=$(date %s -d '1990-01-01 01:01:01')
echo $time1
631126861 【时间戳】
 
b.将增加时间变成秒
[root@localhost ~]# time2=$((1*60*60 20*60))
[root@localhost ~]# echo $time2
4800
 
c.两个时间相加,计算出结果时间
time1=$(($time1 $time2))
time1=$(date %y-%m-%d\ %h:%m:%s -d "1970-01-01 utc $time1 seconds");
echo $time1
1990-01-01 02:21:01
 
2。时间差计算方法
 
如:2010-01-01 与 2009-01-01 11:11:11 时间差
原理:同样转成时间戳,然后计算天,时,分,秒
 
time1=$(($(date %s -d '2010-01-01') - $(date %s -d '2009-01-01 11:11:11')));
echo time1
 
将time1 / 60 秒,就变成分了。
 
补充说明:
shell 单括号运算符号:
a=$(date);
等同于:a=`date`;
 
双括号运算符:
a=$((1 2));
echo $a;
等同于:
a=`expr 1 2`


xzc 2017-07-06 16:33
]]>
curl模拟http发送get或post接口测试 http://www.blogjava.net/xzclog/archive/2017/05/18/432539.htmlxzcxzcthu, 18 may 2017 03:28:00 gmthttp://www.blogjava.net/xzclog/archive/2017/05/18/432539.htmlhttp://www.blogjava.net/xzclog/comments/432539.htmlhttp://www.blogjava.net/xzclog/archive/2017/05/18/432539.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/432539.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432539.html

可参照:http://www.voidcn.com/blog/vindra/article/p-4917667.html

一、get请求 

curl "http://www.baidu.com"  如果这里的url指向的是一个文件或者一幅图都可以直接下载到本地

curl -i "http://www.baidu.com"  显示全部信息

curl -l "http://www.baidu.com" 只显示头部信息

curl -v "http://www.baidu.com" 显示get请求全过程解析

 

wget "http://www.baidu.com"也可以

 

二、post请求

curl -d "param1=value1¶m2=value2" "http://www.baidu.com"

 

三、json格式的post请求

curl -l -h "content-type: application/json" -x post -d '{"phone":"13521389587","password":"test"}' http://domain/apis/users.json

例如:

curl -l -h "content-type: application/json" -x post -d '{"ver": "1.0","soa":{"req":"123"},"iface":"me.ele.lpdinfra.prediction.service.predictionservice","method":"restaurant_make_order_time","args":{"arg2":"\"stable\"","arg1":"{\"code\":[\"wind\"],\"temperature\":11.11}","arg0":"{\"tracking_id\":\"100000000331770936\",\"eleme_order_id\":\"100000000331770936\",\"platform_id\":\"4\",\"restaurant_id\":\"482571\",\"dish_num\":1,\"dish_info\":[{\"entity_id\":142547763,\"quantity\":1,\"category_id\":1,\"dish_name\":\"[0xe7][0x89][0xb9][0xe4][0xbb][0xb7][0xe8][0x85][0x8a][0xe5][0x91][0xb3][0xe5][0x8f][0x89][0xe7][0x83][0xa7][0xe5][0x8f][0x8c][0xe6][0x8b][0xbc][0xe7][0x85][0xb2][0xe4][0xbb][0x94][0xe9][0xa5][0xad]\",\"price\":31.0}],\"merchant_location\":{\"longitude\":\"121.47831425\",\"latitude\":\"31.27576153\"},\"customer_location\":{\"longitude\":\"121.47831425\",\"latitude\":\"31.27576153\"},\"created_at\":1477896550,\"confirmed_at\":1477896550,\"dishes_total_price\":0.0,\"food_boxes_total_price\":2.0,\"delivery_total_price\":2.0,\"pay_amount\":35.0,\"city_id\":\"1\"}"}}' http://vpcb-lpdinfra-stream-1.vm.elenet.me:8989/rpc

ps:json串内层参数需要格式化



xzc 2017-05-18 11:28 发表评论
]]>
linux netstat命令使用收集,查看80端口连接数http://www.blogjava.net/xzclog/archive/2017/05/17/432536.htmlxzcxzcwed, 17 may 2017 15:12:00 gmthttp://www.blogjava.net/xzclog/archive/2017/05/17/432536.htmlhttp://www.blogjava.net/xzclog/comments/432536.htmlhttp://www.blogjava.net/xzclog/archive/2017/05/17/432536.html#feedback2http://www.blogjava.net/xzclog/comments/commentrss/432536.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432536.html服务器上的一些统计数据:

1)统计80端口连接数
netstat -nat|grep -i "80"|wc -l

2)统计httpd协议连接数
ps -ef|grep httpd|wc -l

3)、统计已连接上的,状态为“established
netstat -na|grep established|wc -l

4)、查出哪个ip地址连接最多,将其封了.
netstat -na|grep established|awk {print $5}|awk -f: {print $1}|sort|uniq -c|sort -r 0n

netstat -na|grep syn|awk {print $5}|awk -f: {print $1}|sort|uniq -c|sort -r 0n

---------------------------------------------------------------------------------------------

1、查看apache当前并发访问数:
netstat -an | grep established | wc -l

对比httpd.conf中maxclients的数字差距多少。

2、查看有多少个进程数:
ps aux|grep httpd|wc -l

3、可以使用如下参数查看数据
server-status?auto

#ps -ef|grep httpd|wc -l
1388
统计httpd进程数,连个请求会启动一个进程,使用于apache服务器。
表示apache能够处理1388个并发请求,这个值apache可根据负载情况自动调整。

#netstat -nat|grep -i "80"|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与80端口有关的连接的,wc -l进行连接数统计。
最终返回的数字就是当前所有80端口的请求总数。

#netstat -na|grep established|wc -l
376
netstat -an会打印系统当前网络链接状态,而grep established 提取出已建立连接的信息。 然后wc -l统计。
最终返回的数字就是当前所有80端口的已建立连接的总数。

netstat -nat||grep established|wc - 可查看所有建立连接的详细记录

查看apache的并发请求数及其tcp连接状态:
linux命令:
netstat -n | awk '/^tcp/ { s[$nf]} end {for(a in s) print a, s[a]}'

返回结果示例:
last_ack 5
syn_recv 30
established 1597
fin_wait1 51
fin_wait2 504
time_wait 1057
其中的
syn_recv表示正在等待处理的请求数;
established表示正常数据传输状态;
time_wait表示处理完毕,等待超时结束的请求数。

---------------------------------------------------------------------------------------------

查看httpd进程数(即prefork模式下apache能够处理的并发请求数):
linux命令:
     ps -ef | grep httpd | wc -l

查看apache的并发请求数及其tcp连接状态:

linux命令:
     netstat -n | awk '/^tcp/ { s[$nf]} end {for(a in s) print a, s[a]}'
返回结果示例:
last_ack 5
syn_recv 30
established 1597
fin_wait1 51
fin_wait2 504
time_wait 1057

说明:
   syn_recv表示正在等待处理的请求数;
   established表示正常数据传输状态;
   time_wait表示处理完毕,等待超时结束的请求数。

xzc 2017-05-17 23:12
]]>
redis主从 以及认证配置http://www.blogjava.net/xzclog/archive/2017/05/10/432508.htmlxzcxzcwed, 10 may 2017 02:49:00 gmthttp://www.blogjava.net/xzclog/archive/2017/05/10/432508.htmlhttp://www.blogjava.net/xzclog/comments/432508.htmlhttp://www.blogjava.net/xzclog/archive/2017/05/10/432508.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/432508.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432508.html阅读全文

xzc 2017-05-10 10:49
]]>
kerberos简介http://www.blogjava.net/xzclog/archive/2017/04/25/432480.htmlxzcxzctue, 25 apr 2017 07:56:00 gmthttp://www.blogjava.net/xzclog/archive/2017/04/25/432480.htmlhttp://www.blogjava.net/xzclog/comments/432480.htmlhttp://www.blogjava.net/xzclog/archive/2017/04/25/432480.html#feedback2http://www.blogjava.net/xzclog/comments/commentrss/432480.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432480.html

blogjava-凯发k8网页登录

1.1. 功能

  1. 一个安全认证协议

  2. 用tickets验证

  3. 避免本地保存密码和在互联网上传输密码

  4. 包含一个可信任的第三方

  5. 使用对称加密

  6. 客户端与服务器(非kdc)之间能够相互验证

kerberos只提供一种功能——在网络上安全的完成用户的身份验证。它并不提供授权功能或者审计功能。

1.2. 概念

首次请求,三次通信方

  • the authentication server
  • the ticket granting server
  • the service or host machine that you’re wanting access to.

 

图 1‑1 角色

其他知识点

  • 每次通信,消息包含两部分,一部分可解码,一部分不可解码
  • 服务端不会直接有kdc通信
  • kdc保存所有机器的账户名和密码
  • kdc本身具有一个密码

 

  我们这里已获取服务器中的一张表(数据)的服务以为,为一个http服务。

2.1. 你和验证服务

  如果想要获取http服务,你首先要向kdc表名你自己的身份。这个过程可以在你的程序启动时进行。kerberos可以通过kinit获取。介绍自己通过未加密的信息发送至kdc获取ticket granting ticket (tgt)。

(1)信息包含

  • 你的用户名/id
  • 你的ip地址
  • tgt的有效时间

  authentication server收到你的请求后,会去数据库中验证,你是否存在。注意,仅仅是验证是否存在,不会验证对错。

  如果存在,authentication server会产生一个随机的session key(可以是一个64位的字符串)。这个key用于你和ticket granting server (tgs)之间通信。

(2)回送信息

  authentication server同样会发送两部分信息给你,一部分信息为tgt,通过kdc自己的密码进行加密,包含:

  • 你的name/id
  • tgs的name/id
  • 时间戳
  • 你的ip地址
  • tgt的生命周期
  • tgs session key

另外一部分通过你的密码进行加密,包含的信息有

  • tgs的name/id
  • 时间戳
  • 生命周期
  • tgs session key

 

图 2‑1 第一次通信

  如果你的密码是正确的,你就能解密第二部分信息,获取到tgs session key。如果,密码不正确,无法解密,则认证失败。第一部分信息tgt,你是无法解密的,但需要展示缓存起来。

2.2. 你和tgs

如果第一部分你已经成功,你已经拥有无法解密的tgt和一个tgs session key。

(1)    请求信息

 a)  通过tgs session key加密的认证器部分:

  • 你的name/id
  • 时间戳

b)       明文传输部分:

  • 请求的http服务名(就是请求信息)
  • http service的ticket生命周期

c)        tgt部分

  ticket granting server收到信息后,首先检查数据库中是否包含有你请求的http服务名。如果无,直接返回错误信息。

  如果存在,则通过kdc的密码解密tgt,这个时候。我们就能获取到tgs session key。然后,通过tgs session key去解密你传输的第一部分认证器,获取到你的用户名和时间戳。

tgs再进行验证:

  1. 对比tgt中的用户名与认证器中的用户名
  2. 比较时间戳(网上有说认证器中的时间错和tgt中的时间错,个人觉得应该是认证器中的时间戳和系统的时间戳),不能超过一定范围
  3. 检查是否过期
  4. 检查ip地址是否一致
  5. 检查认证器是否已在tgs缓存中(避免应答攻击)
  6. 可以在这部分添加权限认证服务

  tgs随机产生一个http service session key, 同时准备http service ticket(st)。

(2)    回答信息

  a)        通过http服务的密码进行加密的信息(st):

  • 你的name/id
  • http服务name/id
  • 你的ip地址
  • 时间戳
  • st的生命周期
  • http service session key

  b)       通过tgs session key加密的信息

  • http服务name/id
  • 时间戳
  • st的生命周期
  • http service session key

  你收到信息后,通过tgs session key解密,获取到了http service session key,但是你无法解密st。

 

图 2‑2 第二次通信

2.3. 你和http服务

  在前面两步成功后,以后每次获取http服务,在ticket没有过期,或者无更新的情况下,都可直接进行这一步。省略前面两个步骤。

(1)    请求信息

  a)        通过http service session key加密部分

  • 你的name/id
  • 时间戳

  b)       st

   http服务端通过自己的密码解压st(kdc是用http服务的密码加密的),这样就能够获取到http service session key,解密第一部分。

服务端解密好st后,进行检查

  1. 对比st中的用户名(kdc给的)与认证器中的用户名
  2. 比较时间戳(网上有说认证器中的时间错和tgt中的时间错,个人觉得应该是认证器中的时间戳和系统的时间戳),不能超过一定范围
  3. 检查是否过期
  4. 检查ip地址是否一致
  5. 检查认证器是否已在http服务端的缓存中(避免应答攻击)

(2)    应答信息

a)        通过http service session key加密的信息

  • http服务name/id
  • 时间戳

 

图 2‑3 第三次通信

  你在通过缓存的http service session key解密这部分信息,然后验证是否是你想要的服务器发送给你的信息。完成你的服务器的验证。

至此,整个过程全部完成。



xzc 2017-04-25 15:56
]]>
ntp服务及时间同步(centos6.x)http://www.blogjava.net/xzclog/archive/2017/04/14/432453.htmlxzcxzcfri, 14 apr 2017 03:25:00 gmthttp://www.blogjava.net/xzclog/archive/2017/04/14/432453.htmlhttp://www.blogjava.net/xzclog/comments/432453.htmlhttp://www.blogjava.net/xzclog/archive/2017/04/14/432453.html#feedback2http://www.blogjava.net/xzclog/comments/commentrss/432453.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/432453.html no server suitable for synchronization found 判断:在ntp客户端用ntpdate –d serverip查看,发现有“server dropped: strata too high”的错误,并且显示“stratum 16”。而正常情况下stratum这个值得范围是“0~15”。 原因:ntp server还没有和其自身或者它的server同步上。在ntp server上重新启动ntp服务后,ntp server自身或者与其server的同步的需要一个时间段,这个过程可能是5分钟,在这个时间之内在客户端运行ntpdate命令时会产生no server suitable for synchronization found的错误。 处理:等待几分钟后,重试一般解决。 也可以使用命令 ntpq -p查看情况 参考:http://blog.csdn.net/weidan1121/article/details/3953021

xzc 2017-04-14 11:25
]]>
utf-8编码文件bom头的检测与删除http://www.blogjava.net/xzclog/archive/2016/09/18/431799.htmlxzcxzcsun, 18 sep 2016 01:38:00 gmthttp://www.blogjava.net/xzclog/archive/2016/09/18/431799.htmlhttp://www.blogjava.net/xzclog/comments/431799.htmlhttp://www.blogjava.net/xzclog/archive/2016/09/18/431799.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/431799.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/431799.html

所谓bom,全称是,它是一个unicode字符,通常出现在文本的开头,用来标识字节序(big/little endian),除此以外还可以标识编码(utf-8/16/32),如果出现在文本中间,则解释为。 注:unicode相关知识的详细介绍请参考。

对于utf-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就
是1/2/4字节,如果是多字节,就要牵扯到字节序,utf-8以单字节为编码单位,所以不存在字节序。
utf-8主要的优点是可以兼容ascii,但如果使用bom的话,这个好处就荡然无存了,除此以外,bom的存在还可能引发一些问题,比如下面错误便都
有可能是bom导致的:



  • shell: no such file or directory
  • php: warning: cannot modify header information – headers already sent

在详细讨论utf-8编码中bom的检测与删除问题前,不妨先通过一个例子热热身:


shell> curl -s http://phone.10086.cn/ | head -1 | sed -n l
\357\273\277//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">\r$

如上所示,前三个字节分别是357、273、277,这就是八进制的bom。


shell> curl -s http://phone.10086.cn/ | head -1 | hexdump -c
00000000 ef bb bf 3c 21 44 4f 43 54 59 50 45 20 68 74 6d |...00000010 6c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 |l public "-//w3c|
00000020 2f 2f 44 54 44 20 58 48 54 4d 4c 20 31 2e 30 20 |//dtd xhtml 1.0 |
00000030 54 72 61 6e 73 69 74 69 6f 6e 61 6c 2f 2f 45 4e |transitional//en|
00000040 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 |" "http://www.w3|
00000050 2e 6f 72 67 2f 54 52 2f 78 68 74 6d 6c 31 2f 44 |.org/tr/xhtml1/d|
00000060 54 44 2f 78 68 74 6d 6c 31 2d 74 72 61 6e 73 69 |td/xhtml1-transi|
00000070 74 69 6f 6e 61 6c 2e 64 74 64 22 3e 0d 0a |tional.dtd">..|

如上所示,前三个字节分别是ef、bb、bf,这就是十六进制的bom。 注:用到了第三方网站的页面,不能保证例子始终可用。
实际做项目开发时,可能会面对成百上千个文本文件,如果有几个文件混入了bom,那么很难察觉,如果没有带bom的utf-8文本文件,可以用vi杜撰几
个,相关命令如下:


设置utf-8编码:


:set fileencoding=utf-8

添加bom:


:set bomb

删除bom:


:set nobomb

查询bom:


:set bomb?

如何检测utf-8编码中的bom呢?


shell> grep -r -i -l $'^\xef\xbb\xbf' /path

如何删除utf-8编码中的bom呢?


shell> grep -r -i -l $'^\xef\xbb\xbf' /path | xargs sed -i 's/^\xef\xbb\xbf//;q'

推荐:如果你使用svn的话,可以在pre-commit钩子里加上相关代码用以杜绝bom。


#!/bin/bash

repos="$1"
txn="$2"

svnlook=/usr/bin/svnlook

for file in $($svnlook changed -t "$txn" "$repos" | awk '/^[au]/ {print $nf}'); do
if $svnlook cat -t "$txn" "$repos" "$file" | grep -q $'^\xef\xbb\xbf'; then
echo "byte order mark be found in $file" 1>&2
exit 1
fi
done

本文用到了很多shell命令,篇幅所限,恕不详述,如果有不明白的就请自己搜索吧。



xzc 2016-09-18 09:38
]]>
linux 命令 xxd linux下查看二进制文件http://www.blogjava.net/xzclog/archive/2016/09/18/431800.htmlxzcxzcsun, 18 sep 2016 01:38:00 gmthttp://www.blogjava.net/xzclog/archive/2016/09/18/431800.htmlhttp://www.blogjava.net/xzclog/comments/431800.htmlhttp://www.blogjava.net/xzclog/archive/2016/09/18/431800.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/431800.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/431800.html

当我们需要把二进制转成c语言中使用的16进制字符数组时,命令xxd是很有用的。

xxd 帮助信息如下:关键选项标黑。

[root@localhost ]# xxd --help
usage:
       xxd [options] [infile [outfile]]
    or
       xxd -r [-s [-]offset] [-c cols] [-ps] [infile [outfile]]
options:
    -a          toggle autoskip: a single '*' replaces nul-lines. default off.
    -b          binary digit dump (incompatible with -p,-i,-r). default hex.
    -c cols     format octets per line. default 16 (-i: 12, -ps: 30).
    -e          show characters in ebcdic. default ascii.
    -g          number of octets per group in normal output. default 2. 每个goup的字节数,默认为2,可设置。
    -h          print this summary.
    -i          output in c include file style. :输出为c包含文件的风格,数组方式存在。
    -l len      stop after octets.        :转换到len个字节后停止转换。
    -ps         output in postscript plain hexdump style.
    -r          reverse operation: convert (or patch) hexdump into binary.
    -r -s off   revert with added to file positions found in hexdump.
    -s [ ][-]seek start at bytes abs. (or : rel.) infile offset.
   -u          use upper case hex letters. : 字节大写方式
    -v          show version: "xxd v1.10 27oct98 by juergen weigert".

比如运行:

> xxd -g 1 -i -u -l 10000000 nm.ts > xxd_test.txt

生成的文本显示:

unsigned char __0513_1634_ch32_666_10_ts[] = {
0x47, 0x02, 0x03, 0x13, 0xf8, 0x5a, 0xc5, 0x40, 0x26, 0xe4, 0xd0, 0xde,
0xad, 0xb8, 0x76, 0x89, 0x85, 0x23, 0x06, 0x04, 0x6e, 0x05, 0x8b, 0x09,
0xc0, 0x5c, 0x96, 0x4f, 0x18, 0x51, 0x41, 0xc8, 0x40, 0x9f, 0x06, 0x93,
0x38, 0xc1, 0xbb, 0x1a, 0xbc, 0xac, 0x47, 0xff, 0x5e, 0x54, 0xeb, 0xa7,
0x14, 0x36, 0x85, 0x8a, 0x90, 0x14, 0x17, 0xa2, 0x9d, 0xc0, 0x84, 0x56,
0xcb, 0x97, 0x78, 0xc8, 0x57, 0x15, 0x3e, 0x61, 0x6f, 0xfe, 0xc9, 0x39,
0xef, 0xd3, 0xb6, 0x6a, 0xd2, 0xe4, 0xfb, 0x4c, 0x05, 0xf6, 0x03, 0xed,
0x50, 0xb3, 0xe7, 0x46, 0x57, 0x24, 0x71, 0x16, 0x38, 0x45, 0x53, 0x19,
0x56, 0x25, 0x3c, 0x8d, 0x4c, 0xa9, 0x28, 0x9a, 0xb2, 0x99, 0x76, 0x52,
0x28, 0xe9, 0xd6, 0xd6, 0x11, 0x94, 0x89, 0x19, 0x4d, 0xea, 0x68, 0x76,
0x53, 0xc6, 0xaa, 0x3a, 0xd4, 0xa1, 0x25, 0xa5, 0x03, 0xb0, 0x73, 0xa0,
0xae, 0x11, 0xc9, 0xbd, 0x37, 0x17, 0x11, 0x5f, 0x30, 0x34, 0x34, 0x0b

.....

};

unsigned int nm.ts_len = 10000000;

另外,在vim中也可以把文件转换为16进制来显示:

:%!xxd

返回正常显示:

:%!xxd -r

 

linux下查看二进制文件
以十六进制格式输出:
od [选项] 文件
od -d 文件  十进制输出
   -o 文件  八进制输出
   -x 文件  十六进制输出
xxd 文件  输出十六进制

在vi命令状态下:
:%!xxd   :%!od    将当前文本转化为16进制格式
:%!xxd -c 12 每行显示12个字节
:%!xxd -r    将当前文本转化回文本格式



xzc 2016-09-18 09:38
]]>
shell中的ifs解惑 http://www.blogjava.net/xzclog/archive/2016/04/01/429934.htmlxzcxzcfri, 01 apr 2016 07:00:00 gmthttp://www.blogjava.net/xzclog/archive/2016/04/01/429934.htmlhttp://www.blogjava.net/xzclog/comments/429934.htmlhttp://www.blogjava.net/xzclog/archive/2016/04/01/429934.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/429934.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/429934.html

一、ifs 介绍

     shell 脚本中有个变量叫 ifs(internal field seprator) ,内部域分隔符。完整定义是the shell uses the value stored in ifs, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

     shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。

     而 ifs 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 ifs 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

二、ifs 简单实例

1、查看变量 ifs 的值。

[plain]
  1. $ echo $ifs  
  2.   
  3. $ echo "$ifs" | od -b  
  4. 0000000 040 011 012 012  
  5. 0000004  
$ echo $ifs  $ echo "$ifs" | od -b 0000000 040 011 012 012 0000004

直接输出ifs是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是tab,"012"是换行符"\n" 。最后一个 012 是因为 echo 默认是会换行的。

2、$* 和 $@ 的细微差别
     从下面的例子中可以看出,如果是用冒号引起来,表示这个变量不用ifs替换!!所以可以看到这个变量的"原始值"。反之,如果不加引号,输出时会根据ifs的值来分割后合并输出! $* 是按照ifs中的第一个值来确定的!下面这两个例子还有细微的差别!

[plain]
  1. $ ifs=:;  
  2. $ set x y z  
  3. $ echo $*  
  4. x y z  
  5. $ echo "$*"  
  6. x:y:z  
  7. $ echo $@  
  8. x y z  
  9. $ echo "$@"  
  10. x y z  
$ ifs=:; $ set x y z $ echo $* x y z $ echo "$*" x:y:z $ echo $@ x y z $ echo "$@" x y z
 上例 set 变量其实是3个参数,而下面这个例子实质是2个参数,即 set "x y z"  和 set x y z 是完全不同的。
[plain]
  1. $ set "x" "y z"  
  2. $ echo $*  
  3. x y z  
  4. $ echo "$*"  
  5. x:y z  
  6. $ echo $@  
  7. x y z  
  8. $ echo "$@"  
  9. x y z  
  10. $ echo $* |od -b  
  11. 0000000 170 040 171 040 172 012  
  12. 0000006  
  13. $ echo "$*" |od -b  
  14. 0000000 170 072 171 040 172 012  
  15. 0000006  
$ set "x" "y z" $ echo $* x y z $ echo "$*" x:y z $ echo $@ x y z $ echo "$@" x y z $ echo $* |od -b 0000000 170 040 171 040 172 012 0000006 $ echo "$*" |od -b 0000000 170 072 171 040 172 012 0000006

小结:$* 会根据 ifs 的不同来组合值,而 $@ 则会将值用" "来组合值!

3、for 循环中的奇怪现象

[plain]
  1. $ for x in $var ;do echo $x |od -b ;done  
  2. 0000000 012  
  3. 0000001  
  4. 0000000 040 141 012  
  5. 0000003  
  6. 0000000 142 012  
  7. 0000002  
  8. 0000000 012  
  9. 0000001  
  10. 0000000 143 012  
  11. 0000002  
$ for x in $var ;do echo $x |od -b ;done 0000000 012 0000001 0000000 040 141 012 0000003 0000000 142 012 0000002 0000000 012 0000001 0000000 143 012 0000002

 

先暂且不解释 for 循环的内容!看下面这个输出!ifs 的值同上! var=": a:b::c:"
[plain]
  1. $ echo $var |od -b  
  2. 0000000 040 040 141 040 142 040 040 143 012  
  3. 0000011  
  4. $ echo "$var" |od -b  
  5. 0000000 072 040 141 072 142 072 072 143 072 012  
  6. 0000012  
$ echo $var |od -b 0000000 040 040 141 040 142 040 040 143 012 0000011 $ echo "$var" |od -b 0000000 072 040 141 072 142 072 072 143 072 012 0000012

"$var"的值应该没做替换,所以还是 ": a:b::c:" (注 "072" 表示冒号),但是$var 则发生了变化!注意输出的最后一个冒号没有了,也没有替换为空格!why?

 

使用 $var 时是经历了这样一个过程!首先,按照这样的规则 [变量][ifs][变量][ifs]……根据原始 var 值中所有的分割符(此处是":")划分出变量,如果ifs的值是有多个字符组成,如ifs=":;",那么此处的[ifs]指的是ifs中的任意一个字符($* 是按第一个字符来分隔!),如 ":" 或者 ";" ,后面不再对[ifs]做类似说明!(注:[ifs]会有多个值,多亏 的提醒);然后,得到类似这样的 list, ""   " a"   "b"  ""   "c"  。如果此时 echo $var,则需要在这些变量之间用空格隔开,也就是""  [space]   "  a"  [space]  "b" [space]  "" [space]  "c" ,忽略掉空值最终输出是 [space][space]a[space]b[space][space]c

如果最后一个字符不是分隔符,如 var="a:b",那么最后一个分隔符后的变量就是最后一个变量!

这个地方要注意下!!如果ifs就是空格,那么类似于" [space][space]a[space]b[space][space]c "会合并重复的部分,且去头空格,去尾空格,那么最终输出会变成类似 a[space]b[space]c ,所以,如果ifs是默认值,那么处理的结果就很好算出来,直接合并、忽略多余空格即可!

另外,$* 和 $@ 在函数中的处理过程是这样的(只考虑"原始值"!)!"$@",就是像上面处理后赋值,但是 "$*" 却不一样!它的值是用分隔符(如":")而不是空格隔开!具体例子见最后一个例子!

好了,现在来解释 for 循环的内容。for 循环遍历上面这个列表就可以了,所以 for 循环的第一个输出是空!("012"是echo输出的换行符 )。。。。后面的依次类推!不信可以试试下面这个例子,结果是一样的!

[plain]
  1. $ for x in "" " a" "b" "" "c" ;do echo $x |od -b ;done  
  2. 0000000 012  
  3. 0000001  
  4. 0000000 040 141 012  
  5. 0000003  
  6. 0000000 012  
  7. 0000001  
  8. 0000000 142 012  
  9. 0000002  
  10. 0000000 012  
  11. 0000001  
  12. 0000000 143 012  
  13. 0000002  
$ for x in "" " a" "b" "" "c" ;do echo $x |od -b ;done 0000000 012 0000001 0000000 040 141 012 0000003 0000000 012 0000001 0000000 142 012 0000002 0000000 012 0000001 0000000 143 012 0000002

三、ifs的其他实例

example 1:

 

[plain]
  1. $ ifs=:  
  2. $ var=ab::cd  
  3. $ echo $var  
  4. ab  cd  
  5. $ echo "$var"  
  6. ab::cd  
$ ifs=: $ var=ab::cd $ echo $var ab  cd $ echo "$var" ab::cd
解释下:x 的值是 "ab::cd",当进行到 echo $x 时,因为$符,所以会进行变量替换。shell 根据 ifs 的值将 x 分解为 ab "" cd,然后echo,插入空隔,ab[space]""[space]cd,忽略"",输出  ab  cd 。

example 2 :

[plain]
  1. $ read a  
  2.        xy  z  
  3. $ echo $a  
  4. xy  z  
$ read a        xy  z $ echo $a xy  z

解释:这是  上的一个例子。此时ifs是默认值,本希望把所有的输入(包括空格)都放入变量a中,但是输出的a却把前面的空格给忽略了!!原因是:默认的 ifs 会按 space tab newline 来分割。这里需要注意的一点是,read 命令的实现过程,即在读入时已经替换了。解决办法是在开头加上一句 ifs=";" ,这里必须加上双引号,因为分号有特殊含义。

example 3 :

[plain]
  1. $ tmp="   xy z"  
  2. $ a=$tmp  
  3. $ echo $a  
  4. $ echo "$a"  
$ tmp="   xy z" $ a=$tmp $ echo $a $ echo "$a"

解释:什么时候会根据 ifs 来"处理"呢?我觉得是,对于不加引号的变量,使用时都会参考ifs,但是要注意其原始值!

example 4 :

[plain]
  1. #!/bin/bash  
  2. ifs_old=$ifs      #将原ifs值保存,以便用完后恢复  
  3. ifs=$’\n’        #更改ifs值为$’\n’ ,注意,以回车做为分隔符,ifs必须为:$’\n’  
  4. for i in $((cat pwd.txt)) #pwd.txt 来自这个命令:cat /etc/passwd >pwd.txt  
  5. do  
  6.     echo $i  
  7. done  
  8. ifs=$ifs_old      #恢复原ifs值  
#!/bin/bash ifs_old=$ifs      #将原ifs值保存,以便用完后恢复 ifs=$’\n’        #更改ifs值为$’\n’ ,注意,以回车做为分隔符,ifs必须为:$’\n’ for i in $((cat pwd.txt)) #pwd.txt 来自这个命令:cat /etc/passwd >pwd.txt do     echo $i done ifs=$ifs_old      #恢复原ifs值
另外一个例子,把ip地址逆转输出:

example 5 :

[plain]
  1. #!/bin/bash  
  2.   
  3. ip=220.112.253.111  
  4. ifs="."  
  5. tmpip=$(echo $ip)  
  6. ifs=" " # space  
  7. echo $tmpip  
  8. for x in $tmpip ;do   
  9.     xip="${x}.$xip"  
  10. done  
  11. echo ${xip%.}  
#!/bin/bash  ip=220.112.253.111 ifs="." tmpip=$(echo $ip) ifs=" " # space echo $tmpip for x in $tmpip ;do      xip="${x}.$xip" done echo ${xip%.}

complex_example 1:  

[plain]
  1. function output_args_ifs(){  
  2.     echo "=$*"  
  3.     echo "="$*  
  4.     for m in $* ;do   
  5.         echo "[$m]"  
  6.     done  
  7. }  
  8.   
  9. ifs=':'  
  10. var='::a:b::c:::'  
  11. output_args_ifs $var  
function output_args_ifs(){     echo "=$*"     echo "="$*     for m in $* ;do          echo "[$m]"     done }  ifs=':' var='::a:b::c:::' output_args_ifs $var

 

输出为:

[plain]
  1. =::a:b::c::  # 少了最后一个冒号!看前面就知道为什么了  
  2. =  a b  c   
  3. []  
  4. []  
  5. [a]  
  6. [b]  
  7. []  
  8. [c]  
  9. []  
=::a:b::c::  # 少了最后一个冒号!看前面就知道为什么了 =  a b  c  [] [] [a] [b] [] [c] []

由于 "output_args_ifs $var" 中 $var 没有加引号,所以根据ifs替换!根据ifs划分出变量: ""  ""  "a"  "b"  ""  "c" "" ""(可以通过输出 $# 来测试参数的个数!),重组的结果为

 "$@" 的值是  "" [space] "" [space]  "a" [space]  "b"  [space] "" [space]  "c" [space] "" [space] "",可以通过,echo==>"  a b  c   "
"$*" 的值是   "" [ifs] "" [ifs]  "a" [ifs]  "b"  [ifs] "" [ifs]  "c" [ifs] "" [ifs] "",忽略"",echo=>"::a:b::c::"

注意, $* 和 $@ 的值都是  ""   ""   "a"   "b"   ""   "c"  ""  "" 。可以说是一个列表……因为他们本来就是由 $1 $2 $3……组成的。

所以,《linux程序设计》里推荐使用 $@,而不是$*

总结:ifs 其实还是很麻烦的,稍有不慎就会产生很奇怪的结果,因此使用的时候要注意!我也走了不少弯路,只希望能给后来者一些帮助。本文若有问题,欢迎指正!!谢谢!

如有转载,请注明
参考:




xzc 2016-04-01 15:00
]]>
linux diff与comm命令比较文件(找出新增内容)http://www.blogjava.net/xzclog/archive/2016/03/24/429791.htmlxzcxzcthu, 24 mar 2016 04:09:00 gmthttp://www.blogjava.net/xzclog/archive/2016/03/24/429791.htmlhttp://www.blogjava.net/xzclog/comments/429791.htmlhttp://www.blogjava.net/xzclog/archive/2016/03/24/429791.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/429791.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/429791.html

在项目中遇到一个奇怪的bug,是由一行简单代码引起的。
代码作用:比较两个unix文本文件,找出并打印文本2比文本1新增加的内容。
代码调用了diff命令,例如:
 
 

复制代码
代码如下:

# temp1.txt文件内容
$> cat temp1.txt
20110224
20110225
20110228
20110301
20110302
# temp2.txt文件内容
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304

 

# diff命令输出结果


复制代码
代码如下:

$> diff temp1.txt temp2.txt
1,2d0
< 20110224
< 20110225
5a4,5
> 20110303
> 20110304
# 只输出temp2.txt文件独有的内容
$> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
20110303
20110304

 

说明:输出结果去掉了两个文件的共同内容,只输出了temp2.txt的新增部分,和预想的结果一样。
 
但是,随着temp1.txt文件内容的增加,diff命令出现了不同预期的结果:


复制代码
代码如下:

$> cat temp1.txt
20101216
20101217
20101220
20101221
20101223
20101224
20101227
20101228
20101229
20101230
20101231
20110103
20110104
20110105
20110106
20110107
20110110
20110111
20110112
20110113
20110114
20110117
20110118
20110119
20110120
20110121
20110124
20110125
20110126
20110127
20110128
20110131
20110201
20110202
20110203
20110204
20110207
20110208
20110209
20110210
20110211
20110214
20110215
20110216
20110217
20110218
20110221
20110222
20110223
20110224
20110225
20110228
20110301
20110302
20110303
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304
20110307
20110308
20110309
20110310
20110311
20110314
$> diff temp1.txt temp2.txt
1,55c1,11
< 20101216
< 20101217
< 20101220
< 20101221
< 20101223
< 20101224
< 20101227
< 20101228
< 20101229
< 20101230
< 20101231
< 20110103
< 20110104
< 20110105
< 20110106
< 20110107
< 20110110
< 20110111
< 20110112
< 20110113
< 20110114
< 20110117
< 20110118
< 20110119
< 20110120
< 20110121
< 20110124
< 20110125
< 20110126
< 20110127
< 20110128
< 20110131
< 20110201
< 20110202
< 20110203
< 20110204
< 20110207
< 20110208
< 20110209
< 20110210
< 20110211
< 20110214
< 20110215
< 20110216
< 20110217
< 20110218
< 20110221
< 20110222
< 20110223
< 20110224
< 20110225
< 20110228
< 20110301
< 20110302
< 20110303
---
> 20110228
> 20110301
> 20110302
> 20110303
> 20110304
> 20110307
> 20110308
> 20110309
> 20110310
> 20110311
> 20110314
$> diff temp1.txt temp2.txt | grep "> " | sed 's/> //g'
20110228
20110301
20110302
20110303
20110304
20110307
20110308
20110309
20110310
20110311
20110314

 

可以看到,diff命令不但输出了temp2.txt文件的新增部分(20110304-20110314),也同时输出了两个文件的共同内容(20110228-20110303),从而导致了与预期不一致的结果。
查看diff命令的man手册发现,diff的作用是比较两个文件的内容,并输出两个文件之间的差异,产生一个能够将两个文件互相转换的列表,但这个列表并不能100%保证是最小集。
于是,以上例子中,可以看到diff给出了temp1.txt和temp2.txt文件的比较差异结果,但其中包含了两个文件的共同部分,因此与预期不一样。
 
解决方法:
用comm命令代替diff,例如:


复制代码
代码如下:

$> comm -13 temp1.txt temp2.txt
20110304
20110307
20110308
20110309
20110310
20110311
20110314

 

comm命令用来比较两个文件,具体用法:
comm [-123] file1 file2
-1 过滤file1独有的内容
-2 过滤file2独有的内容
-3 过滤file1和file2重复的内容
 
备注:
diff的输出格式,主要有以下几种:
n1 a n3,n4
n1,n2 d n3
n1,n2 c n3,n4
例如"1,2d0" "5a4,5" "1,55c1,11"等。
其中n1和n2指第一个文件的行数,n3和n4指第二个文件的行数。"a"代表add增加,"d"代表delete删除,"c"代表change整块变动。
有了diff的输出结果,可以使用patch命令将一个文件恢复成另一个,例如:


复制代码
代码如下:

$> cat temp1.txt
20110224
20110225
20110228
20110301
20110302
$> cat temp2.txt
20110228
20110301
20110302
20110303
20110304
$> diff temp1.txt temp2.txt > temp.diff
$> cat temp.diff
1,2d0
< 20110224
< 20110225
5a4,5
> 20110303
> 20110304
# 使用temp.diff和temp1.txt恢复temp2文件
$> patch -i temp.diff -o temp2_restore.txt temp1.txt
looks like a normal diff.
done
# 完成后temp2_restore和原temp2文件内容一致
$> cat temp2_restore.txt
20110228
20110301
20110302
20110303
20110304


xzc 2016-03-24 12:09
]]>
shell 判断ftp是否成功连接http://www.blogjava.net/xzclog/archive/2016/03/24/429790.htmlxzcxzcthu, 24 mar 2016 04:08:00 gmthttp://www.blogjava.net/xzclog/archive/2016/03/24/429790.htmlhttp://www.blogjava.net/xzclog/comments/429790.htmlhttp://www.blogjava.net/xzclog/archive/2016/03/24/429790.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/429790.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/429790.html
status=`ftp -v -n $ip<
user $name $code
binary
cd $remote_dir
lcd $local_dir
prompt
mget *.txt
#mdelete *.txt
close
bye
end_script`

echo $status|grep "226 transfer complete"
if [ $? -eq 0 ]
then
      echo "connect succeed!!!"
      exit 0
else
      echo $status|grep "530 login incorrect"
      if [ $? -eq 0 ]
      then
            echo "ftp connect error!!!"
            exit 1
      else
            echo "no data transferred!!!"
            exit 0
      fi
fi


xzc 2016-03-24 12:08
]]>
linux下一次性删除大量文件方法http://www.blogjava.net/xzclog/archive/2016/02/14/429317.htmlxzcxzcsun, 14 feb 2016 03:05:00 gmthttp://www.blogjava.net/xzclog/archive/2016/02/14/429317.htmlhttp://www.blogjava.net/xzclog/comments/429317.htmlhttp://www.blogjava.net/xzclog/archive/2016/02/14/429317.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/429317.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/429317.html[转载]http://www.blogjava.net/hongqiang/archive/2012/07/12/382939.html
假如你要在linux下删除大量文件,比如100万、1000万,像/var/spool/clientmqueue/的mail邮件, 
像/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf *可能就不好使了。 
rsync提供了一些跟删除相关的参数 
rsync --help | grep delete 
     --del                   an alias for --delete-during 
     --delete                delete files that don't exist on the sending side 
     --delete-before         receiver deletes before transfer (default) 
     --delete-during         receiver deletes during transfer, not before 
     --delete-after          receiver deletes after transfer, not before 
     --delete-excluded       also delete excluded files on the receiving side 
     --ignore-errors         delete even if there are i/o errors 
     --max-delete=num        don't delete more than num files 
其中--delete-before    接收者在传输之前进行删除操作 
可以用来清空目录或文件,如下: 
1、先建立一个空目录 
mkdir /data/blank 
2、用rsync删除目标目录 
rsync --delete-before -d /data/blank/ /var/spool/clientmqueue/ 
这样目标目录很快就被清空了 
又假如你有一些特别大的文件要删除,比如nohup.out这样的实时更新的文件,动辄都是几十个g上百g的,也可 
以用rsync来清空大文件,而且效率比较高 
1、创建空文件 
touch /data/blank.txt 
2、用rsync清空文件 
rsync -a --delete-before --progress --stats /root/blank.txt /root/nohup.out 
building file list ... 
1 file to consider 
blank.txt 
           0 100%    0.00kb/s    0:00:00 (xfer#1, to-check=0/1) 
number of files: 1 
number of files transferred: 1 
total file size: 0 bytes 
total transferred file size: 0 bytes 
literal data: 0 bytes 
matched data: 0 bytes 
file list size: 27 
file list generation time: 0.006 seconds 
file list transfer time: 0.000 seconds 
total bytes sent: 73 
total bytes received: 31 
sent 73 bytes  received 31 bytes  208.00 bytes/sec 
total size is 0  speedup is 0.00 
tips: 
当src和dest文件性质不一致时将会报错 
当src和dest性质都为文件【f】时,意思是清空文件内容而不是删除文件 
当src和dest性质都为目录【d】时,意思是删除该目录下的所有文件,使其变为空目录 
最重要的是,它的处理速度相当快,处理几个g的文件也就是秒级的事 
最核心的内容是:rsync实际上用的就是替换原理 
另外一种方式:利用xagr与ls结合
ls | xargs -n 20 rm -fr
ls当然是输出所有的文件名(用空格分割)
xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm -rf的参数
也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了


xzc 2016-02-14 11:05
]]>
15个实用的linux find命令示例http://www.blogjava.net/xzclog/archive/2015/12/23/428787.htmlxzcxzcwed, 23 dec 2015 02:34:00 gmthttp://www.blogjava.net/xzclog/archive/2015/12/23/428787.htmlhttp://www.blogjava.net/xzclog/comments/428787.htmlhttp://www.blogjava.net/xzclog/archive/2015/12/23/428787.html#feedback3http://www.blogjava.net/xzclog/comments/commentrss/428787.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428787.html

除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行之旅更加简易。

本文将介绍15种无论是于新手还是老鸟都非常有用的linux find命令。

首先,在你的home目录下面创建下面的空文件,来测试下面的find命令示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# vim create_sample_files.sh
touch mybashprogram.sh
touch mycprogram.c
touch mycprogram.c
touch program.c
mkdir backup
cd backup
touch mybashprogram.sh
touch mycprogram.c
touch mycprogram.c
touch program.c
# chmod x create_sample_files.sh
# ./create_sample_files.sh
# ls -r
.:
backup                  mybashprogram.sh  mycprogram.c
create_sample_files.sh  mycprogram.c      program.c
./backup:
mybashprogram.sh  mycprogram.c  mycprogram.c  program.c

1. 用文件名查找文件

这是find命令的一个基本用法。下面的例子展示了用mycprogram.c作为查找名在当前目录及其子目录中查找文件的方法。

1
2
3
# find -name "mycprogram.c"
./backup/mycprogram.c
./mycprogram.c

2.用文件名查找文件,忽略大小写

这是find命令的一个基本用法。下面的例子展示了用mycprogram.c作为查找名在当前目录及其子目录中查找文件的方法,忽略了大小写。

1
2
3
4
5
# find -iname "mycprogram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/mycprogram.c
./mycprogram.c

 

3. 使用mindepth和maxdepth限定搜索指定目录的深度

在root目录及其子目录下查找passwd文件。

1
2
3
4
5
# find / -name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd

在root目录及其1层深的子目录中查找passwd. (例如root — level 1, and one sub-directory — level 2)

1
2
# find -maxdepth 2 -name passwd
./etc/passwd

在root目录下及其最大两层深度的子目录中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 )

1
2
3
4
# find / -maxdepth 3 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd

在第二层子目录和第四层子目录之间查找passwd文件。

1
2
3
# find -mindepth 3 -maxdepth 5 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd

4. 在find命令查找到的文件上执行命令

下面的例子展示了find命令来计算所有不区分大小写的文件名为“mycprogram.c”的文件的md5验证和。{}将会被当前文件名取代。

1
2
3
4
5
find -iname "mycprogram.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e  ./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e  ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e  ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e  ./mycprogram.c

5. 相反匹配

显示所有的名字不是mycprogram.c的文件或者目录。由于maxdepth是1,所以只会显示当前目录下的文件和目录。

1
2
3
4
5
6
find -maxdepth 1 -not -iname "mycprogram.c"
.
./mybashprogram.sh
./create_sample_files.sh
./backup
./program.c

6. 使用inode编号查找文件

任何一个文件都有一个独一无二的inode编号,借此我们可以区分文件。创建两个名字相似的文件,例如一个有空格结尾,一个没有。

1
2
3
4
5
6
touch "test-file-name"
# touch "test-file-name "
[note: there is a space at the end]
# ls -1 test*
test-file-name
test-file-name

从ls的输出不能区分哪个文件有空格结尾。使用选项-i,可以看到文件的inode编号,借此可以区分这两个文件。

1
2
3
ls -i1 test*
16187429 test-file-name
16187430 test-file-name

你可以如下面所示在find命令中指定inode编号。在此,find命令用inode编号重命名了一个文件。

1
2
3
4
5
find -inum 16187430 -exec mv {} new-test-file-name \;
 
 # ls -i1 *test*
16187430 new-test-file-name
16187429 test-file-name

你可以在你想对那些像上面一样的糟糕命名的文件做某些操作时使用这一技术。例如,名为file?.txt的文件名字中有一个特殊字符。若你想执行“rm file?.txt”,下面所示的所有三个文件都会被删除。所以,采用下面的步骤来删除”file?.txt”文件。

1
2
ls
file1.txt  file2.txt  file?.txt

找到每一个文件的inode编号。

1
2
3
4
ls -i1
804178 file1.txt
804179 file2.txt
804180 file?.txt

如下所示:?使用inode编号来删除那些具有特殊符号的文件名。

1
2
3
4
find -inum 804180 -exec rm {} \;
# ls
file1.txt  file2.txt
[note: the file with name "file?.txt" is now removed]

7. 根据文件权限查找文件

下面的操作时合理的:

  • 找到具有指定权限的文件
  • 忽略其他权限位,检查是否和指定权限匹配
  • 根据给定的八进制/符号表达的权限搜索

此例中,假设目录包含以下文件。注意这些文件的权限不同。

1
2
3
4
5
6
7
8
ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
---------- 1 root root 0 2009-02-19 20:31 no_for_all
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read

找到具有组读权限的文件。使用下面的命令来找到当前目录下对同组用户具有读权限的文件,忽略该文件的其他权限。

1
2
3
4
5
find . -perm -g=r -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
-rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read

找到对组用户具有只读权限的文件。

1
2
find . -perm g=r -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read

找到对组用户具有只读权限的文件(使用八进制权限形式)。

1
2
find . -perm 040 -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read

8. 找到home目录及子目录下所有的空文件(0字节文件)

下面命令的输出文件绝大多数都是锁定文件盒其他程序创建的place hoders

1
find ~ -empty

只列出你home目录里的空文件。

1
find . -maxdepth 1 -empty

只列出当年目录下的非隐藏空文件。

1
find . -maxdepth 1 -empty -not -name ".*"

9. 查找5个最大的文件

下面的命令列出当前目录及子目录下的5个最大的文件。这会需要一点时间,取决于命令需要处理的文件数量。

1
find . -type f -exec ls -s {} \; | sort -n -r | head -5

10. 查找5个最小的文件

方法同查找5个最大的文件类似,区别只是sort的顺序是降序。

1
find . -type f -exec ls -s {} \; | sort -n  | head -5

上面的命令中,很可能你看到的只是空文件(0字节文件)。如此,你可以使用下面的命令列出最小的文件,而不是0字节文件。

1
find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5

11. 使用-type查找指定文件类型的文件

只查找socket文件

1
find . -type s

查找所有的目录

1
find . -type d

查找所有的一般文件

1
find . -type f

查找所有的隐藏文件

1
find . -type f -name ".*"

查找所有的隐藏目录

1
find -type d -name ".*"

12. 通过和其他文件比较修改时间查找文件

显示在指定文件之后做出修改的文件。下面的find命令将显示所有的在ordinary_file之后创建修改的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ls -lrt
total 0
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
---------- 1 root root 0 2009-02-19 20:31 no_for_all
 
# find -newer ordinary_file
.
./everybody_read
./all_for_all
./no_for_all

13. 通过文件大小查找文件

使用-size选项可以通过文件大小查找文件。

查找比指定文件大的文件

1
find ~ -size 100m

查找比指定文件小的文件

1
find ~ -size -100m

查找符合给定大小的文件

1
find ~ -size 100m

注意: – 指比给定尺寸小, 指比给定尺寸大。没有符号代表和给定尺寸完全一样大。

14. 给常用find操作取别名

若你发现有些东西很有用,你可以给他取别名。并且在任何你希望的地方执行。

常用的删除a.out文件。

1
2
alias rmao="find . -iname a.out -exec rm {} \;"
# rmao

删除c程序产生的core文件。

1
2
alias rmc="find . -iname core -exec rm {} \;"
# rmc

15. 用find命令删除大型打包文件

下面的命令删除大于100m的*.zip文件。

1
find / -type f -name *.zip -size 100m -exec rm -i {} \;"

用别名rm100m删除所有大雨100m的*.tar文件。使用同样的思想可以创建rm1g,rm2g,rm5g的一类别名来删除所有大于1g,2g,5g的文件。

1
2
3
4
5
6
7
8
9
alias rm100m="find / -type f -name *.tar -size 100m -exec rm -i {} \;"
# alias rm1g="find / -type f -name *.tar -size 1g -exec rm -i {} \;"
# alias rm2g="find / -type f -name *.tar -size 2g -exec rm -i {} \;"
# alias rm5g="find / -type f -name *.tar -size 5g -exec rm -i {} \;"
 
# rm100m
# rm1g
# rm2g
# rm5g

find命令示例(第二部分)

若你喜欢这篇关于find命令的mommy文章,别忘了看看第二部分的关于find命令的daddy文章。《》



xzc 2015-12-23 10:34
]]>
linux中用shell获取昨天、明天或多天前的日期http://www.blogjava.net/xzclog/archive/2015/12/08/428555.htmlxzcxzctue, 08 dec 2015 01:33:00 gmthttp://www.blogjava.net/xzclog/archive/2015/12/08/428555.htmlhttp://www.blogjava.net/xzclog/comments/428555.htmlhttp://www.blogjava.net/xzclog/archive/2015/12/08/428555.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428555.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428555.html

原文地址:http://www.itwis.com/html/os/linux/20100202/7360.html

 

 

linux中用shell获取昨天、明天或多天前的日期:

在linux中对man date -d 参数说的比较模糊,以下举例进一步说明:

# -d, --date=string display time described by string, not `now’

[c-sharp]
  1. [root@gman root]# date -d next-day  %y%m%d #明天日期  
  2. 20091024  
  3. [root@gman root]# date -d last-day  %y%m%d #昨天日期  
  4. 20091022  
  5. [root@gman root]# date -d yesterday  %y%m%d #昨天日期  
  6. 20091022  
  7. [root@gman root]# date -d tomorrow  %y%m%d # 明天日期  
  8. 20091024  
  9. [root@gman root]# date -d last-month  %y%m #上个月日期  
  10. 200909  
  11. [root@gman root]# date -d next-month  %y%m #下个月日期  
  12. 200911  
  13. [root@gman root]# date -d next-year  %y #明年日期  
  14. 2010  

 

 

date=$(date %y%m%d --date '2 days ago') #获取昨天或多天前的日期

 

 

 

名称 : date

使用权限 : 所有使用者

使用方式 : date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [ format] [mmddhhmm[[cc]yy][.ss]]

说明 : date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下 :

 

[c-sharp] 
  1. 时间方面 :  
  2. % : 印出  
  3. % %n : 下一行  
  4. %t : 跳格  
  5. %h : 小时(00..23)  
  6. %i : 小时(01..12)  
  7. %k : 小时(0..23)  
  8. %l : 小时(1..12)  
  9. %m : 分钟(00..59)  
  10. %p : 显示本地 am 或 pm  
  11. %r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [ap]m)  
  12. %s : 从 1970 年 1 月 1 日 00:00:00 utc 到目前为止的秒数 %s : 秒(00..61)  
  13. %t : 直接显示时间 (24 小时制)  
  14. %x : 相当于 %h:%m:%s  
  15. %z : 显示时区  
 

 

 

[c-sharp] 
  1. 日期方面 :  
  2. %a : 星期几 (sun..sat)  
  3. %a : 星期几 (sunday..saturday)  
  4. %b : 月份 (jan..dec)  
  5. %b : 月份 (january..december)  
  6. %c : 直接显示日期和时间  
  7. %d : 日 (01..31)  
  8. %d : 直接显示日期 (mm/dd/yy)  
  9. %h : 同 %b  
  10. %j : 一年中的第几天 (001..366)  
  11. %m : 月份 (01..12)  
  12. %u : 一年中的第几周 (00..53) (以 sunday 为一周的第一天的情形)  
  13. %w : 一周中的第几天 (0..6)  
  14. %w : 一年中的第几周 (00..53) (以 monday 为一周的第一天的情形)  
  15. %x : 直接显示日期 (mm/dd/yy)  
  16. %y : 年份的最后两位数字 (00.99)  
  17. %y : 完整年份 (0000..9999)  
 

 

 

若是不以加号作为开头,则表示要设定时间,而时间格式为 mmddhhmm[[cc]yy][.ss],

其中 mm 为月份,

dd 为日,

hh 为小时,

mm 为分钟,

cc 为年份前两位数字,

yy 为年份后两位数字,

ss 为秒数

把计 :

-d datestr : 显示 datestr 中所设定的时间 (非系统时间)

--help : 显示辅助讯息

-s datestr : 将系统时间设为 datestr 中所设定的时间

-u : 显示目前的格林威治时间

--version : 显示版本编号

例子 :

显示时间后跳行,再显示目前日期 : date %t%n%d

显示月份和日数 : date %b %d

显示日期和设定时间(12:34:56) : date --date 12:34:56

设置系统当前时间(12:34:56):date --s 12:34:56

注意 : 当你不希望出现无意义的 0 时(比如说 1999/03/07),则能在标记中插入 - 符号,比如说 date %-h:%-m:%-s 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。 当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 cmos 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。

ntp时间同步

linux系统下默认安装了ntp服务,手动进行ntp同步如下

ntpdate ntp1.nl.net

当然,也能指定其他的ntp服务器

 

 

 

-------------------------------------------------------------------

 

 

 

扩展功能

date 工具可以完成更多的工作,不仅仅只是打印出当前的系统日期。您可以使用它来得到给定的日期究竟是星期几,并得到相对于当前日期的相对日期。了解某一天是星期几

gnu 对 date 命令的另一个扩展是 -d 选项,当您的桌上没有日历表时(unix 用户不需要日历表),该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期究竟是星期几:

$ date -d "nov 22"

wed nov 22 00:00:00 est 2006

$

在本示例中,您可以看到今年的 11 月 22 日是星期三。

所以,假设在 11 月 22 日召开一个重大的会议,您可以立即了解到这一天是星期三,而这一天您将赶到驻地办公室。

获得相对日期

d 选项还可以告诉您,相对于 当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。

例如,您需要了解两星期以后的日期。如果您处于 shell 提示符处,那么可以迅速地得到答案:

$ date -d ’2 weeks’

 

 

 

[c-sharp] 
  1. 关于使用该命令,还有其他一些重要的方法。使用 next/last指令,您可以得到以后的星期几是哪一天:  
  2. $ date -d 'next monday' (下周一的日期)  
  3. $ date -d next-day  %y%m%d(明天的日期)或者:date -d tomorrow  %y%m%d  
  4. $ date -d last-day  %y%m%d(昨天的日期) 或者:date -d yesterday  %y%m%d  
  5. $ date -d last-month  %y%m(上个月是几月)  
  6. $ date -d next-month  %y%m(下个月是几月)  
  7. 使用 ago 指令,您可以得到过去的日期:  
  8. $ date -d '30 days ago' (30天前的日期)  
  9. 您可以使用负数以得到相反的日期:  
  10. $ date -d 'dec 14 -2 weeks' (相对:dec 14这个日期的两周前的日期)  
  11. $ date -d '-100 days' (100天以前的日期)  
  12. $ date -d '50 days'(50天后的日期)  
 

 

 

 

这个技巧非常有用,它可以根据将来的日期为自己设置提醒,可能是在脚本或 shell 启动文件中,如下所示:

day=`date -d '2 weeks' "%b %d"`

if test "`echo $day`" = "aug 16"; then echo 'product launch is now two weeks away!'; fi 



xzc 2015-12-08 09:33
]]>
linux - awk命令之nf和$nf区别http://www.blogjava.net/xzclog/archive/2015/12/07/428541.htmlxzcxzcmon, 07 dec 2015 02:23:00 gmthttp://www.blogjava.net/xzclog/archive/2015/12/07/428541.htmlhttp://www.blogjava.net/xzclog/comments/428541.htmlhttp://www.blogjava.net/xzclog/archive/2015/12/07/428541.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428541.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428541.html
linux - awk命令之nf和$nf区别
 
linux - awk命令之nf和$nf区别  
 
nf和$nf 区别问答:
 
1.awk中$nf是什么意思?
#pwd
/usr/local/etc
~# echo $pwd | awk -f/ '{print $nf}'
etc
 
nf代表:浏览记录的域的个数
 
$nf代表 :最后一个field(列)
 
2.awk下面的变量nf和$nf有什么区别?
 
{print nf} 也有{print $nf}
前者是输出了域个数,后者是输出最后一个字段的内容
如:~# echo $pwd | awk -f/ '{print $nf}'


xzc 2015-12-07 10:23
]]>
bash shell脚本执行的几种方法http://www.blogjava.net/xzclog/archive/2015/12/02/428474.htmlxzcxzcwed, 02 dec 2015 02:33:00 gmthttp://www.blogjava.net/xzclog/archive/2015/12/02/428474.htmlhttp://www.blogjava.net/xzclog/comments/428474.htmlhttp://www.blogjava.net/xzclog/archive/2015/12/02/428474.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428474.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428474.html

bash shell 脚本执行的方法有多种,本文作一个总结,供大家学习参考。

    假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限。

方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本:
cd /data/shell
./hello.sh
./的意思是说在当前的工作目录下执行hello.sh。如果不加上./,bash可能会响应找到不到hello.sh的错误信息。因为目前的工作目录(/data/shell)可能不在执行程序默认的搜索路径之列,也就是说,不在环境变量pash的内容之中。查看path的内容可用 echo $pash 命令。现在的/data/shell就不在环境变量pash中的,所以必须加上./才可执行。

方法二:以绝对路径的方式去执行bash shell脚本:
/data/shell/hello.sh

方法三:直接使用bash 或sh 来执行bash shell脚本:
cd /data/shell

bash hello.sh

cd /data/shell

sh hello.sh
    注意,若是以方法三的方式来执行,那么,可以不必事先设定shell的执行权限,甚至都不用写shell文件中的第一行(指定bash路径)。因为方法三是将hello.sh作为参数传给sh(bash)命令来执行的。这时不是hello.sh自己来执行,而是被人家调用执行,所以不要执行权限。那么不用指定bash路径自然也好理解了啊,呵呵……。

方法四:在当前的shell环境中执行bash shell脚本:
cd /data/shell

. hello.sh

cd /data/shell

source hello.sh
    前三种方法执行shell脚本时都是在当前shell(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行。shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。而方法四则是在当前shell中执行的。

假设shell脚本文件为hello.sh
放在/root目录下。

下面介绍几种在终端执行shell脚本的方法:

复制代码代码如下:
[root@localhost home]# cd /root/
[root@localhost ~]#vim hello.sh
#!  /bin/bash
cd /tmp
echo "hello guys!"
echo "welcome to my blog:linuxboy.org!"

1.切换到shell脚本所在的目录,执行:

复制代码代码如下:
[root@localhost ~]# ./hello.sh
-bash: ./ hello.sh: 权限不够

2.以绝对路径的方式执行:

复制代码代码如下:
[root@localhost ~]# /root/desktop/hello.sh
-bash: /root/desktop/ hello.sh: 权限不够

3.直接用bash或sh执行:

复制代码代码如下:
[root@localhost ~]# bash hello.sh
hello guys!
welcome to my blog:linuxboy.org!
[root@localhost ~]# pwd
/root
 
[root@localhost ~]# sh hello.sh
hello guys!
welcome to my blog:linuxboy.org!
[root@localhost ~]# pwd
/root

   注意:用以上三种方法执行shell脚本,现行的shell会开启一个子shell环境,去执行shell脚本,前两种必须要有执行权限才能够执行。也可以让shell脚本在现行的shell中执行:

4.现行的shell中执行

复制代码代码如下:
[root@localhost ~]# . hello.sh
hello guys!
welcome to my blog:linuxboy.org!
[root@localhost tmp]# pwd
/tmp 
 
[root@localhost ~]# source hello.sh
hello guys!
welcome to my blog:linuxboy.org!
[root@localhost tmp]# pwd
/tmp

    对于第4种不会创建子进程,而是在父进程中直接执行。
    上面的差异是因为子进程不能改变父进程的执行环境,所以cd(内建命令,只有内建命令才可以改变shell 的执行环境)没有成功,但是第4种没有子进程,所以cd成功。



xzc 2015-12-02 10:33
]]>
awk中rs,ors,fs,ofs区别与联系http://www.blogjava.net/xzclog/archive/2015/11/26/428378.htmlxzcxzcthu, 26 nov 2015 15:35:00 gmthttp://www.blogjava.net/xzclog/archive/2015/11/26/428378.htmlhttp://www.blogjava.net/xzclog/comments/428378.htmlhttp://www.blogjava.net/xzclog/archive/2015/11/26/428378.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428378.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428378.html阅读全文

xzc 2015-11-26 23:35
]]>
perl 和 python 的比较 http://www.blogjava.net/xzclog/archive/2015/11/26/428377.htmlxzcxzcthu, 26 nov 2015 15:20:00 gmthttp://www.blogjava.net/xzclog/archive/2015/11/26/428377.htmlhttp://www.blogjava.net/xzclog/comments/428377.htmlhttp://www.blogjava.net/xzclog/archive/2015/11/26/428377.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428377.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428377.html阅读全文

xzc 2015-11-26 23:20
]]>
[原]perl和python的比较(主要是性能比较)http://www.blogjava.net/xzclog/archive/2015/11/26/428376.htmlxzcxzcthu, 26 nov 2015 15:15:00 gmthttp://www.blogjava.net/xzclog/archive/2015/11/26/428376.htmlhttp://www.blogjava.net/xzclog/comments/428376.htmlhttp://www.blogjava.net/xzclog/archive/2015/11/26/428376.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428376.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428376.htmlpython语法简单,而且通过缩进的方式来表现层次结构,代码非常简明易懂,对初学者来说,比较容易上手。

perl的模式匹配非常强大,同时匹配的符号有很多种,难以阅读和维护。

在文本处理方面,python通过加载re模块来实现模式匹配的查找和替换。而perl内置就有模式匹配功能。

note:内置命令和外部命令的区别。

通过代码来直接做比较。

python版:

#!/usr/bin/python
import re
import fileinput
exists_re = re.compile(r'^(.*?) info.*such a record already exists', re.i)
location_re = re.compile(r'^awblocation (.*?) insert into', re.i)
for line in fileinput.input():
    fn = fileinput.filename()
    currline = line.rstrip()
    mprev = exists_re.search(currline)
    if(mprev):
        xlogtime = mprev.group(1)
    mcurr = location_re.search(currline)
    if(mcurr):
        print fn, xlogtime, mcurr.group(1)

perl版:

#!/usr/bin/perl
while (<>) {
    chomp;
    if (m/^(.*?) info.*such a record already exists/i) {
        $xlogtime = $1;
    }
    if (m/^awblocation (.*?) insert into/i) {
        print "$argv $xlogtime $1\n";
    }
}

time process_file.py *log  > summarypy.log

real   0m8.185s

user  0m8.018s

sys    0m0.092s

time process_file.pl  *log > summaypl.log

real    0m1.481s

user   0m1.294s

sys     0m0.124s

所以在处理大文件如大日志方面,用perl更好,因为更快。

如果对速度要求不是很严格的话,用python更好,因为python简洁易懂,容易维护和阅读。

为什么在文本处理时,perl比python快很多呢?

这是因为perl的模式匹配是其内置功能,而python需要加载re模块,使用内置命令比外部命令要快很多。

linux命令有内置命令和外部命令之分,功能基本相同,但是调用有些细微差别。
内置命令实际上是shell程序的一部分,其中包含的是一些简单的linux系统命令,这些命令在shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。内部命令是设在bash源代码里面的,其执行速度比外部命令快,因为解析内部命令shell不需要创建子进程,比如exit,cd,pwd,echo,history等。
外部命令是linux系统中的实用应用程序,因为实用程序的功能通常比较强大,其包含的程序量也很大,在系统加载的时候并不随系统一起被加载到内存中,而是在需要的时候才将其调入内存。通常外部命令的实体并不包含在shell中,但是其命令执行过程是由shell程序控制的。shell程序管理外部命令执行的路径查找,加载存放,并控制命令的执行。外部命令是在bash之外额外安装的,通常放在/bin, /usr/bin, /sbin,  /usr/sbin,....等。

用type命令可以分辨内部命令与外部命令。




xzc 2015-11-26 23:15
]]>
iptables详解 http://www.blogjava.net/xzclog/archive/2015/11/24/428348.htmlxzcxzctue, 24 nov 2015 09:17:00 gmthttp://www.blogjava.net/xzclog/archive/2015/11/24/428348.htmlhttp://www.blogjava.net/xzclog/comments/428348.htmlhttp://www.blogjava.net/xzclog/archive/2015/11/24/428348.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428348.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428348.html
一:前言

防火墙,其实说白了讲,就是用于实现linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的ip、数据进行检测。

目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关

对于tcp/ip的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
 
二:iptables 的历史以及工作原理

1.iptables的发展:

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freebsd上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能

他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

    作者一共在内核空间中选择了5个位置,
    1.内核空间中:从一个网络接口进来,到另一个网络接口去的
    2.数据包从内核流入用户空间的
    3.数据包从用户空间流出的
    4.进入/离开本机的外网接口
    5.进入/离开本机的内网接口
        
2.iptables的工作机制

从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做nat和dnat的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。        

 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.prerouting (路由前)
2.input (数据包流入口)
3.forward (转发管卡)
4.output(数据包出口)
5.postrouting(路由后)
        这是netfilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。       

3.防火墙的策略

防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。

我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的
2.nat 定义地址转换的 
                3.mangle功能:修改报文原数据

我们修改报文原数据就是来修改ttl的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
 
小扩展:
对于filter来讲一般只能做在3个链上:input ,forward ,output
对于nat来讲一般也只能做在3个链上:prerouting ,output ,postrouting
而mangle则是5个链都可以做:prerouting,input,forward,output,postrouting
 
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。 
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
 
三.规则的写法:

 iptables定义规则的方式比较复杂:
 格式:iptables [-t table] command chain cretiria -j action
 -t table :3个filter nat mangle
 command:定义如何对规则进行管理
 chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
 cretiria:指定匹配标准
 -j action :指定如何进行处理

 比如:不允许172.16.0.0/24的进行访问。
 iptables -t filter -a input -s 172.16.0.0/16 -p udp --dport 53 -j drop
 当然你如果想拒绝的更彻底:
 iptables -t filter -r input 1 -s 172.16.0.0/16 -p udp --dport 53 -j reject

 iptables -l -n -v#查看定义规则的详细信息
 
四:详解command:

1.链管理命令(这都是立即生效的)
-p :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -p input (drop|accept)  默认是关的/默认是开的
比如:
iptables -p input drop 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括xshell连接之类的,远程连接都被拒绝了。
        -f: flash,清空规则链的(注意每个链的管理权限)
    iptables -t nat -f prerouting
    iptables -t nat -f 清空nat表的所有链
        -n:new 支持用户新建一个链
            iptables -n inbound_tcp_web 表示附在tcp表上用于检查web的。
        -x: 用于删除用户自定义的空链
            使用方法跟-n相同,但是在删除之前必须要将里面的链给清空昂了
        -e:用来rename chain主要是用来给用户自定义的链重命名
            -e oldname newname
         -z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -z :清空
 
2.规则管理命令
         -a:追加,在当前链的最后新增一个规则
         -i num : 插入,把当前规则插入为第几条。
            -i 3 :插入为第三条
         -r num:replays替换/修改第几条规则
            格式:iptables -r 3 …………
         -d num:删除,明确指定删除第几条规则
        
3.查看管理命令 “-l”
 附加子命令
 -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
 -v:显示详细信息
 -vv
 -vvv :越多越详细
 -x:在计数器上显示精确值,不做单位换算
 --line-numbers : 显示规则的行号
 -t nat:显示所有的关卡的信息
 
五:详解匹配标准

1.通用匹配:源地址目标地址的匹配
 -s:指定作为源地址匹配,这里不能指定主机名称,必须是ip
ip | ip/mask | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个ip之外
 -d:表示匹配目标地址
 -p:用于匹配协议的(这里的协议通常有3种,tcp/udp/icmp)
 -i eth0:从这块网卡流入的数据
流入一般用在input和prerouting上
 -o eth0:从这块网卡流出的数据
流出一般在output和postrouting上
        
2.扩展匹配
2.1隐含扩展:对协议的扩展
    -p tcp :tcp协议的扩展。一般有三种扩展
--dport xx-xx:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:tcp的标志位(syn,ack,fin,psh,rst,urg)
    对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn   =    --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的syn为1的包,还有一种简写方式,叫做--syn
    -p udp:udp协议的扩展
        --dport
        --sport
    -p icmp:icmp数据报文的扩展
        --icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
                  
2.2显式扩展(-m)
     扩展各种模块
      -m multiport:表示启用多端口扩展
      之后我们就可以启用比如 --dports 21,23,80
                  
        
六:详解-j action

 常用的action:
 drop:悄悄丢弃
一般我们多用drop来隐藏我们的身份,以及隐藏我们的链表
 reject:明示拒绝
 accept:接受
custom_chain:转向一个自定义的链
 dnat
 snat
 masquerade:源地址伪装
 redirect:重定向:主要用于实现端口重定向
 mark:打防火墙标记的
 return:返回
在自定义链执行完毕后使用返回,来返回原规则链。
 
练习题1:
     只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的sshd服务
     分析:首先肯定是在允许表中定义的。因为不需要做nat地址转换之类的,然后查看我们sshd服务,在22号端口上,处理机制是接受,对于这个表,需要有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在input链上,而output再予以定义就好。(会话的初始端先定义),所以加规则就是:
     定义进来的: iptables -t filter -a input -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j accept
     定义出去的: iptables -t filter -a output -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --dport 22 -j accept
     将默认策略改成drop:
  iptables -p input drop
  iptables -p output drop
  iptables -p forward drop
        
七:状态检测:

是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展
        什么是状态检测?对于整个tcp协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫new连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(established),还有一种状态,比较诡异的,比如:syn=1 ack=1 rst=1,对于这种我们无法识别的,我们都称之为invalid无法识别的。还有第四种,ftp这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为related。
所以我们的状态一共有四种:
        new
        established
        related
        invalid
 
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为new和established的进来,出去只允许established的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。
        
对于练习题的扩展:
进来的拒绝出去的允许,进来的只允许established进来,出去只允许established出去。默认规则都使用拒绝
iptables -l -n --line-number  :查看之前的规则位于第几行
    改写input
        iptables -r input 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state new,established -j accept
        iptables -r output 1 -m state --state established -j accept
 
    此时如果想再放行一个80端口如何放行呢?
        iptables -a input -d 172.16.100.1 -p tcp --dport 80 -m state --state new,established -j accept
 
        iptables -r input 1 -d 172.16.100.1 -p udp --dport 53 -j accept
 
练习题2:
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
 
在出去的端口上:iptables -a output -p icmp --icmp-type 8 -j accept
在进来的端口上:iptables -a input -p icmp --icmp-type 0 -j accept
 
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -a input -s 127.0.0.1 -d 127.0.0.1 -j accept
iptables -a output -s 127.0.0.1 -d 127.0.0.1 -j accept
 
八:snat和dnat的实现

由于我们现在ip地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点ip资源。那么通过iptables如何实现nat的地址转换呢?

1.snat基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的ip,我们就可以实现连接其他外网ip的功能
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的ip在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -a postrouting -s 192.168.10.0/24 -j snat --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个ip.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的ip,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 masquerade(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
         iptables -t nat -a postrouting -s 192.168.10.0/24 -j masquerade
         这里要注意:地址伪装并不适用于所有的地方。
 
2.dnat目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而凯发k8网页登录的服务却放在内网服务器的不同的服务器上

    如何做目标地址转换呢?:
iptables -t nat -a prerouting -d 192.168.10.18 -p tcp --dport 80 -j dnat --todestination 172.16.100.2
        目标地址转换要做在到达网卡之前进行转换,所以要做在prerouting这个位置上
 
九:控制规则的存放以及开启

注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
    2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
 
    3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效
 
 
十:总结
         iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。
附加iptables比较好的文章:


xzc 2015-11-24 17:17
]]>
linux下iptables配置详解http://www.blogjava.net/xzclog/archive/2015/11/24/428347.htmlxzcxzctue, 24 nov 2015 08:15:00 gmthttp://www.blogjava.net/xzclog/archive/2015/11/24/428347.htmlhttp://www.blogjava.net/xzclog/comments/428347.htmlhttp://www.blogjava.net/xzclog/archive/2015/11/24/428347.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/428347.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/428347.html
如果你的iptables基础知识还不了解,建议先去看看.
开始配置
我们来配置一个filter表的防火墙.
(1)查看本机关于iptables的设置情况
[root@tp ~]# iptables -l -n
chain input (policy accept)
target       prot opt source                 destination         
chain forward (policy accept)
target       prot opt source                 destination         
chain output (policy accept)
target       prot opt source                 destination         
chain rh-firewall-1-input (0 references)
target       prot opt source                 destination         
accept       all    --    0.0.0.0/0              0.0.0.0/0           
accept       icmp --    0.0.0.0/0              0.0.0.0/0             icmp type 255 
accept       esp    --    0.0.0.0/0              0.0.0.0/0           
accept       ah     --    0.0.0.0/0              0.0.0.0/0           
accept       udp    --    0.0.0.0/0              224.0.0.251           udp dpt:5353 
accept       udp    --    0.0.0.0/0              0.0.0.0/0             udp dpt:631 
accept       all    --    0.0.0.0/0              0.0.0.0/0             state related,established 
accept       tcp    --    0.0.0.0/0              0.0.0.0/0             state new tcp dpt:22 
accept       tcp    --    0.0.0.0/0              0.0.0.0/0             state new tcp dpt:80 
accept       tcp    --    0.0.0.0/0              0.0.0.0/0             state new tcp dpt:25 
reject       all    --    0.0.0.0/0              0.0.0.0/0             reject-with icmp-host-prohibited 
可以看出我在安装linux时,选择了有防火墙,并且开放了22,80,25端口.
如果你在安装linux时没有选择启动防火墙,是这样的
[root@tp ~]# iptables -l -n
chain input (policy accept)
target       prot opt source                 destination         
chain forward (policy accept)
target       prot opt source                 destination         
chain output (policy accept)
target       prot opt source                 destination  
什么规则都没有.
(2)清除原有规则.
不管你在安装linux时是否启动了防火墙,如果你想配置属于自己的防火墙,那就清除现在filter的所有规则.
[root@tp ~]# iptables -f        清除预设表filter中的所有规则链的规则
[root@tp ~]# iptables -x        清除预设表filter中使用者自定链中的规则
我们在来看一下
[root@tp ~]# iptables -l -n
chain input (policy accept)
target       prot opt source                 destination         
chain forward (policy accept)
target       prot opt source                 destination         
chain output (policy accept)
target       prot opt source                 destination      
什么都没有了吧,和我们在安装linux时没有启动防火墙是一样的.(提前说一句,这些配置就像用命令配置ip一样,重起就会失去作用),怎么保存.
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.
[root@tp ~]# service iptables restart
现在iptables配置表里什么配置都没有了,那我们开始我们的配置吧
(3)设定预设规则
[root@tp ~]# iptables -p input drop
[root@tp ~]# iptables -p output accept
[root@tp ~]# iptables -p forward drop
上面的意思是,当超出了iptables里filter表里的两个链规则(input,forward)时,不在这两个规则里的数据包怎么处理呢,那就是drop(放弃).应该说这样配置是很安全的.我们要控制流入数据包
而对于output链,也就是流出的包我们不用做太多限制,而是采取accept,也就是说,不在着个规则里的包怎么办呢,那就是通过.
可以看出input,forward两个链采用的是允许什么包通过,而output链采用的是不允许什么包通过.
这样设置还是挺合理的,当然你也可以三个链都drop,但这样做我认为是没有必要的,而且要写的规则就会增加.但如果你只想要有限的几个规则是,如只做web服务器.还是推荐三个链都是drop.
注:如果你是远程ssh登陆的话,当你输入第一个命令回车的时候就应该掉了.因为你没有设置任何规则.
怎么办,去本机操作呗!
(4)添加规则.
首先添加input链,input链的默认规则是drop,所以我们就写需要accetp(通过)的链
为了能采用远程ssh登陆,我们要开启22端口.
[root@tp ~]# iptables -a input -p tcp --dport 22 -j accept
[root@tp ~]# iptables -a output -p tcp --sport 22 -j accept (注:这个规则,如果你把output 设置成drop的就要写上这一部,好多人都是望了写这一部规则导致,始终无法ssh.在远程一下,是不是好了.
其他的端口也一样,如果开启了web服务器,output设置成drop的话,同样也要添加一条链:
[root@tp ~]# iptables -a output -p tcp --sport 80 -j accept ,其他同理.)
如果做了web服务器,开启80端口.
[root@tp ~]# iptables -a input -p tcp --dport 80 -j accept
如果做了邮件服务器,开启25,110端口.
[root@tp ~]# iptables -a input -p tcp --dport 110 -j accept
[root@tp ~]# iptables -a input -p tcp --dport 25 -j accept

如果做了ftp服务器,开启21端口
[root@tp ~]# iptables -a input -p tcp --dport 21 -j accept
[root@tp ~]# iptables -a input -p tcp --dport 20 -j accept
如果做了dns服务器,开启53端口
[root@tp ~]# iptables -a input -p tcp --dport 53 -j accept
如果你还做了其他的服务器,需要开启哪个端口,照写就行了.
上面主要写的都是input链,凡是不在上面的规则里的,都drop
允许icmp包通过,也就是允许ping,
[root@tp ~]# iptables -a output -p icmp -j accept (output设置成drop的话)
[root@tp ~]# iptables -a input -p icmp -j accept    (input设置成drop的话)
允许loopback!(不然会导致dns无法正常关闭等问题)
iptables -a input -i lo -p all -j accept (如果是input drop)
iptables -a output -o lo -p all -j accept(如果是output drop)
下面写output链,output链默认规则是accept,所以我们就写需要drop(放弃)的链.
减少不安全的端口连接
[root@tp ~]# iptables -a output -p tcp --sport 31337 -j drop
[root@tp ~]# iptables -a output -p tcp --dport 31337 -j drop
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会
还有其他端口也一样,像:31335、27444、27665、20034 netbus、9704、137-139(smb),2049(nfs)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.
当然出入更安全的考虑你也可以包output链设置成drop,那你添加的规则就多一些,就像上边添加
允许ssh登陆一样.照着写就行了.
下面写一下更加细致的规则,就是限制到某台机器
如:我们只允许192.168.0.3的机器进行ssh连接
[root@tp ~]# iptables -a input -s 192.168.0.3 -p tcp --dport 22 -j accept
如果要允许,或限制一段ip地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有ip.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-a input -p tcp -m tcp --dport 22 -j accept 因为它表示所有地址都可以登陆.
或采用命令方式:
[root@tp ~]# iptables -d input -p tcp --dport 22 -j accept
然后保存,我再说一边,反是采用命令的方式,只在当时生效,如果想要重起后也起作用,那就要保存.写入到/etc/sysconfig/iptables文件里.
[root@tp ~]# /etc/rc.d/init.d/iptables save
这样写 !192.168.0.3 表示除了192.168.0.3的ip地址
其他的规则连接也一样这么设置.
在下面就是forward链,forward链的默认规则是drop,所以我们就写需要accetp(通过)的链,对正在转发链的监控.
开启转发功能,(在做nat时,forward默认规则是drop时,必须做)
[root@tp ~]# iptables -a forward -i eth0 -o eth1 -m state --state related,established -j accept
[root@tp ~]# iptables -a forward -i eth1 -o eh0 -j accept
丢弃坏的tcp包
[root@tp ~]#iptables -a forward -p tcp ! --syn -m state --state new -j drop
处理ip碎片数量,防止攻击,允许每秒100个
[root@tp ~]#iptables -a forward -f -m limit --limit 100/s --limit-burst 100 -j accept
设置icmp包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -a forward -p icmp -m limit --limit 1/s --limit-burst 10 -j accept
我在前面只所以允许icmp包通过,就是因为我在这里有限制.
二,配置一个nat表放火墙
1,查看本机关于nat的设置情况
[root@tp rc.d]# iptables -t nat -l
chain prerouting (policy accept)
target       prot opt source                 destination         
chain postrouting (policy accept)
target       prot opt source                 destination         
snat         all    --    192.168.0.0/24         anywhere              to:211.101.46.235
chain output (policy accept)
target       prot opt source                 destination    
我的nat已经配置好了的(只是提供最简单的代理上网功能,还没有添加防火墙规则).关于怎么配置nat,参考我的另一篇文章
当然你如果还没有配置nat的话,你也不用清除规则,因为nat在默认情况下是什么都没有的
如果你想清除,命令是
[root@tp ~]# iptables -f -t nat
[root@tp ~]# iptables -x -t nat
[root@tp ~]# iptables -z -t nat
2,添加规则
添加基本的nat地址转换,(关于如何配置nat可以看我的另一篇文章),
添加规则,我们只添加drop链.因为默认链全是accept.
防止外网用内网ip欺骗
[root@tp sysconfig]# iptables -t nat -a prerouting -i eth0 -s 10.0.0.0/8 -j drop
[root@tp sysconfig]# iptables -t nat -a prerouting -i eth0 -s 172.16.0.0/12 -j drop
[root@tp sysconfig]# iptables -t nat -a prerouting -i eth0 -s 192.168.0.0/16 -j drop

如果我们想,比如阻止msn,qq,bt等的话,需要找到它们所用的端口或者ip,(个人认为没有太大必要)
例:
禁止与211.101.46.253的所有连接
[root@tp ~]# iptables -t nat -a prerouting    -d 211.101.46.253 -j drop
禁用ftp(21)端口
[root@tp ~]# iptables -t nat -a prerouting -p tcp --dport 21 -j drop
这样写范围太大了,我们可以更精确的定义.
[root@tp ~]# iptables -t nat -a prerouting    -p tcp --dport 21 -d 211.101.46.253 -j drop
这样只禁用211.101.46.253地址的ftp连接,其他连接还可以.如web(80端口)连接.
按照我写的,你只要找到qq,msn等其他软件的ip地址,和端口,以及基于什么协议,只要照着写就行了.
最后:
drop非法连接
[root@tp ~]# iptables -a input     -m state --state invalid -j drop
[root@tp ~]# iptables -a output    -m state --state invalid -j drop
[root@tp ~]# iptables-a forward -m state --state invalid -j drop

允许所有已经建立的和相关的连接
[root@tp ~]# iptables-a input -m state --state established,related -j accept
[root@tp ~]# iptables-a output -m state --state established,related -j accept

[root@tp ~]# /etc/rc.d/init.d/iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

[root@tp ~]# service iptables restart


别忘了保存,不行就写一部保存一次.你可以一边保存,一边做实验,看看是否达到你的要求,
上面的所有规则我都试过,没有问题.
写这篇文章,用了我将近1个月的时间.查找资料,自己做实验,希望对大家有所帮助.如有不全及不完善的地方还请提出.
因为本篇文章以配置为主.关于iptables的基础知识及指令命令说明等我会尽快传上,当然你可以去网上搜索一下,还是很多的.


xzc 2015-11-24 16:15
]]>
sed替换单引号http://www.blogjava.net/xzclog/archive/2015/10/29/427970.htmlxzcxzcthu, 29 oct 2015 11:52:00 gmthttp://www.blogjava.net/xzclog/archive/2015/10/29/427970.htmlhttp://www.blogjava.net/xzclog/comments/427970.htmlhttp://www.blogjava.net/xzclog/archive/2015/10/29/427970.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/427970.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/427970.html

 echo "cfoo'barxml" | sed "s/'/::/g" |  sed 's/::/\\:/g' |  sed "s/:/'/g"    替换单引号为 \'

 

------------------------

sed 替换单引号'

echo "mmm'sss" > test
cat test


把test内容中单引号替换成双引号
sed 's/'"'"/'"''/g' test  ==> sed 's/' " ' " / ' " ' '/g' test
解析下:
's/' => 要进行替换操作,后紧跟匹配字符
"'" => 用双引号包裹着单引号
/   =>分割符
'"'  => 用单引号包裹着双引号
'/g' =>分隔符,全局替换


当然还可以使用下面这两种方法替换:
sed s#\'#\"#g test   最外层使用#分隔,里面使用转义单引号,转义双引号
sed "s/'/\"/g" test    最外层使用双引号,里面使用单引号,转义双引号


echo "mmm'sss"  | sed 's/'"'"/'"''/g'
echo "mmm'sss"  | sed s#\'#\"#g
echo "mmm'sss"  | sed "s/'/\"/g"

 

awk '{print "sed '\''s/"$1"\\t/"$2"\\t/g'\'' ref_zv9_top_level.bed.chrom"}' ref_zv9_top_level.gff3_transid

sed 's/rna10004\t/xr_223343.1\t/g' ref_zv9_top_level.bed.chrom
sed 's/rna10000\t/xr_223342.1\t/g' ref_zv9_top_level.bed.chrom

 

sed 's/\]/\"/g'   替换]为“

sed 's/\[/\"/g'   替换[为“



xzc 2015-10-29 19:52
]]>
shell中${}的妙用http://www.blogjava.net/xzclog/archive/2015/10/29/427967.htmlxzcxzcthu, 29 oct 2015 08:18:00 gmthttp://www.blogjava.net/xzclog/archive/2015/10/29/427967.htmlhttp://www.blogjava.net/xzclog/comments/427967.htmlhttp://www.blogjava.net/xzclog/archive/2015/10/29/427967.html#feedback0http://www.blogjava.net/xzclog/comments/commentrss/427967.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/427967.html
shell中${}的妙用
 
1. 截断功能
${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:    拿掉最后一条/及其左边的字符串:my.file.txt
${file#*.}:       拿掉第一个.及其左边的字符串:file.txt
${file##*.}:    拿掉最后一个.及其左边的字符串:txt
${file%/*}:     拿掉最后条/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}: 拿掉第一条/及其右边的字符串:(空值)
${file%.*}:    拿掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}: 拿掉第一个.及其右边的字符串:/dir1/dir2/dir3/my
记忆的方法为:
[list]#是去掉左边, ##最后一个
      %是去掉右边, %%第一个
2. 字符串提取 
单一符号是最小匹配﹔两个符号是最大匹配。
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续 5 个字节:/dir2
3. 字符串替换
${file/dir/path}:将第一个 dir 提换为 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部 dir 提换为 path:/path1/path2/path3/my.file.txt
4. 针对不同的变量状态赋值(没设定、空值、非空值):
${file-my.file.txt}: 若$file没有设定,则使用my.file.txt作返回值。(空值及非空值时不作处理)
${file:-my.file.txt}:若$file没有设定或为空值,则使用my.file.txt作返回值。(非空值时不作处理)
${file my.file.txt}: 若$file设为空值或非空值,均使用my.file.txt作返回值。(没设定时不作处理)
${file: my.file.txt}:若$file为非空值,则使用my.file.txt作返回值。(没设定及空值时不作处理)
${file=my.file.txt}: 若$file没设定,则使用my.file.txt作返回值,同时将$file 赋值为 my.file.txt。(空值及非空值时不作处理)
${file:=my.file.txt}:若$file没设定或为空值,则使用my.file.txt作返回值,同时将 $file 赋值为 my.file.txt。(非空值时不作处理)
${file?my.file.txt}: 若$file没设定,则将my.file.txt输出至 stderr。(空值及非空值时不作处理)
${file:?my.file.txt}:若$file没设定或为空值,则将my.file.txt输出至stderr。(非空值时不作处理)
注意: 
": "的情况是不包含空值的.
":-", ":="等只要有号就是包含空值(null).
5. 变量的长度
${#file}
6. 数组运算
a=(a b c def)
${a[@]} 或 ${a[*]} 可得到 a b c def (全部组数)
${a[0]} 可得到 a (第一个组数),${a[1]} 则为第二个组数...
${#a[@]} 或 ${#a[*]} 可得到 4 (全部组数数量)
${#a[0]} 可得到 1 (即第一个组数(a)的长度),${#a[3]} 可得到 3 (第四个组数(def)的长度)


xzc 2015-10-29 16:18
]]>
linux find命令忽略目录的查找方法http://www.blogjava.net/xzclog/archive/2015/10/28/427938.htmlxzcxzcwed, 28 oct 2015 03:33:00 gmthttp://www.blogjava.net/xzclog/archive/2015/10/28/427938.htmlhttp://www.blogjava.net/xzclog/comments/427938.htmlhttp://www.blogjava.net/xzclog/archive/2015/10/28/427938.html#feedback1http://www.blogjava.net/xzclog/comments/commentrss/427938.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/427938.html

在linux操作系统中,find命令非常强大,在文件与目录的查找方面可谓无所不至其极,如果能结合xargs命令使得,更是强大无比。

以下来看看find命令忽略目录查找的用法吧。

例1,根据文件属性查找:


复制代码
代码如下:

find . -type f -name "*config*" ! -path "./tmp/*" ! -path "./scripts/*" ! -path "./node_modules/*" 
explanation:
find . - start find from current working directory (recursively by default) 
-type f - specify to find that you only want files in the results 
-name "*_peaks.bed" - look for files with the name ending in _peaks.bed 
! -path "./tmp/*" - exclude all results whose path starts with ./tmp/ 
! -path "./scripts/*" - also exclude all results whose path starts with ./scripts/

例2,根据文件内容查找:


复制代码
代码如下:

grep -n -r --exclude-dir='node_modules' --exclude-dir='logs' --exclude="nohup.out" 192 *




使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用 -prune 参数来进行过滤。
不过必须注意:要忽略的路径参数要紧跟着搜索的路径之后,否则该参数无法起作用。

例如:指定搜索/home/zth目录下的所有文件,但是会忽略/home/zth/astetc的路径:


复制代码
代码如下:

find /home/zth -path "/home/zth/astetc" -prune -o -type f -print

按照文件名来搜索则为:


复制代码
代码如下:

find /home/zth -path "/home/zth/astetc" -prune -o -type f -name "cdr_*.conf" -print

要忽略两个以上的路径如何处理?


复制代码
代码如下:

find /home/zth /( -path "/home/zth/astetc" -o -path "/home/zth/etc" /) -prune -o -type f -print
find /home/zth /( -path "/home/zth/astetc" -o -path "/home/zth/etc" /) -prune -o -type f -name "cdr_*.conf" -print

注意:/( 和/) 前后都有空格。

查找某个文件包含内容,以下语句可以解决目录带空格的问题:


复制代码
代码如下:

find ./ -name "mysql*" -print0 |xargs -0 grep "select lead_id from vicidial_list where vendor_lead_code"

如果目录不带空格,可以这样:
 

复制代码
代码如下:

find ./ -name "mysql*" |xargs grep "select lead_id from vicidial_list where vendor_lead_code"

通过以上的例子,大家应该可以掌握find命令查找文件时,忽略相关目录的方法了。



xzc 2015-10-28 11:33
]]>
curl常用命令http://www.blogjava.net/xzclog/archive/2015/09/23/427449.htmlxzcxzcwed, 23 sep 2015 08:55:00 gmthttp://www.blogjava.net/xzclog/archive/2015/09/23/427449.htmlhttp://www.blogjava.net/xzclog/comments/427449.htmlhttp://www.blogjava.net/xzclog/archive/2015/09/23/427449.html#feedback2http://www.blogjava.net/xzclog/comments/commentrss/427449.htmlhttp://www.blogjava.net/xzclog/services/trackbacks/427449.html

原文地址: 


下载单个文件,默认将输出打印到标准输出中(stdout)中

curl http://www.centos.org

通过-o/-o选项保存下载的文件到指定的文件中:
-o:将文件保存为命令行中指定的文件名的文件中
-o:使用url中默认的文件名保存文件到本地

1 # 将文件下载到本地并命名为mygettext.html
2 curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
3 
4 # 将文件保存到本地并命名为gettext.html
5 curl -o http://www.gnu.org/software/gettext/manual/gettext.html

同样可以使用转向字符">"对输出进行转向输出

同时获取多个文件

1 curl -o url1 -o url2

若同时从同一站点下载多个文件时,curl会尝试重用链接(connection)。

通过-l选项进行重定向
默认情况下curl不会发送http location headers(重定向).当一个被请求页面移动到另一个站点时,会发送一个http loaction header作为请求,然后将请求重定向到新的地址上。
例如:访问google.com时,会自动将地址重定向到google.com.hk上。

 1 curl http://www.google.com
 2 
 3 
 4     "content-type" content="text/html;charset=utf-8">
 5     <span style="font-size: 12px !important; line-height: 1.5 !important; color: #800080; ">302</span> moved
 6 
 7 
 8     
 9     the document has moved
10     .
11 
12 

上述输出说明所请求的档案被转移到了http://www.google.com.hk。

这是可以通过使用-l选项进行强制重定向

1 # 让curl使用地址重定向,此时会查询google.com.hk站点
2 curl -l http://www.google.com

断点续传

通过使用-c选项可对大文件使用断点续传功能,如:

1 # 当文件在下载完成之前结束该进程
2 $ curl -o http://www.gnu.org/software/gettext/manual/gettext.html
3 ##############             20.1%
4 
5 # 通过添加-c选项继续对该文件进行下载,已经下载过的文件不会被重新下载
6 curl -c - -o http://www.gnu.org/software/gettext/manual/gettext.html
7 ###############            21.1%

对curl使用网络限速
通过--limit-rate选项对curl的最大网络使用进行限制

1 # 下载速度最大不会超过1000b/second
2 
3 curl --limit-rate 1000b -o http://www.gnu.org/software/gettext/manual/gettext.html

下载指定时间内修改过的文件

当下载一个文件时,可对该文件的最后修改日期进行判断,如果该文件在指定日期内修改过,就进行下载,否则不下载。
该功能可通过使用-z选项来实现:

1 # 若yy.html文件在2011/12/21之后有过更新才会进行下载
2 curl -z 21-dec-11 http://www.example.com/yy.html

curl授权

在访问需要授权的页面时,可通过-u选项提供用户名和密码进行授权

1 curl -u username:password url
2 
3 # 通常的做法是在命令行只输入用户名,之后会提示输入密码,这样可以保证在查看历史记录时不会将密码泄露
4 curl -u username url

从ftp服务器下载文件

curl同样支持ftp下载,若在url中指定的是某个文件路径而非具体的某个要下载的文件名,curl则会列出该目录下的所有文件名而并非下载该目录下的所有文件

1 # 列出public_html下的所有文件夹和文件
2 curl -u ftpuser:ftppass -o ftp://ftp_server/public_html/
3 
4 # 下载xss.php文件
5 curl -u ftpuser:ftppass -o ftp://ftp_server/public_html/xss.php

上传文件到ftp服务器

通过 -t 选项可将指定的本地文件上传到ftp服务器上

# 将myfile.txt文件上传到服务器
curl -u ftpuser:ftppass -t myfile.txt ftp://ftp.testserver.com

# 同时上传多个文件
curl -u ftpuser:ftppass -t "{file1,file2}" ftp://ftp.testserver.com

# 从标准输入获取内容保存到服务器指定的文件中
curl -u ftpuser:ftppass -t - ftp://ftp.testserver.com/myfile_1.txt

获取更多信息

通过使用 -v 和 -trace获取更多的链接信息

通过字典查询单词

1 # 查询bash单词的含义
2 curl dict://dict.org/d:bash
3 
4 # 列出所有可用词典
5 curl dict://dict.org/show:db
6 
7 # 在foldoc词典中查询bash单词的含义
8 curl dict://dict.org/d:bash:foldoc

为curl设置代理

-x 选项可以为curl添加代理功能

1 # 指定代理主机和端口
2 curl -x proxysever.test.com:3128 http://google.co.in

 

其他网站整理

保存与使用网站cookie信息

1 # 将网站的cookies信息保存到sugarcookies文件中
2 curl -d sugarcookies http://localhost/sugarcrm/index.php
3 
4 # 使用上次保存的cookie信息
5 curl -b sugarcookies http://localhost/sugarcrm/index.php

传递请求数据

默认curl使用get方式请求数据,这种方式下直接通过url传递数据
可以通过 --data/-d 方式指定使用post方式传递数据

1 # get
2 curl -u username https://api.github.com/user?access_token=xxxxxxxxxx
3 
4 # post
5 curl -u username --data "param1=value1¶m2=value" https://api.github.com
6 
7 # 也可以指定一个文件,将该文件中的内容当作数据传递给服务器端
8 curl --data @filename https://github.api.com/authorizations

注:默认情况下,通过post方式传递过去的数据中若有特殊字符,首先需要将特殊字符转义在传递给服务器端,如value值中包含有空格,则需要先将空格转换成 ,如:

1 curl -d "value 1" http://hostname.com

在新版本的curl中,提供了新的选项 --data-urlencode,通过该选项提供的参数会自动转义特殊字符。

1 curl --data-urlencode "value 1" http://hostname.com

除了使用get和post协议外,还可以通过 -x 选项指定其它协议,如:

1 curl -i -x delete https://api.github.cim

上传文件

1 curl --form "fileupload=@filename.txt" http://hostname/resource

 



xzc 2015-09-23 16:55
]]>
网站地图