使用grep查找指定目录下的关键字

24 7 月, 2011 by edsionte 2 comments »

之前于童鞋问我如下问题:

在/etc目录下如何查找包含’root’关键字的所有文件?

对于一个指定的文件来说通常使用下面的方法来查找关键字:

grep 'keyword' file

如果你懂得正则表达式,那么还可以对关键字作更细致的匹配。但是利用grep查找指定目录下的所有文件我尚不清楚,通过man手册以及论坛求助基本解决了上面的那个问题。

1.如何递归查找

grep通常只能查找指定数目的文件,如果需要查找某个目录下的所有文件必须添加-R或-r选项。这个选项比较好理解,如果我们要删除一个非空的目录那么也必须对rm命令添加-r或-R选项。因此我们可以通过一下命令来完成本文一开始所提出的问题:

grep -R 'boot' /etc

这样好像已经解决了问题,不过从输出的结果来看有一些匹配并不符合我们的要求。

/etc/grub.d/README:administrator.  For example, you can add an entry to boot another OS as
/etc/grub.d/20_memtest86+:if test -e /boot/memtest86+.bin ; then
/etc/grub.d/20_memtest86+:  prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/
\t/")"

比如第三行所匹配的root并不是一个单独的词,而是包含在其他字符串中。

2.完全匹配一个词

通过上面的分析我们得知我们需要类似下面的举例那样匹配root关键字:

I am a root
root is me
I have root permission

而不是像下面这样:

rooter is me
I am rooter
I have rooter permission

因此,我们还需要增加其他参数以达到完全匹配一个词的目的。grep中使用-w选项来完全匹配一个单词。因此我们的解决方法修改如下:

grep -R -w 'boot' /etc

3.更友好的改进

通过上面的命令已经可以较好的解决本文一开始提出的问题了。不过,其输出结果很长,不方便我们查看。

如果我们需要知道该关键字位于被查找文件的哪一行,那么可以加入-n选项:

grep -R -w -n 'boot' /etc

有时候我们只需要知道该关键字包含在那个文件中,因此我们加入-l选项:

grep -R -w -l 'boot' /etc

这样以来的确方便了查看,不过由于输出结果在一个屏幕下不能完全显示,因此我们可以用more命令分屏查看,或者直接将输出结果重定位于指定的文件中:

grep -R -w -l 'boot' /etc > ./output.txt

这样就可以方便的查看输出结果了。

Hello,Python!

10 7 月, 2011 by edsionte 2 comments »

使用Python打印一条“hello,world!”语句是再简单不过的事情了,因为Python特有的交互型解释器可以帮助你完成这项任务。如果你在Ubuntu系统下,首先在终端敲入python就可以进入python解释器,然后输入”hello, world!”即可打印出这句经典的语句。

edsionte@edsionte-laptop:~$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "hello, world!"
'hello, world!'

此时,你已经成功的打印了”hello, world!”这条字符串。当你输入这条字符串后,解释器就按照字符串的解释规则去解释它,其结果就是在终端显示出hello, world这条语句。这里特别强调的是,这条语句必须被双引号或者单引号包括在内,如果在解释器中直接输入hello, world!那么将会出现语法错误,比如:

>>> hello, world!
  File "< stdin >", line 1
    hello, world!
                ^
SyntaxError: invalid syntax

其主要原因就是Python解释器此时不知道如何解释这条语句。

除了用双引号或者单引号直接告诉Python解释器”此时你应该解释一条字符串“,通过print命令也可以成功打印这条语句。

>>> print "hello, world!"
hello, world!

至此,你已经成功的使用Python打印了“hello,world!”,不过这一切都是在Python解释器里完成的,当你退出解释器是,这些语句将会消失。按照我们常规的编程习惯,我们通常会将程序以文本的形式保存起来。我们使用vim创建一个hello.py的程序,其内容是:

#!/usr/bin/python2.6
print "hello, world!"

新增的第一条语句告诉操作系统应该使用/usr/bin目录下的Python来执行这些语句。我们再修改该文件的属性,使它有执行的权限。好了,你已经创建了第一个Python脚本,现在开始执行吧:

