Ubuntu的图形界面使用起来非常方便,但是要想对Linux熟练掌握,就必须学会它的操作命令。虽然可能会花费一些时间,不过从长远的角度来说,这的确是一件事半功倍的事情,它会让我们更了解Linux,更灵活地去使用Linux。Ubuntu提供了很多命令,不过在本章中不做全部介绍,只是先介绍一些常用命令,其他则分散到各个章节中。初学Linux一定要特别注意,学习命令并不意味着要掌握全部命令和每个命令的全部选项,这并不是必要的。先掌握最常用命令的最常用选项就好,下面就让我们来体会一下Ubuntu命令的强大功能。
Ubuntu的命令较多,但是对于一些常用的系统操作,无非就是一些创建、查看、移动、复制等,本小节先熟悉一下这些基本命令。在学习这些基本命令之前,应该先了解一下Linux的一些特性和在Linux中命令的执行方式。
在Linux中,所有设备都是用文件名来表示的,就像我们在分区时所了解的那样,这与我们所熟悉的Windows系统有很大不同,Linux中并没有所谓C盘、D盘之类的说法,并且在Linux中只有文件和目录(相当于Windows中的文件夹),所有文件和目录都以倒树状结构挂载在“/”(读做根目录)目录下,也正是因此Linux系统的管理员称为root(树根),如图7-1所示。这稍后在第12章“文件系统管理”一章还会详细介绍,现在大家只是有个概念即可。
需要说明的一点是,对于普通用户来说,提示符“#”显示为“$”。在Linux中如果要执行一个命令则可以通过如下方式:
需要注意的是,命令名、选项或者参数之间都是至少要有一个空格,多个空格没有关系,选项不是必需的。当有多个选项时,可以写在一起。因为Linux基本是由C语言编写的,所以无论命令名或选项,Linux都是严格区分大小写的。
在Ubuntu中,在默认情况下蓝色代表目录,白色代表普通文件,红色代表压缩文件或者软件包,绿色代表可执行文件,浅蓝色代表链接文件,黄色代表设备文件等。但是这并不是在所有情况下都是有效的,之所以能以颜色区分,是因为在执行命令“ls -l”时,实际上是执行了“ls --color=auto”命令,可以使用alias命令进行查看,这种设置命令别名的方式在第9章会详细介绍。如果要想确切地知道到底是文件还是目录,可以通过ls –l命令,首行字母为“d”则为目录,首行字母为“-”的即为文件,首行字母为“l”的为软链接文件
我们知道,Ubuntu中所有文件或者目录都挂载在“/”目录下,所以如果一个文件或者目录的详细位置是从“/”开始的话,这样的路径称为绝对路径,如/etc/init.d/lvm。如果路径不是从根写起,则称之为相对路径,例如,现在所处的位置为/etc目录中,如果现在要进入init.d目录中,则可以执行如下命令:
其实这两种路径的写法都能达到同样的效果,相对路径的写法有时候更加快速、方便一些,例如,进入很深的一个目录结构中时,而绝对路径能够确保路径一定正确。
直接在命令行中输入cd命令而不加任何参数,可以马上回到用户的主目录(home),这一点与DOS中cd命令显示当前路径不同,请一定注意。在Linux中,很多与用户自身相关的配置文件、属于自己的文档、程序、脚本和安装包等都存放在用户自己的home目录中,这个目录就相当于Microsoft Windows中的“我的文档”。所以能用cd命令直接“回家”,线 查看当前路径命令:pwd
这个命令比较简单,如果有时在操作过程中忘记了当前的路径,则可以通过此命令来查看路径,其执行方式为:
应该经常使用pwd命令。Linux的目录结构非常复杂,一个小小的分支就可能会有十几层目录,就好像是个森林,所以Linux不会像Windows那样把全路径写在提示符里,那样太长了。
在目录用cd钻来钻去,很容易记不清自己到底身在何处,这时候执行命令可是有点危险的,例如,想删除一个文件,不搞清楚当前目录,可能会误删除同名的有用文件,而且没那么容易恢复。还有很多其他的情况需要使用pwd,尤其是在执行“rm –rf”这种对目录直接删除的操作时,更需要用pwd确定一下,可能每执行十几个命令就会输入一回。我们应该感谢Jim Meyering先生,他是pwd的创作者。
下面我们举个例子来说明,现在我们在/home目录下创建了一个文件file,然后分别查看其三个时间,命令操作如图7-4所示。
通过图7-4我们可以看到,在刚开始创建文件时候三种时间是相同的,在默认情况下使用ls –l命令查看到的是文件内容修改的时间(即mtime),如果在不同时间内分别对其进行编辑内容,修改文件所有者和读取内容操作后,三个时间即会发生变化,具体命令以后会详细讲解,在此只需要观察一下命令结果即可,如图7-5所示。
通过图7-5可以看到,我们通过不同时间内的不同操作后,file文件的三种时间分别发生了变化,如果现在我们想让其变成与当前时间相同,则可以使用touch命令,执行结果如图7-6所示。
对于Ubuntu来说,这个命令是比较危险的一个命令,因为一旦使用了这个命令删除的文件如果再进行了磁盘写操作后将无法再恢复。在其他版本的一些Linux中,默认情况下给rm命令加上了一个i选项,可以在删除前对操作进行确认,建议当学习完Shell一节后也利用命令别名使其拥有这一特性。
刚才介绍的rmdir命令只能删除一个空目录,而rm命令不但能删除任何目录,而且可以删除文件。
例如,现在在/home目录下分别建立一个文件file和一个目录directory,并且在目录directory下建立file1文件,操作如下:
这时在/home目录中即有一个文件passwd,现在想生成一个passwd_new文件,要求内容与passwd文件内容相同,则可以执行命令:
这样就生成了一个passwd_new文件,其内容与passwd文件内容相同。以后当配置DNS服务器的时候,就可以采用同样的方法生成不同的区域数据文件,然后只需要对每个文件里面的不同部分进行修改就可以了,避免了每生成一个文件都要重新写一遍的麻烦。
cat命令的常见用法是查看一个文件的内容,例如,现在想查看一下/etc/passwd文件的内容,可以执行命令:
这样不用打开文件就可以看到passwd文件的内容了,但是cat命令的一个缺点是它在显示文件内容时不能做任何停留,所以如果遇到了一个文件内容超过整个屏幕的时候我们只能看到其最后部分,解决的办法是使用管道符(见第9章)和分屏显示命令:
还可以通过cat命令和输出重定向命令将一个文件的内容输出到另一个文件中去,即我们常说的将两个文件进行合并:
这样passwd文件的内容就会追加到passwd_bak文件中,从而达到两个文件合并的目的。
more命令可以单独使用,也可以和配合管道符使用。它的主要作用是能够将屏幕输出的结果分屏显示。例如使用cat命令查看/etc/passwd文件时,只能看到最后的内容,为了能够看到文件所有内容,可以执行命令:
这时就可以分屏来查看文件内容了,可以通过回车键向下一行行滚动,但是它的缺点是不能够进行向上滚动,如果想向上翻屏,需要使用less命令,less命令的用法与more命令完全相同,唯一不同点是less命令能够向上翻屏。可以通过上下箭头进行上下一行行滚动,也可以通过page up/page down命令向上/向下进行一屏一屏滚动。
Linux提供了一些用于处理文件的命令,使用它们,能够完成很多只有高级文本编辑器才能完成的功能,本节对其常用的一些进行介绍。
如果想比较出两个文件内容的不同,使用diff命令非常方便。例如,现在将/etc/passwd文件复制到/home目录下,并且将其复制生成文件passwd_new,再将passwd_new文件进行修改,然后使用diff命令比较出两个文件的不同,操作如下:
diff命令后还可以加一个目录名和文件名或者两个都是文件名,换句话说,如果上述命令执行方式处的文件一(或者是文件二)是目录,文件二(或者是文件一)不是目录,这样diff就会在目录中找到与文件名相匹配的文件进行比较,例如:
wc命令是一个对文件进行统计的非常好的命令,例如,现在需要统计当前系统内有多少用户,因为/etc/passwd文件中保存了所有的用户,并且每个用户的信息为一行,所以可以执行命令:
这样就能够得到当前Ubuntu系统中的用户数,wc命令还经常和管道符进行联合使用,对前一个命令的查询结果进行统计。
现以一个班级为例说明用户与组的关系。我们可以把班级里的每个学生看成是Ubuntu里的一个用户,现班级规定,每个人必须参加一个兴趣小组,甲同学参加了科技小组,那么他就是科技小组这个“组”里的成员,乙同学参加了书法小组,那么他就是书法小组这个“组”里成员,对于科技小组来说,组里的自己的私有物品也只有自己能够使用,如果书法小组的人想使用科技小组里成员的物品的话,需要科技小组的成员的物品所有者同意才可,但是由于科技小组里的成员都是一个小组,所以可能他们互相之间的使用物品的权限要比外组的成员要大一些。可以用图7-7表示。
可以看到,一个用户既可以属于一个组,也可以属于多个组,而每个组里成员的各自物品都可以根据自己的规定来让同组的成员和不在此组里的成员使用,实际上,这就是Linux最基本的权限模型。
Linux中的一个文件在正常情况下是属于一个用户所有,将此用户称为文件的所有者(也可以称为属主),而将一些用户统一分在一个组里,设定此组对文件操作的权限,这个组为文件的所属组,既不是文件的所有者,也不是文件的所属组里的用户我们统一称为其他人。
了解了这些基本概念后,我们就来学习一下设定权限的相关命令。需要说明的是,对于超级用户(UID为0)来说,它拥有所有权限
在Linux中,文件(目录)的权限分为可读、可写、可执行三类权限,其中可读用字母r表示,可写用字母w表示,可执行用字母x表示。
可写是指可以修改文件内容并且保存修改后的结果,如使用vi命令能够修改文件内容后保存。可执行指的是能够运行此文件,在Linux中,一个是否能够执行不决定于其扩展名,而是看其是否被设定了可执行权限,当然前提是本身一定是个二进制文件或者脚本文件。例如普通文本文件即使设定了可执行权限后也无法执行。
可写指的是能够在此目录下建立和删除文件。在Linux中,一个文件是否能够被删除,是决定于其所在目录是否对命令执行者设定可写权限,而与文件本身权限无关,文件本身权限只是对文件本身内容或者是否能执行进行限制。可执行指的是能够在目录下运行命令,所以如果想让一个用户能够进入此目录,必须对此目录在相应的权限位上设定可执行权限。
(3)第三列:文件的属主,即文件的所有者,有时候我们将一个文件复制给另一用户,要记得将文件的属主也要改变,否则可能会发生文件权限不对的错误。
现在重点来解释第一列,/etc/passwd文件使用ls -l命令后,查询结果的第一列如下:
这样根据文件类型就可以判断一个文件到底是文件还是目录,或者是哪种类型的文件,即使文件不以颜色显示也没有关系了。
我们发现,每组正好由三列组成,依次代表了可读权限、可写权限、可执行权限。也就是说,如果属主对文件拥有可读权限,则在属主权限位上的第一列就用r表示,而“-”代表没有相关的权限。由此我们可以得到/etc/passwd文件的权限:
文件的权限共有三种:可读(r)、可写(w)、可执行(x),使用数字4代表读权限;2代表写权限;1代表可执行权限;0表示没有相应的权限,所以,如果用户拥有哪个权限,就将其代表的数字相加,最后相加的和即为用户的权限。比如说,还是以passwd文件为例,我们知道root(属主)用户对文件拥有的权限为rw-,所以使用数字来代表即为:
即644为此文件的权限,其中第一个数字是代表属主所拥有的全部权限,第二个数字是代表属组里的用户所拥有的权限,第三个数字代表其他人所拥有的权限。下面举例说明如何使用chmod命令进行设定权限,使用Ubuntu用户创建一个文件file,因为在默认情况下在Ubuntu中创建的用户都是属于users组的,所以我们希望此文件权限为:
使用chmod命令以数字方式设定文件或者目录的权限,设定后以前的权限无论是什么都会以后设定的为准。
还可以使用字符方式设定权限,使用字符方式能够很方便地对文件的权限进行修改和设定。字符方式各符见表7-8。
7.3.2 更改属主(属组)命令:chownchown命令可以更改一个文件(目录)的属主或者属组。
chgrp与chown命令的用法基本是一致的,用法也比较简单。可以用-R参数把一个目录下的所有内容都改变用户和组。
相信每个人都有过在计算机查找一些文件的经历,对于记忆力不是很好的笔者更是经常如此,相信大家对Windows的搜索功能还是记忆犹新,其实Ubuntu也提供了功能非常强大的查找命令,下面我们就来体会一下。
系统默认是有很多系统变量存在的,其中有一个变量PATH,它定义了执行命令时命令所要查找的路径,例如,执行passwd命令给用户改密码时,系统会自动去PATH变量所规定的路径下去搜寻是否有此命令,如果有,则执行,否则将提示命令不存在,这也是为什么有些Linux初学者明明在当前目录下执行此目录里的命令而出现系统提示命令不存在(此时若要执行可以下达命令./命令名)。
这点与Windows有很大不同,其实Windows也是有PATH变量存在的,当初笔者曾经在工作的时候安装UG软件,结果安装完成后总是无法运行UG程序,最后将UG程序的路径给放到PATH变量里才正常运行。
由上可以看出,PATH变量是存放命令的,而which是按PATH变量规定的路径来找,所以which主要是用来查找命令的,并且查找到后将命令的绝对路径给显示出来。
7.4.2 按资料库查找的命令:whereiswhereis命令能够将不但能查询出命令,还能查询出Ubuntu资料库里记载的文件。
与which不同的是,whereis不但能够找到可执行的命令,而且将所有包含文件名字符串的文件全部查找出来,而且速度非常快,远远快于我们将要介绍的虽然强大但速度却有些慢的find命令。这是因为Ubuntu会将它里面所有的资料都记录在一个资料库里,而whereis命令查找时并不会在整个磁盘上进行查找,而只在此资料库里进行查找。
说明:因为find命令功能强大,而且能够设定查询条件,里面涉及的权限和文件类型的相关知识,所以大家可以在学完相应的章节后再来学习find命令。find命令的执行方式:
大家还记得介绍touch命令时提到的与文件有关的三个时间吧,所以根据文件时间状态进行查找主要有以下几项:
如果n前面有+号,则代表查找距离n天之前的发生变化的文件。如果是减号,则代表查找距离n天之内的所有发生变化的文件。-newer file1 ! –newer file2中的!是逻辑非运算符。
有时我们可能使用一个用户建立了一些文件,当此用户被删除后,他所建立的文件就成了无属主的文件了,所以我们应该用-nouser来查询,-nogroup与之相同。下面举例说明,现在想查找所有在/home目录中属主是Ubuntu用户的文件,应执行命令:
按文件大小进行查询时,默认的单位是块,因为绝大多数人习惯使用字节或者K等单位,所以我们用“c”表示字节,用“k”表示1024字节。前面如果有“+”号代表大于n所指定的大小,“-”代表小于n所指定的大小,没有的话表示正好等于n所指定的大小。关于文件的权限设定请参照文件系统章节中权限设定部分,在此不再详述。但需要注意的是此权限应该是4位,即加上了特殊权限位的部分。如果文件权限前面有“+”号,则表示所查找的文件的权限中有前面权限条件的任意一个即可,如果是“-”号,则表示所查找的文件的权限中至少要包含前面权限的所有,比权限条件多没有关系,但一定不能少于权限条件。
有时候我们对于查找到的结果需要对其进行进一步的操作,这就需要使用-exec或者-ok选项,或者使用-print选项。其使用的格式为:
其中-exec就是代表要执行shell命令,后面加的是shell指令,再后面的“{}”表示的是要对前面查询到的结果进行查询,最后的“\;”表示命令结束。需要注意的是“{}”和“\”之间是要有空格的。而-ok选项与-exec的唯一区别就是它在执行shell命令的时候会事先进行询问,-print选项是将结果显示在标准输入上。
例如现在我们想查找系统内所有具有SUID位的文件,并且将结果保存在/root/SUID_file中,则执行命令:
7.5.5 查看压缩文件内容命令:bzcatbzcat命令也比较简单,不对.bz2文件进行解压就能查看里面内容。
tar命令常常用来对文件或者目录做备份。无论是刚才的gzip命令,还是bzip2命令,都会发现它们只能对单一文件进行压缩,而即使是同时输入两个文件名,也只能是生成两个单独的压缩文件,而我们经常需要对很多文件或者目录同时进行压缩并且希望生成同一个文件,这样就得先通过tar命令将需要同时进行备份的内容放到同一文件里,称之为“.tar”文件,但是此时仅仅是相当于把不同文件放到了一个大文件中,并没有压缩,当然可以将打包和压缩的动作一次性完成。并且利用tar命令还可以在压缩文件中增加新文件或者改变文件。tar命令选项众多,最常用的请见表7-12。
相信读者在前几个小节里大量命令的“洗礼”下,可能需要关闭计算机休息一下了,不过先别急,因为Ubuntu可不是随便就能关机的。我们知道,Ubuntu是一个多人多工的操作系统,这就意味着可能同一时间不止一个人在系统上操作,而且在Ubuntu后台还在默默地运行着很多的工作,关机很可能造成其他人工作的丢失,所以需要好好了解一下关机的命令。

