November 2024

centos kickstart

  • Published in CentOS 6
  • July 22, 2013
cd /root/iso/centos
mkisofs -o CentOS_6_x86_64_Kickstart.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -R -J -v -T .
-------------------------------------------------------------------
Kickstart option to avoid "Storage Device Warning"
When I added zerombr to my kickstarts that issue went away.
I think that should do it b/c the devices will then have a structure that anaconda won't flake out on.
-------------------------------------------------------------------
PyCURL couldn't resolve "cdrom:sr0" during CentOS 6.2 kickstart installation
I have solved this issue myself, the solution is changing the repo line from
repo --name="CentOS"  --baseurl=cdrom:sr0 --cost=100
to
repo --name="CentOS"  --baseurl=file:///mnt/source --cost=100
-------------------------------------------------------------------
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
cdrom
lang en_US.UTF-8
keyboard fr
network --onboot yes --device eth0 --bootproto static --noipv6
rootpw  --iscrypted $6$NJrmWL64ZRdd1QFJ$I2hxrufs.2FI9.CVGB35R0fSQAFtJp4lakIKCoTvvmjVIBmDN/tOaBOwzptldn8HBXUMv8NmytpM6WeeonwSU.
firewall --service=ssh
authconfig --enableshadow --passalgo=sha512
selinux --enforcing
timezone --utc Europe/Paris
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
zerombr
clearpart --all --drives=sda
part /boot --fstype=ext4 --size=500
part pv.008002 --grow --size=1
volgroup VolGroup --pesize=4096 pv.008002
logvol / --fstype=ext4 --name=lv_root --vgname=VolGroup --size=97896
logvol swap --name=lv_swap --vgname=VolGroup --size=4000
repo --name="CentOS"  --baseurl=file:///mnt/source --cost=100
reboot --eject
%post --nochroot
cp /mnt/source/6netconfig.sh /mnt/sysimage/root >> /tmp/ins.log 2>&1
chmod +x /mnt/sysimage/root/6netconfig.sh
%packages --nobase
@core
%end
-----------------------------------------------------------------
Read more...

php中字符串的详细介绍

  • Published in PHP
  • July 21, 2013