edsionte@edsionte-laptop:~/mypython$ chmod a+x hello.py
edsionte@edsionte-laptop:~/mypython$ ./hello.py
hello, world!

成功!

adduser命令学习

7 7 月, 2011 by edsionte 无评论 »

今早试着为我的机子添加一个guest账户,以便方便其他同学的使用。因此我用useradd命令来创建一个guest账户:

edsionte@edsionte-desktop:~$ sudo useradd -d /home/test test

上述命令在系统中创建了一个test用户,并且通过-d选项为该用户指定了登录后的主目录/home/test。创建成功后,该用户的账户信息会保存在/etc/passwd文件当中。/etc/passwd文件用来保存系统中当前所有的用户信息,该文件对所有用户都可见。比如:

……
edsionte:x:1000:1000:edsionte,,,:/home/edsionte:/bin/bash
guest:x:1001:1001:guest,,,,:/home/guest:/bin/bash
test:x:1002:1002::/home/test:/bin/sh
……

在该文件中,每行信息代表一个用户。每个用户的信息由7部分组成:

用户名:加密后的用户密码:用户ID(UID):用户所在组ID(GID):用户全名以及用户信息:用户主目录:该用户登录时所用的命令解释器

从上面test用户的信息可以看到,除了我们显式指定的用户主目录,其余信息都是系统默认的。比如UID和GID相同,test用户的命令解释器选用sh。

用户创建后,还必须为test指定一个登录密码。指定和修改用户密码的命令是passwd。普通用户使用该命令只能对自己修改密码,而超级用户则可以对任何用户修改密码。我们当前的用户为edsionte,通过下面的命令即可为test指定密码:

edsionte@edsionte-desktop:~$ sudo passwd test
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码

由于我们在edsionte用户下去修改test用户的密码,因此必须加sudo使用超级用户权限。

到此位置,test用户就创建完毕了,可是登录到test用户下,打开终端后却出现了以下几个问题:

1.打开终端后,提示信息仅为“$”,并不想通常我们所见到的“edsionte@edsionte-desktop:~$”;

2.在终端使用TAB键后不能自动补全命令,而是TAB健本身的效果;

原来这两个问题与我们刚才指定的命令解释器有关,通常我们使用的shell为bash,而useradd命令默认指定的shell为sh。通过usermod命令可以修改一个用户的相关信息,因此我们在test用户下通过下面的命令修改shell即可:

usermod -s /bin/bash

注销并重新登录test后就可以看到我们通常所熟悉的终端。

西邮Linux兴趣小组纳新笔试试题

16 6 月, 2011 by edsionte 4 comments »

下面是西邮Linux小组今年纳新的笔试试题,原文在这里

1、 下面这个程序的输出结果是什么?
int main()
{ int a = (1, 2);
printf(“a = %d\n”, a);
return 0;
}

解答:
a = 2
这里利用了逗号表达式。

2、下面这个程序的输出结果是什么?
struct value {
char a[3];
short b;
};
struct value tmp;
printf(“sizeof(tmp) is %d\n”, sizeof(tmp));

解答:
sizeof(tmp) is 6
这里涉及到字节对齐,a数组后填充了1字节。

3、编写程序交换a,b的值。(使用多种方法)

4、说明 int *p[5] 和 int (*p)[5] 的区别?

解答:前者是一个指针数组,后者是一个数组指针。

5、编写函数,实现链表的创建,节点的插入和删除。

6、下面这个程序的输出结果是什么?
void f(int *p);
int main(void)
{
int *p;
f(p);
printf(“*p = %d\n”, *p);
return 0;
}
void f(int *p)
{
static int dummy = 5;
p = &dummy;
}

解答:
*p中的值不确定。
大多数人(包括我)都会认为*p的值是5,但这并不正确。因为f函数传递的是指针变量,既然是变量,那么只能通过传递地址来确保将f中的值饭或到主函数。如果f传递的是&p,那么最后的结果应该是5。

7、说明如下两段代码的区别。
char * p = “xiyou linux”;
char p[] = “xiyou linux”;

解答:
前者p是一个指针,它指向一段只读字符串。
后者p是一个数组,该数组用“xiyou linux”来初始化。

8、用C语言实现一个n!函数。(要求用递归实现)。

9、 char c;
char b[20] = “I love xiyou linux”;
c=’l’与c=”l”有区别么?若有,区别是什么?字符串b在内存中占几个字节?

解答:
c=’l’是一个字符,而c=”l”是字符串。
从对b数组的定义可以得知b在内存中占有20个字节,这与对它进行初始化的字符串长度无关。
如果有如下定义:
char b[] = “I love xiyou linux”;
那么此时b的大小为19。

10、实现自己的strcat()。

11、char str[20] ;
scanf(“%s”, str);
printf(”%s”,str);
如果输入:I love linux!<回车>
输出结果是什么?为什么?

解答:
输出结果为I。因为使用scanf输入字符串时不能含有空格,否则字符串会从第一个空格处被截断。

12、下面这段程序的输出结果是什么?为什么?
#define MAX(x,y) x > y ? x : y
int main()
{
int a = 10, b = 20;
int c = 3*MAX(a , b);
printf (“%d\n”, c);
return 0;
}

解答:
经过宏替换后,c = 3*a>b?a:b; 则c的值为10。

13、已知两个整型数组均为升序排列,将两个数组合并,且合并后仍按升序排列。

14、下面两条语句哪条更合理?
if(array[which] == 5 && which < SIZE)…..
if(which < SIZE && array[which] == 5)….

TCP连接的建立和终止

9 6 月, 2011 by edsionte 无评论 »

在基于TCP的客户/服务器模型中,服务器和客户程序之间通过一系列的socket接口形成TCP连接。服务器启动后的首要工作就是创建监听套接字,监听套接字是通过socket、bind和listen三个函数完成的。在这之后,监听套接字通过accept函数一直处于阻塞状态,等待客户程序的连接请求。客户程序在连接至服务器之前,必须先创建自己的套接字,再通过connect函数连接到服务器。如果一切顺利,那么服务器和客户之间就形成了一条TCP连接。

上述TCP连接的过程是从编程角度触发,接下来我们将从网络通信的角度分析TCP的建立和终止过程,并且结合相关的socket函数接口分析其建立和终止过程中客户程序和服务器状态的变化。

1.TCP的建立

TCP连接建立过程即通常我们所说的“三路握手”。整个连接过程是由客户端的connect函数发起的,其具体的步骤如下:

1.客户端向服务器发送一个SYN(同步)报文段,这个报文段包含了客户端将要发送数据的初始序列号,假设该序号为J。该SYN段为整个TCP连接过程的报文段1。

2.服务器向客户端发送一个SYN段作为对客户端的应答,该报文段包含服务器在此连接中将要发送数据的起始序列号K。该SYN段为整个TCP连接过程的报文段2;在该报文段中还包含服务器对客户端SYN段的确认(ACK),该确认包含的序号为J+1,表明服务器期望客户端下次发送的数据序号是从J+1开始的。也就是说报文段2包含服务器发送的SYN和服务器对客户SYN的ACK。

3.客户端向服务器发送ACK以对服务器SYN进行确认,该报文段的序号为K+1。这是报文段3。

由于服务器在接收到客户端的TCP连接请求之前调用了accpet函数,所以一直处于阻塞状态。当客户通过connect函数向服务器发送第一个SYN段时,它执行了主动打开TCP连接这个动作。而接受这个SYN的服务器则执行被动打开动作,它向客户发送SYN以及ACK确认。

接下来我们以上文所举例的回射客户/服务器程序为例,说明TCP连接过程中客户端和服务器的状态变化。

1.从后台启动服务器程序。通过netstat命令我们可以看到当前服务器处于监听状态,因此此刻还没有任何客户请求。

在本地地址一栏中,IP地址为*是因为我们在绑定(bind)服务器套接字时使用了INADDR_ANY参数。由于此刻没有任何客户请求,所以外来地址处均为*。