1.字符串的定义
2.字符串变量的声明
3.转义字符
4.双引号和单引号的区别
5.heredoc的写法
6.nowdoc的写法
7.字符串长度函数          
8.查找字符位置函数
9.字符串替换函数,大小写转换,指定字符分隔,字符串的函数的比较(如strcmp()
html中的字符转实体(反之),字符串截取,数字字符串加分隔符
10.提取子字符串函数
11.分割,连接,反转函数
12.去除,增加空格函数
13.html代码/数据库安全处理有关函数
14.比较字符函数
15.字符大小转换函数         
16.字符串截取函数

             

1.字符串的定义
字符串在讲变量时候已经讲了,怎么又要讲?
答:之前,只是字符串这种变量类型
但对于其定义,性质,函数等等,没有深入的说
第2:字符串,在php中,是非常重要的一个概念

可以这么说:你在开发网站中想对字符串做某种操作
基本上你想到的字符串的处理功能,系统都已有相关函数了.

因为php自诞生之初,就是为web开发而来的.
因为网站开发中,字符串处理,是php的一大亮点

php中,1是字符串,2是数组函数,都非常多,非常好用.

什么是字符串?
答:字符串,就是一串字符
羊肉串就是一串羊肉                                                              返回目录   

2. 字符串的声明方式

 
  1 1.如何声明一个字符串变量
  2 答:
  3 双引号
  4 单引号
  5 定界符
  6 
  7 
  8 */
  9 
 10 $str1 = "hello";
 11 echo $str1;
 12 
 13 $str2 = "hello,"jack" ";//这个字符串是一个新闻标题,标题里很容易又出现双引号
 14 
 15 /*
//转义字符
16 思考: 17 用双引号,来声明字符串的时候内部不能再出现双引号 18 因为,双引号被当成了字符串的边界来对待,因此,内部出现 19 双引号,就引起了解释上的歧义.这时,可以用转字符. 20 即,用 \" 转义来表示 21 22 还有没有其他的转义字符呢? 23 想: \" 被用来当成 " 理解了 24 那么要是确实想表示,反斜\,又怎么办呢? 25 答:\\,表示反斜线\ 26 27 \' 单引号 28 \\反斜线 29 \"双引号 30 \n换行 31 \r回车 32 \t水平方向的tab 33 \v竖直方向的 34 \f换页 35 \$美金dollar标记 36 37 38 39 */ 40 41 $str2 = "hello ,\"jack\" "; 42 echo $str2; 43 44 $str3 = "hello \\ "; 45 echo $str3; 46 47 $str4 = "hello\n\rworld"; 48 echo $str4; 49 50 $str5 = "hello $str3"; 51 echo $str5; //hello hello \,即把$str3当变量解析出来了. 52 echo '<br />'; 53 $str6 = "hello \$str3";//此处 \$被转成了普通字符串$,而不再理解为变量标志   返回目录 54 echo $str6; 55 //再看单引号码 56 57 58 $str1 = 'hello<br />'; 59 echo $str1; 60 61 $str2 = 'hello \'jack\' ';//某字符串是新闻标题,标题又出现 62 //=--------------------------------------------------- 63 //单引号 64 //echo $str2; 65 // 66 ////单引号里又出现了单引号,又该怎么办呢? 67 ////答:被用来做字符串的边界了. 68 ////因此只能转义了来表示了. 69 //// \被用来转义单引号用了,那么如果我确实想表示\怎么办呢? 70 // 71 //// \\ 来表示 \ 72 // 73 // 74 $str3 ='hello \\'; 75 echo $str3; 76 77 78 /* 79 双引号和单引号的区别? 80 81 1.单双引号字符串有何区别? 82 83 //1.单引号,系统不做复杂的转义 84 //2.只转义 \' , \\ ,其他的一律原样输出. 85 //3.双引号,则转义的比较多, \n \r \t, \f \$ \\ \v 86 //4.对于变量解析的的区别: 87 //5.单引号,不对字符串$作变量名解析,而双引号要. 88 89 //---------------------------------------------------- 90 91 2. 单双引号哪个速度快些? 92 答:单引号定义的更快,因为不需要进行过多的转义和变量解析. 93 94 问:什么时间选用单/双引号呢? 95 96 答:大段文本,比如新闻标题,文本内容,自我介绍等这样大段话. 97 用'',解析快.. 98 99 但有时候,确实需要在一段字符串夹杂变量. 100 101 102 103 104 */ 105 $id = 5; 106 $sql = "select * from user id = 5"; 107 //如果此时用单引,则语句成为了 ..id = $id,sql就出错了. 108 //此时,用双引号合适 ,解析$id 语句解析 ..id = 5; 109 110 111 $age = 3; 112 $str1 = 'hello \n\r \t $age '; 113 $str2 = "hello \n\r \t $age"; 114 115 116 echo $str1,'<br />';117 echo $str2,'<br />';   返回目录 118 119 //heredoc的用法 120 //当需要写一大段文本,里面又有单引号,又有双引号,导致转义的时候,都比较麻烦,还可以用heredoc,nowdoc 两种界定字符串的方式 121 $age =23; 122 $str = <<< title 123 //我来写一行 124 //再来写第2行," '\, 125 //sdfsa, asdf \t \n 126 //hahah 127 $age 128 title; 129 echo $str; 130 131 /*** 132 heredoc的写法 133 <<< 标志符 134 中间写大段文本 135 1.标志符的名称和变量名求一样. 136 2.heredoc 的结束符,一定是独占一行,而且前面没有任何其他字符 137 138 3. heredoc对文本的处理和双引号一样,即 \r \n \t变量等都能解析出来. 139 140 4.heredoc 写大段文本挺方便,但是对内部的字符解析和双引号一样. 如果我不想这样,有没有类似heredoc写大段文本,有没有 141 这样的用法呢? 142 143 答:有 144 145 到了5.3.0之后,又新增了nowdoc方式,能达到如上效果 146 147 148 ***/ 149 echo '<hr />'; 150 151 $age =23; 152 $str = <<< 'title' 153 // 154 //我来写一行 155 //再来写第2行," '\, 156 sdfsa, asdf \t \n 157 hahah 158 $age 159 title; 160 echo $str; 161 /****** 162 nowdoc写法和heredoc写法和heredo一样,唯独在标识符两边用 163 单引号包起来,这样,在段文本的解析,就和单引号一样的效果. 164 不转义 \t \n \r 变量等 165 //====================================================   返回目录  
 

7. 字符串长度函数    

 
 1 //====================================================
 2 
 3 //字符串长度函数---------strlen()
 4 $str = 'hello';
 5 $str2 ='中国';
 6 echo 'hello有',strlen($str),'个字节';
 7 echo '<br />';
 8 echo '中国有',strlen($str2),'个字节';
 9 
10 
11 //为什么"中国"是6个字节呢?
12 //我们的.php文件,是utf-8编码
13 //
14 //中文在utf-8编码规则中,一个中文占3个字节.
15 //因此,'中国'占6个字节.而英文为Ascii码1个英文占1个字节。
16 //
17 //在ANSI中,即GBK 中一个中文占2个字节。
18 //
19 //
20 //
21 //要知道,编码都是有规律的,
22 //utf-8有utf-8的规律,你告诉mb_strlen,用utf8规则来判断字符串
23 //
24 //判断出是4个字符
25 //
26 //总结:
27 //strlen 是计算字符串“字节”长度
28 //而mb_strlen 是计算出字符串的”字符“个数
29 
30 $str = '中华民国';
31 echo '字节长度是',strlen($str),'<br />';//中文在utf-8编码规则中,一个中文占3个字节
32 echo '字符长度是',mb_strlen($str,'utf-8'),'<br />';                            返回目录  
 

8. 查找字符串位置函数--------------strpos()

strpos($str,search,[int]):查找search在$str 中的第一次位置从int开始;
stripos($str,search,[int]):函数返回字符串在另一个字符串中第一次出现的位置。该函数对大小写不敏感
strrpos($str,search,[int]):查找search在$str中的最后一次出现的位置从int
 
  1 //查找字符串位置函数--------------strpos()
  2 
  3 //查找字符串中子字符串的位置
  4 $str = 'how are you! fine thank fine you ,may be you are right,256, I dont think so let me see I can not fine';
  5 //
  6 //经理说:你能否找找,这段字符串里,有没有“fine”
  7 
  8 //int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
  9 //其中mixed 是一种混合类型
 10 
 11 //第三个参数的讨论offset
 12 //第三个可选参数,offset的作用,就体现出来了
 13 
 14 //offset的意思是---偏移量  就是把光标先偏移一段距离,再
 15 
 16 
 17 //
 18 echo strpos($str,'fine',18);  //13,经过了13字节后,找到了fine 
 19 var_dump(strpos($str,256)); //没找到,false
 20 echo '<br />';
 21 var_dump(strpos($str,97));//97找到了,返回值是4
 22 /////**
 23 //在计算机里,ascii字符集中
 24 //65 ---->  90  A-Z
 25 //97 ---->  122 a_z
 26 //
 27 //当你第2个参数,写的是整型时,则把理解为是acsii字符的编码
 28 //
 29 //所以 int 97 ===‘a’
 30 //
 31 //不熟悉ascii的,百度‘ascii’码表
 32 //
 33 
 34 
 35 //1.写一个函数,判断指定的父串中有没有子串
 36 
 37 
 38 function findsub($str,$find){
 39 
 40 $str=strpos($str,$find);
 41 if($str){
 42     echo '父串中有子串';
 43 }else{
 44     echo '父串中没有子串';
 45 }
 46 }
 47 $str1 =  'how are you! fine thank fine you ,may be you are right,256, I dont think so let me see I can not fine';
 48 $str2 = 'how';
 49 findsub($str1,$str2);
 50 
 51 
 52 //上面这个判断出问题了
 53 //因为strpos 返回了0,而0用if判断时,当成false处理
 54 //
 55 //这里要用到===这个判定符。
 56 
 57 function findsub1($str,$find){
 58 
 59 $str=strpos($str,$find);
 60 if($str === false){
 61     echo '父串中没有子串';
 62 }else{
 63     echo '父串中有子串';
 64 }
 65 }
 66 $str1 =  'how are you! fine thank fine you ,may be you are right,256, I dont think so let me see I can not fine';
 67 $str2 = 'how';
 68 findsub1($str1,$str2);
 69 
 70 //用for循环或者while 循环计算父串中,子串中出现的次数?
 71 
 72 //函数名:subnum
 73 //参数:string $str待查父串,
 74 //string $sub 子串
 75 //
 76 //return int 即子串的个数
 77 //
 78 //思路:
 79 //先从头查找子串,找到后,则偏移过去子串,继续查找,直到查不到
 80 
 81 
 82 //
 83 function subnum($str,$sub){
 84     $sublen = strlen($sub);
 85     $strlen = strlen($str);
 86 
 87     if($sublen > $strlen){
 88         return 0;
 89         //如果子串比父串长,没必要找了
 90     }
 91 
 92     for($offset=0,$num=0;($offset=strpos($str,$sub,$offset))!==false;){
 93         $num+=1;
 94         $offset+=$sublen;
 95     }
 96     return $num;
 97 }
 98 
 99 $x =  'how are you! fine thank fine you ,may be you fine are right,256, I dont think so let me see I can not fine';
100 
101 $y = 'fine';
102 
103 //echo '在父串中找到了',subnum($x,$y),'个子串fine';
104 //
105 //
106 //echo '我也找到',substr_count($x,$y),'个fine';
107 
108 //这里为什么让大家重视字符串,php的字符串太强大了
109 //你要是不了解,可能会多花很多时间到来php中已经存在的函数。
110 
111 //
112 //$x =  'how are you! fine thank fine you ,may be you fine are right,256, I dont think so let me see I can not fine';
113 //
114 //$y = 'fine';
115 //
116 //var_dump(stripos($x,$y));  //返回字符串在另一字符串中第一次出现的位置,该函数不区分大小写。
117 //var_dump(strrpos($x,$y,0)); //返回$y字符串在$x符串中最后一次出现的位置,该函数区分大小写,从位置0开始,
118 ////注意位置的下标是从0开始的。
119 //----------------------------------------------------              返回目录  
 

9.字符串替换函数,大小写转换,指定字符分隔     
html中的字符转实体(反之),字符串截取,数字字符串加分隔,字符串的函数的比较(如strcmp()

str_replace(search,replace,$str):从$str中查找 search用replace来替换
str_irreplace(search,replace,$str):
strtr($str,search,replace):这个函数中replace不能为"";
substr_replace($Str,$rep,$start[,length])$str原始字符串,$rep替换后的新
字符串,$start起始位置,$length替换的长度,该项可选
 
  1 //3.字符串替换函数--------------str_replace()
  2 
  3 //mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
  4 //str_replace 字符串替换函数
  5 //str:string 字符串
  6 //replace: 替换
  7 //准备,把hi换成hello
  8 //$count表示替换的次数。
  9 $str = 'hi,this is lily history';
 10 
 11 $newstr = str_replace('hi','hello',$str,$num);
 12 echo $str,'<br />',$newstr;
 13 echo '<br />';
 14 //
 15 ////能不能帮我统计一下替换的次数.
 16 //echo '总共替换了',$num,'次';
 17 
 18 //再次要求,把hi换成hello,把li换成ul
 19 //可以用数组,指定多种替换
 20 $search = array('hi','li');
 21 $replace = array('hello','ul');
 22 
 23 $newstr = str_replace($search,$replace,$str);
 24 echo '新替换的后为:',$newstr,'<br />';
 25 ////
 26 //hi单词--->hello单词
 27 //
 28 //但this单词中的一部都被替换了,不想被替换,该怎么办?
 29 //
 30 //能不能,是单词的一部就是替换?
 31 //
 32 //答:用正则表达式,现在还做不到.
 33 //
 34 //突发奇想:
 35 //hi-->hello
 36 //hello ---> hi
 37 
 38 
 39 $str = 'hi lily, hello jim';
 40 
 41 $newstr = str_replace(array('hi','hello'),array('hello','hi'),$str);
 42 echo $newstr;//我们想要的是 hello lily ,hi jim ,但是实际为:hi lily, hi jim
 43 
 44 
 45 
 46 //分析:
 47 //string strtr ( string $str , string $from , string $to )
 48 //该函数返回 str 的一个副本,并将在 from 中指定的字符转换为 to 中相应的字符。 
 49 //
 50 //碰到这种情况,有没有更好的函数来代替呢?
 51 //答:用strtr以单个字符对应来替换的.比如:
 52 //strstr($str,'hi','ab')  则执行 h被i替换
 53 //然后 i 被替换成b 
 54 //
 55 //还可以换一种写法:
 56 
 57 $str = '你好,。12345';
 58 strtr($str,array('1'=>'1',2=>'2'));----------------- strtr()
 59 
 60 $str = '你好,。12345';
 61 echo strtr($str,array('1'=>'1',2=>'2'));
 62 
 63 //全半角转换,用strt非常方便
 64 //ecshop里面就用到。
 65 //在 includes --->  lib_base.php---744行里面
 66 //
 67 //  strtr---->别名strchr
 68 //----------------------------------------------------
 69 
 70 //截取子字符串 ------substr()--------strstr()-------strrchr()
 71 //-------explode()------implode()------chunk_split()-----htmlspecialchars
 72 //-------htmlspecialchars_decode()------strtolower($str)----strtoupper($str)
 73 //substr
 74 
 75 //string substr ( string $string , int $start [, int $length ] )
 76 //$string:待截取的长字符串
 77 //$start:截取开始的位置
 78 //$length:正数时代表截取的长度。负数时,代表截取结束的位置
 79 //
 80 $str ='abcdeff';
 81 echo substr($str,3),'<br />';
 82 
 83 //1.当第3个参数不指定时,截取到字符串的‘结尾’
 84 //
 85 //经理说:把字符串末尾的3个字符串截取出来。
 86 //
 87 echo substr($str,-3);//办法2:第2个参数为负数,表示从右开始截取
 88 echo substr($str,(strlen($str)-3));  办法1:总长度减去3,也能截取到结尾的三个字符.
 89 //
 90 //2. 除了前3个和结尾3个外,截取中间的部分字符串.
 91 //
 92 //分析:start应该是3
 93 //
 94 //length,如果代表长度,多长呢?不一定,因为字符串长度不好算
 95 //
 96 //这时,可以把length写成负数
 97 
 98 //----------------------------------------------------
 99 //如果用substr来截中文呢?
100 
101 //substr是按字节来操作的,不考虑什么编码
102 $str = '中国民国'; //我的文件utf-8,
103 echo substr($str,0,3);----------------------------substr()
104 
105 //----------------------------------------------------
106 //如果用substr来截中英混合呢?
107 
108 $str = 'lily你的代码report给我,中午我们有个meeting ,一会儿带你吃KFG';
109 echo substr($str,0,6),'ab';//按字节截,'lily你'是7个字节才完成'你'的3个字节,被截了2个,出了问题
110 //----------------------------------------------------
111 //strstr($str,$needle);
112 
113 //作用:是在$str中找到指定的$needle,而且是$needle第一次出现的位置,返回该位置直到字符串结尾的这一部分
114 
115 //能否把第一次找到的$needle的位置之前的字符串截取出来呢?
116 //答: 能,从php5.3.0版本开始,strstr函数多了第3个可选参数
117 
118 $str = 'asdf.def.jpg.exe';
119 echo strstr($str,'.'),'<br />'; // .def.jpg.exe
120 echo strstr($str,'.',true); ---------------------strstr()
121 
122 //能否先把$needle最后一次出现的位置找出来
123 //从该位置,一直截到结尾
124 
125 echo strrchr($str,'.'),'<br />';
126 
127 //面试时,让你计算一个文件的后缀?
128 $file = 'new.txt';
129 echo strrchr($str,);----------------------strrchr()
130 
131 //php中,字符串函数和数组最多
132 //字符串和数组,有2个函数,是他们的桥梁,非常频繁的使用.
133 //
134 //就是implode ,explode
135 //
136 //有的网站,写文章,让我们填写标签,"多个标签用逗号隔开"
137 //
138 //$str = 'abc,中国,美国,日本';
139 //
140 ////explode 是根据指定的分割符,把字符串拆成数组
141 $arr = explode(',',$str); --------------------------explode()
142 print_r($arr);
143 
144 而implode是根据指定的连接符,把组再拼接成字符串
145 $arr = implode('~',$arr);
146 var_dump($arr);
147 
148 //你可以中只传一个数组,不指定连接符
149 //这样,将把数组单元组合在一起中间没有连接符.
150 //
151 $arr = implode($arr);-----------------implode()
152 var_dump($arr);
153 
154 $str = '12345678';
155 echo chunk_split($str,3,',');  //每隔三个字符加一个逗号.------------chunk_split();
156 
157 //如果不加逗号,则默认为换行.
158 echo '<hr />';
159 echo chunk_split($str,3);
160 ====================================================
161 字符转义函数,非常重要.
162 
163 $str = "abc ', hello";
164 echo $str,'<br />';
165 $str = addslashes($str); //单引号被转义成都市\'--------------addslashes()
166 echo $str;
167 
168 //现在我们还没有学习mysql,你还意识不到一个单引
169 //号的破坏作用.但要知道,单双引号如果不小心,数据库
170 //是会被注入的
171 //
172 //应该把客户输入进来的数据,进行转义,防止单双引号带来的破坏
173 //能不能把戏\',转回
174 答:175 echo '<hr />';
176 $str = stripslashes($str);------------------stripslashes();
177 echo $str;
178 
179 htmlspecialchars----------将字符中一些字符转换为HTML实体
180 htmlspecialchars_decode--------htmlspecialchars()函数的反函数,将HTML实体转换为字符
181 
182 htmlentitles----------将字符串中所有可转换字符转换为HTML实体
183 
184 $str = '<ab>';
185 $str =  htmlspecialchars($str);
186 $str= htmlspecialchars_decode($str);
187 echo $str;
188 
189 int strcmp ( string $str1 , string $str2 )-----------------strcmp()
190 //如果 str1 小于 str2,返回负数;如果 str1 大于 str2,返回正数;二者相等则返回 0。 
191 
192 if(strcmp('a','b')>0){--------------------strcmp()                             返回目录  
193 echo 'a&gt;b'; 194 }else if(strcmp('a','b')<0){ 195 echo 'a&lt;b; 196 }else{ 197 echo '相等'; 198 } 199 200 //大小写转换 201 202 $str = 'heLLO,THIS iS lILY,BUT,I LOVE hANMEImei'; 203 204 echo strtolower($str),'<br />';//-----------------strtolower() 205 206 echo strtoupper($str),'<br />';//-----------------strtolower() 207 208 //把$str字符串中的第一单词即hello首字母大写. 209 210 echo ucfirst($str),'<br />';//-----------------strtolower() 211 //====================================================   返回目录  
 

有关字符串的字面试题:

 
//有关字符串的面试题
$str = 'abcdef';
echo substr($str,0,1);
echo $str[0];
//字符串还有一个类数组特性,即可以用索引、下标把指定的字符取出来
//
//如何实现字符串反转 
$str  = 'abcde';
function rev($str){
   $len = -strlen($str); 
    for($new = '',$start=-1;$start>=$len; $start--){
        $new.=substr($str,$start,1);
       
    }
    return $new;
}
echo rev($str),'<br />';
//echo strrev($str);---------------字符串反转函数
//用5种以上方式获取文件的后缀
//例:a.jpeg.exe,获得exe,或者.exe
//----------------------------------------------------
//方法1
$file = 'a.jpeg';
function getext($file){
    return strrchr($file,'.');
}
echo getext($file);
//找最后一个   .出现的位置,再substr截取。
//strrpos是找子字符最后一次出现的位置
//----------------------------------------------------
$file = 'a.jpeg';
function getext2(){
return substr($file,strrpos($file,'.'));
}
echo strrpos($file,'.');
echo strrev($file);
exe.gepj.a
exe.gepj.a
//把字符串反过来,然后再找第一个点出现的位置
//然后再反一次
$file = 'a.jpeg.doc.dsf';
----------------------------------------------------
function getext3($file){
    $file = strrev($file);  //cod.gepj.a
    $find = strpos($file,'.');// 3
    $file = substr($file,0,$find);
    $file = strrev($file);
    return $file;
}
echo getext3($file);
//
//用系统函数pathinfo  
$file  = 'a.jpeg';
//$arr = pathinfo($file);
//----------------------------------------------------
function getext4($file){
    $arr = pathinfo($file);
    return $arr['extension'];
    retrun pathinfo($file,PATHINFO_EXTENSION);  //直接返回jpeg
}
echo getext4($file);
//Array
//(
//    [dirname] => . ----------------代表在当前目录下
//    [basename] => a.jpeg-----------基本名称
//    [extension] => jpeg------------文件扩展名
//    [filename] => a----------------文件名
//)
//如果学习了数组,还可以有多种做法
//----------------------------------------------------
//将1234567890转换成1,234,567,890这种方式
$num = '1234567';
function t1($num){
  $arr = str_split(strrev($num),3);
  return strrev(implode(',',$arr));
}
print_r(t1($num));  //Array ( [0] => 123 [1] => 456 [2] => 7 ) 
//---------------------------------------------------
$num = '1234567';
function t2($num){
$num =strrev($num);
return ltrim(strrev(chunk_split($num,3,',')),',');---------ltrim() 函数从字符串左侧删除空格或其他预定义字符。
}
print_r(t2($num));
//----------------------------------------------------
$num = '1234567';
echo number_format($num);-------------number_format()系统自带的数字分割函数,以千为单位分割。
//====================================================                               返回目录  
 

分割,连接,反转函数

str_split($str,len):把$str按len长度进行分割返回数组
split(search,$str[,int]): 把$str按search字符进行分割返回数组int是分割几次,后面的将不分割
explode(search,$str[,int])
implode —— 将数组用特定的分割符转变为字符串
 
 1 //字符串和数组,有2个函数,是他们的桥梁,非常频繁的使用.
 2 //
 3 //就是implode ,explode
 4 //
 5 //有的网站,写文章,让我们填写标签,"多个标签用逗号隔开"
 6 //
 7 //$str = 'abc,中国,美国,日本';
 8 //
 9 ////explode 是根据指定的分割符,把字符串拆成数组
10 $arr = explode(',',$str); --------------------------explode()
11 print_r($arr);
12 
13 而implode是根据指定的连接符,把组再拼接成字符串
14 $arr = implode('~',$arr);
15 var_dump($arr);
16 
17 //你可以中只传一个数组,不指定连接符
18 //这样,将把数组单元组合在一起中间没有连接符.
19 
20 //如何实现字符串反转 
21 
22 $str  = 'abcde';
23 function rev($str){
24    $len = -strlen($str); 
25     for($new = '',$start=-1;$start>=$len; $start--){
26         $new.=substr($str,$start,1);
27        
28     }
29     return $new;
30 }
31 
32 echo rev($str),'<br />';
33 //echo strrev($str);---------------字符串反转函数
34 //------------------------------------------
35 
36 $arr = implode($arr);-----------------implode()
37 var_dump($arr);
38 
39 $str = '12345678';
40 echo chunk_split($str,3,',');  //每隔三个字符加一个逗号.------------chunk_split();
41 
42 //如果不加逗号,则默认为换行.
43 echo '<hr />';
44 echo chunk_split($str,3);
45 ====================================================                          返回目录 
 

13.html代码/数据库安全处理有关函数

addslashes ( string $str )
stripslashes ( string $str )
get_magic_quotes_gpc()
htmlspecialchars ——将字符串中一些字符转换为HTML实体
htmlspecialchars_decode —— htmlspecialchars()函数的反函数,将HTML实体转换为字符
html_entity_decode —— htmlentities ()函数的反函数,将HTML实体转换为字符
htmlentities ——将字符串中所有可转换字符转换为HTML实体
 
 1 字符转义函数,非常重要.
 2 
 3 $str = "abc ', hello";
 4 echo $str,'<br />';
 5 $str = addslashes($str); //单引号被转义成都市\'--------------addslashes()
 6 echo $str;
 7 
 8 //现在我们还没有学习mysql,你还意识不到一个单引
 9 //号的破坏作用.但要知道,单双引号如果不小心,数据库
10 //是会被注入的
11 //
12 //应该把客户输入进来的数据,进行转义,防止单双引号带来的破坏
13 //能不能把戏\',转回
14 答:15 echo '<hr />';
16 $str = stripslashes($str);------------------stripslashes();
17 echo $str;
18 
19 htmlspecialchars----------将字符中一些字符转换为HTML实体
20 htmlspecialchars_decode--------htmlspecialchars()函数的反函数,将HTML实体转换为字符
21 
22 htmlentitles----------将字符串中所有可转换字符转换为HTML实体
23 
24 $str = '<ab>';
25 $str =  htmlspecialchars($str);
26 $str= htmlspecialchars_decode($str);
27 echo $str;
28 
29 int strcmp ( string $str1 , string $str2 )-----------------strcmp()
30 //如果 str1 小于 str2,返回负数;如果 str1 大于 str2,返回正数;二者相等则返回 0。 
31 
32 if(strcmp('a','b')>0){--------------------strcmp()
33     echo 'a&gt;b';
34 }else if(strcmp('a','b')<0){
35     echo 'a&lt;b;
36 }else{
37 echo '相等';
38 }
39 
40 //大小写转换
41 
42 $str = 'heLLO,THIS iS lILY,BUT,I LOVE hANMEImei';
43 
44 echo strtolower($str),'<br />';//-----------------strtolower()
45 
46 echo strtoupper($str),'<br />';//-----------------strtolower()
47 
48 //把$str字符串中的第一单词即hello首字母大写.
49 
50 echo ucfirst($str),'<br />';//-----------------strtolower()
51 //====================================================                      返回目录 
 

大小写转换函数

 
 1 //大小写转换
 2 
 3 $str = 'heLLO,THIS iS lILY,BUT,I LOVE hANMEImei';
 4 
 5 echo strtolower($str),'<br />';//-----------------strtolower()
 6 
 7 echo strtoupper($str),'<br />';//-----------------strtolower()
 8 
 9 //把$str字符串中的第一单词即hello首字母大写.
10 
11 echo ucfirst($str),'<br />';//-----------------strtolower()                返回目录 
 
  1. 字符串截取函数
substr($str,int start[,int length]):从$str中strat位置开始提取[length长度的字符串]。
strstr($str1,$str2): 从$str1(第一个的位置)搜索$str2并从它开始截取到结束字符串;若没有则返回FALSE。
stristr() 功能同strstr,只是不区分大小写。
strrchr() 从最后一次搜索到的字符处返回;
 
 1 /string substr ( string $string , int $start [, int $length ] )
 2 //$string:待截取的长字符串
 3 //$start:截取开始的位置
 4 //$length:正数时代表截取的长度。负数时,代表截取结束的位置
 5 //
 6 $str ='abcdeff';
 7 echo substr($str,3),'<br />';
 8 
 9 //1.当第3个参数不指定时,截取到字符串的‘结尾’
10 //
11 //经理说:把字符串末尾的3个字符串截取出来。
12 //
13 echo substr($str,-3);//办法2:第2个参数为负数,表示从右开始截取
14 echo substr($str,(strlen($str)-3));  办法1:总长度减去3,也能截取到结尾的三个字符.
15 //
16 //2. 除了前3个和结尾3个外,截取中间的部分字符串.
17 //
18 //分析:start应该是3
19 //
20 //length,如果代表长度,多长呢?不一定,因为字符串长度不好算
21 //
22 //这时,可以把length写成负数
23 
24 //----------------------------------------------------
25 //如果用substr来截中文呢?
26 
27 //substr是按字节来操作的,不考虑什么编码
28 $str = '中国民国'; //我的文件utf-8,
29 echo substr($str,0,3);----------------------------substr()
30 
31 //----------------------------------------------------
32 //如果用substr来截中英混合呢?
33 
34 $str = 'lily你的代码report给我,中午我们有个meeting ,一会儿带你吃KFG';
35 echo substr($str,0,6),'ab';//按字节截,'lily你'是7个字节才完成'你'的3个字节,被截了2个,出了问题
36 //----------------------------------------------------
37 //strstr($str,$needle);
38 
39 //作用:是在$str中找到指定的$needle,而且是$needle第一次出现的位置,返回该位置直到字符串结尾的这一部分
40 
41 //能否把第一次找到的$needle的位置之前的字符串截取出来呢?
42 //答: 能,从php5.3.0版本开始,strstr函数多了第3个可选参数
43 
44 $str = 'asdf.def.jpg.exe';
45 echo strstr($str,'.'),'<br />'; // .def.jpg.exe
46 echo strstr($str,'.',true); ---------------------strstr()
47 
48 //能否先把$needle最后一次出现的位置找出来
49 //从该位置,一直截到结尾
50 
51 echo strrchr($str,'.'),'<br />';
52 
53 //面试时,让你计算一个文件的后缀?
54 $file = 'new.txt';
55 echo strrchr($str,);----------------------strrchr()                          返回目录
 

空白处理函数

string trim ( string $str [, string $charlist ] )
string ltrim ( string $str [, string $charlist ] )
string rtrim ( string $str [, string $charlist ] )
chunk_split($str,2);向$str字符里面按2个字符就加入一个空格;
str_pad —— 对字符串进行两侧的补白                                                                     返回目录

 相关视频:

1. 燕十八-PHP公益培训-YY直播-028-字符串定义及单双引号区别

2. 燕十八-PHP公益培训-YY直播-029-字符串定界符的用法

 3. 燕十八-PHP公益培训-YY直播-030-字符串系统函数讲解

5.燕十八-PHP公益培训-YY直播-032-字符串函数详解(3)

6.燕十八-PHP公益培训-YY直播-033-字符串面试题讲解

/** 燕十八 公益PHP培训 课堂地址:YY频道88354001 学习社区:www.zixue.it **/
Read more...

Sed在匹配行前后加入一行

  • Published in CentOS 6
  • July 20, 2013

a 追加内容 sed ‘/匹配词/a\要加入的内容’ example.file(将内容追加到匹配的目标行的下一行位置)
i 插入内容 sed ‘/匹配词/i\要加入的内容’ example.file 将内容插入到匹配的行目标的上一行位置)
示例:
#我要把文件的包含“chengyongxu.com”这个关键词的行前或行后加入一行,内容为“allow chengyongxu.cn”

1#行前加
2sed -i '/allow chengyongxu.com/i\allow chengyongxu.cn' the.conf.file
3#行前后
4sed -i '/allow chengyongxu.com/a\allow chengyongxu.cn' the.conf.file
Read more...

CentOS中设置系统级代理

  • Published in CentOS 6
  • July 13, 2013
YUM代理设置
 
编辑/etc/yum.conf,在最后加入
# Proxy
proxy=http://username:password@proxy_ip:port/
 
也可以使用proxy_username和proxy_password来配置代理的用户名和密码
 
这样的配置完成后,所有的用户在使用yum时,都会使用代理,可以说是全局代理。
 
如果需要为单独的用户配置代理,可以在用户的~/.bash_profile中设置。
 
Wget的代理设置
 
编辑/etc/wgetrc,在最后加入
# Proxy
http_proxy=http://username:password@proxy_ip:port/
ftp_proxy=http://username:password@proxy_ip:port/
 
系统全局代理
 
如果需要为某个用户设置一个系统级的代理,可以在~/.bash_profile中设置:
 
http_proxy="http://username:password@proxy_ip:port"
export_http_proxy
 
上面的设置只对某个用户生效,如果要对所有系统用户生效,写在/etc/profile中就可以了。
Read more...

centos ssh puttygen

  • Published in CentOS 6
  • July 7, 2013

我也碰到你这样的情况,我开始是成成pub key文件以后再记事本打开,复制的,不能登陆。不过我后来直接从puttygen的界面上的公匙框里面复制到authorized_keys文件里面,就可以登陆了。

Read more...

sort very large file

  • Published in CentOS 6
  • June 27, 2013
LC_ALL=C sort -u --buffer-size=2G --temporary-directory=/root/Desktop/tmp --output=joined_sorted.txt joined.txt 
uniq joined_sorted.txt joined_sorted_uniqed.txt
split bigFileName -l 按行分割
wc -l joined.txt 
split -l 10000000 joined.txt joined_split_
for f in joined_split_*; do
  sort -u "$f" > "$f"_sorted
done
sort -u -m joined_split_*_sorted > final.out
Read more...

Symantec Endpoint 设置

安装

因为我们要自己用 不连接到管理端  所以选择第一个 非受管理端

因为不安装 应用程序与设备控制   所以选择 自定义

应用程序与设备控制不建议安装 

应用程序与设备控制虽然分类在 主动型威胁防护里 但是选项 是在客户端管理 里面而不是 主动型威胁防护 里面在有管理端统一部署的情况下 这个是不能禁止启动的 也就是 启用面的复选框的小勾默认选择并且是灰色的

去掉这个 以后再更新 


如果你觉得选择了这两项 不利于自己的隐私 那还是去掉为妙 总之随个人喜好 

 

设置


如果想调度活动的扫描 这里就不用管 如果不像让它调度扫描 这里就关闭扫描



病毒和间谍软件防护设置



这个按照自己的喜好选择吧 点击小分类 可以分别查看和设置每个分类的处理方式

按自己喜好设置 不想提示的  去掉显示自动防护结果对话框前面的勾

重启时间改为三分钟 这两个扫描还是不要选择 要不然电脑不好的话 清理病毒的时候会卡  更新后也会卡



敏感级别 随个人喜好 想查杀高的 就选择9 最后一个 不选更安全 选择亦无妨

这里可以调节处理方式 至于怎样处理 看个人喜好选择


电子邮件 默认即可

 

 

 

主动型威胁防御设置



最后这两个 选择忽略 要不然会被烦死的


网络威胁防护设置

这里可以查看 更改 应用程序设置  单击右键  可以对于已经允许联网的程序禁止 或 对于已经禁止的程序联网 允许联网

这里可以查看正在联网的程序  右键单击 可以选择允许 禁止 或 终止 正在联网的程序
同样 也可以设置显示的方式 比如大图标 小图标 详细信息等等

防火墙规则详细设置请参阅: http://bbs.kafan.cn/thread-1286246-1-1.html以及: http://bbs.kafan.cn/thread-1396584-1-1.html

虽然最下面三个都选上 安全性会好一些 但是 选择 启用隐藏模式网页浏览 后 会影响一些网络服务 此项不选并不会减少多少安全性 


两个共享 一个是自己可以访问别人的  一个是别人可以访问自己的 建议选择第一个 去掉第二个的勾

如果不想显示攻击提示 或者觉得攻击提示很烦人的 可以去掉这个
建议先设置防火墙 设置完了之后 立即点更新(LiveUpdate)这样可以一边更新 一边设置 两不误


例外

这里可以设置扫描排除、监控排除、SONAR排除等等



客户端管理设置


建议选择禁止并记录 这样可以查看谁想结束SEP 如果你觉得提示很烦 可以改成 仅记录

建议选择连续 这样就可以持续自动更新了

如果你觉得这样泄漏自己的隐私 那就去掉 不要选择 不过这样就没云了

 

 

 

 

 

Read more...

strace命令

  • Published in CentOS 6
  • June 23, 2013
root@ubuntu:/usr# strace cat /dev/null 
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
brk(0) = 0xab1000
brk(0xad2000) = 0xad2000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?

---

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

--

 

-c 统计每一系统调用的所执行的时间,次数和出错的次数等. 
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column
设置返回值的输出位置.默认 为40.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令

---

命令实例


通用的完整用法:

strace -o output.txt -T -tt -e trace=all -p 28979

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

strace案例

  用strace调试程序

在理想世界里,每当一个程序不能正常执行一个功能时,它就会给出一个有用的错误提示,告诉你在足够的改正错误的线索。但遗憾的是,我们不是生活在理想世界 里,起码不总是生活在理想世界里。有时候一个程序出现了问题,你无法找到原因。
这就是调试程序出现的原因。strace是一个必不可少的 调试工具,strace用来监视系统调用。你不仅可以调试一个新开始的程序,也可以调试一个已经在运行的程序(把strace绑定到一个已有的PID上 面)。
首先让我们看一个真实的例子:启动KDE时出现问题
前一段时间,我在 启动KDE的时候出了问题,KDE的错误信息无法给我任何有帮助的线索。

_KDE_IceTransSocketCreateListener: failed to bind listener
_KDE_IceTransSocketUNIXCreateListener: ...SocketCreateListener() failed
_KDE_IceTransMakeAllCOTSServerListeners: failed to create listener for local

Cannot establish any listening sockets DCOPServer self-test failed.

对 我来说这个错误信息没有太多意义,只是一个对KDE来说至关重要的负责进程间通信的程序无法启动。我还可以知道这个错误和ICE协议(Inter Client Exchange)有关,除此之外,我不知道什么是KDE启动出错的原因。

我决定采用strace看一下在启动 dcopserver时到底程序做了什么:

strace -f -F -o ~/dcop-strace.txt dcopserver

这里 -f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到~/dcop-strace.txt里 面,dcopserver是要启动和调试的程序。

再次出现错误之后,我检查了错误输出文件dcop-strace.txt,文件里有很多 系统调用的记录。在程序运行出错前的有关记录如下:

 
27207 mkdir("/tmp/.ICE-unix", 0777) = -1 EEXIST (File exists)
27207 lstat64("/tmp/.ICE-unix", {st_mode=S_IFDIR|S_ISVTX|0755, st_size=4096, ...}) = 0
27207 unlink("/tmp/.ICE-unix/dcop27207-1066844596") = -1 ENOENT (No such file or directory)
27207 bind(3, {sin_family=AF_UNIX, path="/tmp/.ICE-unix/dcop27207-1066844596"}, 38) = -1 EACCES (Permission denied)
27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketCreateListener: failed to "..., 46) = 46
27207 close(3) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "SocketUNIXCreateListener: ...Soc"..., 59) = 59
27207 umask(0) = 0 27207 write(2, "_KDE_IceTrans", 13) = 13
27207 write(2, "MakeAllCOTSServerListeners: fail"..., 64) = 64
27207 write(2, "Cannot establish any listening s"..., 39) = 39
 


其中第一行显示程序试图创建/tmp/.ICE-unix目录,权限为0777,这个操作因为目录已经存在而失败了。第二个系统调用(lstat64)检查 了目录状态,并显示这个目录的权限是0755,这里出现了第一个程序运行错误的线索:程序试图创建属性为0777的目录,但是已经存在了一个属性为 0755的目录。第三个系统调用(unlink)试图删除一个文件,但是这个文件并不存在。这并不奇怪,因为这个操作只是试图删掉可能存在的老文件。

但是,第四行确认了错误所在。他试图绑定到/tmp/.ICE-unix/dcop27207-1066844596,但是出现了拒绝访问错误。. ICE_unix目录的用户和组都是root,并且只有所有者具有写权限。一个非root用户无法在这个目录下面建立文件,如果把目录属性改成0777, 则前面的操作有可能可以执行,而这正是第一步错误出现时进行过的操作。

所以我运行了chmod 0777 /tmp/.ICE-unix之后KDE就可以正常启动了,问题解决了,用strace进行跟踪调试只需要花很短的几分钟时间跟踪程序运行,然后检查并分 析输出文件。

说明:运行chmod 0777只是一个测试,一般不要把一个目录设置成所有用户可读写,同时不设置粘滞位(sticky bit)。给目录设置粘滞位可以阻止一个用户随意删除可写目录下面其他人的文件。一般你会发现/tmp目录因为这个原因设置了粘滞位。KDE可以正常启动 之后,运行chmod +t /tmp/.ICE-unix给.ICE_unix设置粘滞位。

  解决库依赖问题

starce 的另一个用处是解决和动态库相关的问题。当对一个可执行文件运行ldd时,它会告诉你程序使用的动态库和找到动态库的位置。但是如果你正在使用一个比较老 的glibc版本(2.2或更早),你可能会有一个有bug的ldd程序,它可能会报告在一个目录下发现一个动态库,但是真正运行程序时动态连接程序 (/lib/ld-linux.so.2)却可能到另外一个目录去找动态连接库。这通常因为/etc/ld.so.conf和 /etc/ld.so.cache文件不一致,或者/etc/ld.so.cache被破坏。在glibc 2.3.2版本上这个错误不会出现,可能ld-linux的这个bug已经被解决了。

尽管这样,ldd并不能把所有程序依赖的动态库列出 来,系统调用dlopen可以在需要的时候自动调入需要的动态库,而这些库可能不会被ldd列出来。作为glibc的一部分的NSS(Name Server Switch)库就是一个典型的例子,NSS的一个作用就是告诉应用程序到哪里去寻找系统帐号数据库。应用程序不会直接连接到NSS库,glibc则会通 过dlopen自动调入NSS库。如果这样的库偶然丢失,你不会被告知存在库依赖问题,但这样的程序就无法通过用户名解析得到用户ID了。让我们看一个例子:
whoami程序会给出你自己的用户名,这个程序在一些需要知道运行程序的真正用户的脚本程序里面非常有用,whoami的一个示例 输出如下:

# whoami
root

假设因为某种原因在升 级glibc的过程中负责用户名和用户ID转换的库NSS丢失,我们可以通过把nss库改名来模拟这个环境:

# mv /lib/libnss_files.so.2 /lib/libnss_files.so.2.backup 
# whoami
whoami: cannot find username for UID 0

这里你可以看到,运行whoami时出现了错误,ldd程序的输出不会提供有用的帮助:

# ldd /usr/bin/whoami
libc.so.6 => /lib/libc.so.6 (0x4001f000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

你只会看到whoami依赖Libc.so.6和ld-linux.so.2,它没有给出运行whoami所必须的其他库。这里时用strace跟踪 whoami时的输出:

 
strace -o whoami-strace.txt whoami

open("/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/i686/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
open("/lib/i686/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/i686", 0xbffff190) = -1 ENOENT (No such file or directory)
open("/lib/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
open("/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/lib", {st_mode=S_IFDIR|0755, st_size=2352, ...}) = 0
open("/usr/lib/i686/mmx/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
stat64("/usr/lib/i686/mmx", 0xbffff190) = -1 ENOENT (No such file or directory)
open("/usr/lib/i686/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)

 

你可以发现在不同目录下面查找libnss.so.2的尝试,但是都失败了。如果没有strace这样的工具,很难发现这个错误是由于缺少动态库造成的。现 在只需要找到libnss.so.2并把它放回到正确的位置就可以了。 

  限制strace只跟踪特定的系统调用

如果你已经知道你要找什么,你可以让strace只跟踪一些类型的系统调用。例如,你需要看看在configure脚本里面执行的程序,你需要监视的系统调 用就是execve。让strace只记录execve的调用用这个命令:

strace -f -o configure-strace.txt -e execve ./configure

 

 

Read more...

Lexicographically sorting large files in Linux

  • Published in CentOS 6
  • June 18, 2013

When I hear the word “sort” my first thought is usually “Hadoop”! Yes, sorting is one thing that Hadoop does well, but if you’re working with large files in Linux the built-in sort command is often all you need.

Let’s say you have a large file on a host with 2GB or more of main memory free. The following sort command is a efficient way to lexicographically-order large files.

LC_COLLATE=C sort --buffer-size=1G --temporary-directory=./tmp --unique bigfile.txt

Let’s break this command down and examine each part in detail.

Read more...
Subscribe to this RSS feed