2。运行客户程序,TCP连接建立。第一条信息为主服务器进程,它此刻仍然处于监听状态,等待其他客户程序的连接请求;第二条信息为子服务器进程,它此刻已经建立了TCP连接,本地端口为6666,而外来连接端口为54260。第三条信息为客户客户进程,他此刻也处于已建立连接的状态,本地端口为54260,而外来端口正好为6666。

此刻,我们在客户端并没有输入任何数据,因此此刻主服务器进程、子服务器进程和客户进程均处于阻塞状态,但是其阻塞原因却不同。主服务器进程是因为等待(accept)其他客户请求而阻塞;子服务器进程是因为等待(read())客户进程发送的数据而阻塞;客户进程则是因为等待从标准输入读取(fgets())数据而阻塞。我们可以进一步使用ps命令查看三个进程之间的状态。如下:

对ps使用-t选项可以查看指定伪终端下的进程,而通过-o选项则可以输入指定的进程状态信息,WCHAN参数可以进程睡眠的原因。ps的输出结果和我们上面的分析的结果一致,三个进程确实处于睡眠状态(S)。当进程阻塞于accept或connect时,其睡眠条件为inet_csk_wait_for_connect;当进程阻塞于套接字输入或输出时,其睡眠条件为sk_wait_data;当进程阻塞于终端的读操作时,其睡眠条件为n_tty_read。

2.TCP的终止

由于TCP连接是全双工的,因此必须分别关闭两个方向上的连接。通常一个TCP连接的终止需要4个分节。整个TCP的终止过程通常是由客户端的close函数发起的。

1.客户端进程调用close函数关闭套接字,它执行了主动关闭TCP连接,该端TCP向服务器发送一个FIN报文段(报文段1),表示该端的数据已经发送完毕。假设该报文段的序号为M。

2.服务器接收到这个FIN段后执行被动关闭。为了确认受到这个FIN,服务器向客户端发送一个ACK(报文段2),该确认报文的序号为M+1。服务器接收了客户端发送来的FIN说明服务器在该TCP连接上再无数据可接收。

3.服务器程序调用close关闭套接字,这将导致服务器向客户端发送一个FIN报文(报文段3),假设该报文的序号为N。

4.客户端为了确认服务器发送来的FIN报文,它向服务器发送一个ACK(报文4),该报文的序号为N+1。

上述所提及的关闭套接字有时候并不是只能通过close函数来实现。客户进程不论是正常终止(通过exit或者从主函数中返回)还是通过某个信号而终止时,都会关闭所有已经打开的描述符,这里当然包括套接字描述符。

当用户在标准输入端输入EOF时(Contrl+D),客户正常退出而关闭套接字,紧接着就会发生上述的TCP终止过程。通过netstat命令可以看到当前TCP的连接状态。

当前连接的客户端进入了TIME_WAIT状态,而服务器仍然在等待其他客户的连接。

我们继续使用ps可以查看到当前客户和服务器进程的状态。

可以看到客户进程已经退出,主服务器进程由于等待其他客户的连接而处于睡眠状态,子服务器进程虽然已经停止了服务,但是仍然处于“阴魂不散”的僵死状态。这是由于主服务器进程并未对子服务器进程发出的SIGCHLD信号进行捕获,具体的捕获方法在这里的文章已经说明。

windows 7 ultimate product key

windows 7 ultimate product key

winrar download free

winrar download free

winzip registration code

winzip registration code

winzip free download

winzip free download

winzip activation code

winzip activation code

windows 7 key generator

windows 7 key generator

winzip freeware

winzip freeware

winzip free download full version

winzip free download full version

free winrar download

free winrar download

free winrar

free winrar

windows 7 crack

windows 7 crack

windows xp product key

windows xp product key

windows 7 activation crack

windows7 activation crack

free winzip

free winzip

winrar free download

winrar free download

winrar free

winrar free

download winrar free

download winrar free

windows 7 product key

windows 7 product key