Linux 从 0 到 1(二) - 权限,用户及群组管理,Nano,软件安装,Man,文件查找

用户和权限

我们先了解一下Linux中用户是如何组织的,然后再来学习如何变身为超级用户。

在Linux中,理论上说来,我们可以创建无数个用户。但是这些用户是被划分到不同的群组里面的。

有一个用户,名叫root,是一个很特殊的用户。字大管家,号超级用户。因为在Linux系统中,它可以做任何事情。

sudo命令:以root身份运行命令

sudo是英语Substitute User DO的缩写,substitute是“替换,代替,替身”的意思,user是“用户”的意思,do就是“做”的意思。所以连在一起就是“替换用户来执行...”的意思。

因此,如果我们要运行只有root才可以运行的命令,那么可以在此命令前面加上sudo命令,如下:

sudo command

sudo su命令:一直成为root,当我们身为root时,只要运行exit命令,就随时可以回到个人用户。

在Ubuntu以外的其他Linux发行版,也许切换到root账户,不是用sudo su,而是只需要su就可以了。当然我们比较建议再加一个横线,用

su -

这样不仅能切换为root,还可以直接定位到root的家目录。而且可以直接使用root才能用的那些命令。

用户管理的命令

我们就可以来学习一些只有root用户才能运行的命令了。

adduser命令:添加新用户
passwd命令:修改密码

如果之后你对设定的密码不满意,那么可以用passwd命令来修改当前密码。

用法也类似adduser,只要在其后加上需要修改密码的那个用户名,例如:

passwd thomas
deluser:删除用户

运行deluser thomas这个命令,终端不会提示你确认是否删除,而是直接删除了用户thomas。

所以,deluser这个命令还是要谨慎使用。单单用deluser命令,不加参数的话,只会删除用户,但是不会删除在/home目录中的用户家目录。如果你想要连此用户的家目录也一并删除,可以加上--remove-home 这个参数,如下:

deluser --remove-home thomas

这样,不仅删除了thomas这个用户,连/home/thomas这个目录也会删除。其他的LInux发行版,一般来说,添加用户和删除用户是用useradduserdel命令。

群组管理的命令

把用户分在不同的群组,到底有何意义呢?

在用户不多的时候,我们会觉得一个用户属于一个群组(比如默认是与用户名相同的群组名)是挺不错的。但是一旦用户一多,你可能就想要创建群组了。

addgroup:创建群组
usermod命令:修改用户账户

usermod命令有好多参数,可以实现不同的功能。不过我们暂时只需要记得它的两个参数:

  • -l:对用户重命名,但是/home目录中的用户家目录名不会改变,需要手动修改。

  • -g:修改用户所在群组

用法很简单,假如我要将thomas这个用户放到我刚创建的friends这个群组里,可以这样写:

usermod -g friends thomas

我们怎么知道用户thomas的群组已经改变为friends了呢?

我们可以用groups命令,这个命令可以获知一个用户属于哪个(些)群组。

用法很简单,后接用户名就可以了,当然用户要存在才行。

当然我们也可以一次将一个用户添加到多个群组,就用 -G 参数(大写的G)。用法如下:

usermod -G friends,happy,funny thomas

以上命令把thomas添加到friends,happy和funny三个群组。记得群组名之间要用逗号分隔,而且没有空格。

注意:使用usermod时要小心,因为配合-g或-G参数时,它会把用户从原先的群组里剔除,加入到新的群组。如果你不想离开原先的群组,又想加入新的群组,可以在-G参数的基础上加上-a参数,a是英语append的缩写,表示“追加”。例如:

usermod -aG happy thomas

以上命令就把thomas追加到群组happy里了,这样thomas就属于两个群组:friends和happy。

注意:groups命令如果单独用,不加任何参数,会显示当前用户所在群组。
记得,追加群组的时候,一定要用大写的G这个参数,不能用小写的g这个参数,即使只追加一个群组。

delgroup命令:删除群组

其他的LInux发行版,一般来说,添加用户和删除用户是用groupaddgroupdel命令。

修改文件的所有者和群组

只有root用户可以修改一个文件的所有者和群组。

chown命令:改变文件的所有者

用法也很简单,后接新的所有者的用户名,再接文件名。例如:

chown thomas file.txt

可以看到,用chown命令,把file.txt文件的所有者改为thomas之后,file.txt的所在群组是不变的,还是oscar。

就要用到chgrp命令了。

chgrp命令:改变文件的群组

用法也很简单,后接新的群组名,再接文件名。例如:

chgrp thomas file.txt

其实,chown命令也可以改变文件的群组,用法如下:

chown thomas:friends file.txt

这句命令就把file.txt这个文件的所有者改为thomas,群组改为friends了。用法也很简单,就是在所有者和群组之间用冒号隔开。

-R参数:递归设置子目录和子文件

如果chown命令配上-R参数,就会使得被修改的目录的所有子目录和子文件都改变所有者(或者连群组也改变,如果用上述冒号的方法来同时修改所有者和群组)。

chmod命令:修改访问权限

权限的原理

比如我们在/home/oscar/linux_c目录下运行ls -l命令试试,

我们可以看到不少 d,r,w,l,x等字母。如果不细分的话,这些我们可以通称为文件访问权限符。

以下列出我们看到的字母的含义:

  • d:是英语directory的缩写,表示“目录”。就是说这是一个目录。

  • l:是英语link的缩写,表示“链接”。就是说这是一个链接。

  • r:是英语read的缩写,表示“读”。就是说可以读这个文件。

  • w:是英语write的缩写,表示“写”。就是说可以写这个文件,也就是可以修改。

  • x:是英语execute的缩写,表示“执行,运行”。就是说可以运行这个文件。

如果x权限在一个目录上而且它同时有r权限的话,那么表示的是这个目录可以被读,也就是可以打开此目录来看其子目录和子文件。

如果相应位置有字母,表示有相应权限;如果相应位置是一个短横 -,则表示没有相应权限。

除开第一个表示文件或目录属性的符号(此处是d,表示目录。如果是l,则是链接。还有其他字母,我们暂时不深究。如果是短横-,那么是普通文件。),其他的9个符号被划分为三组,从左到右分别表示:

  • 第一组rwx表示文件的所有者对于此文件的访问权限。

  • 第二组rwx表示文件所属的群组的其他用户对于此文件的访问权限。

  • 第三组rwx表示除前两组之外的其他用户对于此文件的访问权限。

可以看到,renamed_file这个文件的访问权限是。

-rw-r--r--

我们从左到右来分析这些符号都表示什么:

  • -:第一个短横表示这是一个普通文件。如果此处是d,那么表示目录;如果是l,那么表示链接,等等。

  • rw-:表明了文件的所有者(此处是oscar)对文件有读,写的权限,但是没有运行的权限。也很好理解,因为这是一个普通文件,默认没有可执行的属性。记住:如果有w权限(写的权限),那么表明也有删除此文件的权限。

  • r--:表明文件所在的群组(此处是oscar)的其他用户(除了oscar之外)只可以读此文件,但不能写也不能执行。“可远观而不可亵玩焉”。

  • r--:表示其他用户(除去oscar这个群组的用户)只可以读此文件,但不能写也不能执行。

综上所述,renamed_file这个文件是一个普通文件,不是一个目录,也不是链接文件,它的所有者oscar可以读写它,但不能执行;其他的用户只能读。

那么root呢?对于此文件root用户的访问权限是什么呢?

记住:root是超级管家,它有所有权限,"只有它想不到的,没有它做不到的"。它可以读、写、运行任意文件。

chmod命令:修改文件的访问权限

要说明一点,chmod命令不需要是root用户才能运行。只要你是此文件的所有者,你就可以用chmod来修改文件的访问权限。最常见的用法应该是数字式的。

用数字来分配权限:chmod的绝对用法
Linux系统对每种权限(r,w和x)分配了对应的数字:

权限 数字
r 4
w 2
x 1

所以,如果我们要合并这些权限,就需要做简单的加法了:将对应的数字相加。

假如我们要分配读,写权限,那么我们就要用4+2,就等于6。数字6表示具有读和写权限。

权限 数字 计算
--- 0 0 + 0 + 0
r-- 4 4 + 0 + 0
-w- 2 0 + 2 + 0
--x 1 0 + 0 + 1
rw- 6 4 + 2 + 0
-wx 3 0 + 2 + 1
r-x 5 4 + 0 + 1
rwx 7 4 + 2 + 1

所以,对于访问权限的三组(所有者的权限,群组用户的权限,其他用户的权限),我们只要分别做加法就可以了,然后把三个和连起来。

例如:640分别表示:

  • 文件的所有者有读和写的权限。

  • 文件所在群组的其他用户具有读的权限。

  • 除此之外的其他用户没有任何权限。

因此,我们可以给的最宽泛的权限就是 777:所有者,群组用户,其他用户都有读,写和运行的权限。这样,所有人就都可以对此文件“为所欲为”了。

相反,如果权限是000,那么没有人能对此文件做什么。当然,除了root,root可以做任何事。

我们现在来修改renamed_file的权限试试:

chmod 600 renamed_file

可以看到,我们的renamed_file文件的访问权限被修改为了

rw-------

正好是600。

所以现在只有oscar可以读和写此文件,其他人都不能做什么。当然,除了root之外。

用字母来分配权限:chmod的相对用法

除了用数字,我们也可以用另一种方式来分配文件的访问权限:用字母。

原理是类似的,但是有时用字母的方式更加精巧,因为不需要一次性把三组权限都写出来。

我们需要知道不同的字母代表什么:

  • u:user的缩写,是英语“用户”的意思。表示所有者。

  • g:group的缩写,是英语“群组”的意思。表示群组用户。

  • o:other的缩写,是英语“其他”的意思。表示其他用户。

  • a:all的缩写,是英语“所有”的意思。表示所有用户。

当然了,和这些字母配合的还有几个符号:

  • +:加号,表示添加权限。

  • -:减号,表示去除权限。

  • =:等号,表示分配权限。

接下来,我们举例说明如何使用:

#文件file.txt的所有者增加读和运行的权限。
chmod u+rx file.txt

#文件file.txt的群组其他用户增加读的权限。
chmod g+r file.txt 

#文件file.txt的其他用户移除读的权限。
chmod o-r file.txt 

#文件file.txt的群组其他用户增加读的权限,其他用户移除读的权限。
chmod g+r o-r file.txt 

#文件file.txt的群组其他用户和其他用户均移除读的权限。
chmod go-r file.txt 

#文件file.txt的所有用户增加运行的权限。
chmod +x file.txt 

#文件file.txt的所有者分配读,写和执行的权限;群组其他用户分配读的权限,不能写或执行;其他用户没有任何权限。
chmod u=rwx,g=r,o=- file.txt
-R参数:递归地修改访问权限

chmod配合-R参数可以递归地修改文件访问权限。

假如我要只允许oscar这个用户能读,写,运行/home/oscar这个目录的所有文件(当然,root不算,root可以做任何事),该怎么做呢?

chmod -R 700 /home/oscar

Nano 文本编辑器

你真知道什么是文本编辑器吗?它和文本处理器又有什么区别呢?

  • 文本编辑器:是这样一种软件,它可以编辑和查看文本文件,但是不能对文字做格式处理(例如:加粗,斜体,改变颜色,改变字体大小,添加超链接等等)。
    常见的有Windows下的记事本,Mac OS X下的文本编辑,Linux下的vi、emacs、gedit,DOS下的edit等。在Linux下,默认系统中至少安装了一种文本编辑器。当然,在Mac OS X下,nano也是默认安装的。

  • 文本处理器:也是一种软件,又叫文档编辑器,不仅可以编辑和查看文档,而且可以对其文字进行格式处理(加下划线,设为标题,插入图片等等)。这些软件只能在图形界面下使用。
    常见的有Windows下的Word,Mac OS X下的Pages,Linux下的OpenOffice Writer等。

以下给出一些常用的Nano组合快捷键:

Ctrl+G:显示帮助文档

Ctrl+O:保存文件

Ctrl+R:打开其他文件

Ctrl+Y:上一个屏幕

Ctrl+V:下一个屏幕

Ctrl+K:剪切当前一行

Ctrl+X:退出

Ctrl+W:查找

Ctrl+U:黏贴刚剪切的内容

Ctrl+/:替换

Ctrl+F:向前移动一格光标

Ctrl+B:向后移动一格光标

Ctrl+P:向上移动一行

Ctrl+N:向下移动一行

Nano的参数

最常用的参数当然就是要打开的文件名咯,例如:

nano file.txt

就会用nano打开file.txt,如果你对file.txt有写的权限,那你就可以用nano来修改这个文件了。

如果file.txt文件不存在,那么就会创建一个空文件,名字叫做file.txt,并用nano打开。

nano的其他参数有不少,不过小编挑了三个个人觉得比较实用的:

  • -m:激活鼠标。如果没有-m参数,那么鼠标在nano里是不起作用的,加了-m参数鼠标可以通过点击来控制光标的位置。

  • -i:激活自动缩进的功能。这对于程序员写代码太有用了。

  • -A:激活智能Home键的功能。通常状况下,我们按下键盘的Home键,我们的光标会立即跳到一行的最开始,如果用了-A这个参数,那么按下Home键它会智能地判断,如果一行的开始处有缩进,那么它会使光标跳转到紧跟在缩进之后,而不是一行的最开始。

如果我们要同时激活三个属性,只需要这样用:

nano -miA file.txt

通过.nanorc来配置Nano

注意,.nanorc的最前面有一个点,表明这是一个隐藏文件。
像这样的配置文件,如果用ls -l命令是列不出来的,需要用ls -a来列出。

一般Linux中的配置文件大多以点开头,而且多以rc结尾。比如vim的配置文件 .vimrc,bash shell的配置文件.bashrc,等等。

Linux或Unix的许多程序在启动时,都需要“rc”后缀的初始文件或配置文件。

“rc”,它是“runcomm”的缩写――即“run command”(运行命令)的简写。

" rc”是很多脚本类文件的后缀,这些脚本通常在程序的启动阶段被调用,通常是Linux系统启动时。如/etc/rc(连接到/etc/rc.d/rc)是Linux启动的主脚本,而.bashrc是当Linux的bash shell启动后所运行的脚本。

每个Linux的用户都可以在自己的家目录创建.nanorc这个文件,在每次nano启动前,它会读取此配置文件。

在小编的情况,因为我的用户名是oscar,所以我的.nanorc文件应该是 /home/oscar/.nanorc

但是,我查找了,在我的家目录中,并没有.nanorc这个文件。在你的情况,可能有,也可能没有。但是不要紧。因为如果在你的家目录没有.nanorc,那么nano会用全局的配置文件。

创建.nanorc

如果你的家目录里也没有.nanorc,那么你可以创建一个。怎么创建呢?很简单:

nano .nanorc

在这个.nanorc文件中,你可以输入你的配置信息。

每一行一句配置语句,配置语句是以set(用于激活。set是英语“放置,设置”的意思)或unset(用于关闭)开头,后接你要配置的项目。例如:

set mouse

这句话就用于激活鼠标(mouse是英语“鼠标”的意思)。有了这句话,那么每次nano启动时都会激活鼠标操作了,我们启动nano就不必写-m这个参数了,是不是很方便?

我们也可如法炮制,使得我们不用每次启动nano都加上-i和-A参数:

set autoindent

这句是用于激活自动缩进,相当于-i参数的作用。

set smarthome

这句用于激活智能Home键。

如果要保存文件,只要按下Ctrl+O,它会提示你文件名是.nanorc。因为我们已经指定了文件名,直接按下回车,这三行就写入到了.nanorc中。可以看到终端提示:[Wrote 3 lines],表示“写入了3行”。

如果你完成了配置,那么可以按下Ctrl+X来退出nano。

下次你再启动nano的时候,你会发现:鼠标被激活了,自动缩进也激活了,智能Home键也激活了。

配置文件可以大大提高我们的工作效率。

全局的nanorc和语法高亮

在每个用户的家目录中的.nanorc这个文件非常实用,因为它可以帮助你设置自己的nano选项。

但是,如果你的Linux系统中有几十个用户,你想要为所有这些用户都激活nano的鼠标操作,难道你要登录每一个用户的账户,然后在他们各自的.nanorc中添加 set mouse这句话么?那上百个用户呢?岂不是要累坏了。

Linux系统的开发者早就想到了这一点。事实上,nano有一个全局的配置文件,是为系统上所有用户所公共调用的,也叫nanorc,但是在/etc中,是/etc/nanorc。这回nanorc前面没有点了。

这个全局的nano配置文件只能被root用户修改,因为是在系统文件夹/etc中。

因此,如果我们要修改这个文件,建议用sudo命令。

sudo nano /etc/nanorc

可以看到这个配置文件内容就很多了,当然也有很多是注释,也就是以#开头的。

在这个配置文件里,有所有可以放置在你自己的.nanorc中的语句。比如 set autoindent。但是这些配置语句都是以#开头,就是说默认是注释掉的,也就是说在全局说来,这些配置语句不生效。如果你在/etc/nanorc中把那些配置语句前面的#去掉,就会对全局用户生效了。

在这个/etc/nanorc文件的结尾处,你会看到有一块专门设置语法高亮(就是文本会有颜色之分)的区域,比如,有C/C++代码的语法高亮,nanorc文件的语法高亮,CSS文件的语法高亮,下面还有很多类型的文件的语法高亮。

在小编的情况,这些include前面并没有#,就是说语法高亮对所有用户都是开启的,但你的情况也许每个include语句前面有#号,表示没有开启全局的语法高亮,建议删除那个#,来开启。

按Ctrl+O来保存修改,然后Ctrl+X退出。当然,也可以直接Ctrl+X,它问你是否保存修改,输入y(表示yes,“是”)或n(表示no,“不是”)或Ctrl+C取消。

通过.bashrc配置终端

对于nano,我们有一个配置文件叫.nanorc。其实对于我们的终端,也有一个配置文件,叫做.bashrc,这是用户个人的终端配置文件。在小编的情况,位于/home/oscar/.bashrc

这个文件一般来说是默认存在的。不像我们的.nanorc可能还要自己创建。

我们打开家目录下的终端配置文件看看,只要输入以下命令:

nano ~/.bashrc

.bashrc文件比较复杂,初看可能会有点眼花缭乱的感觉。我们暂时不会深入学习它的语法,因为其实bash是一种shell。

暂时只要理解了解shell是外壳程序(shell是英语“外壳”的意思),是用于解释我们输入终端的各种命令的。

Shell是一个用户跟操作系统之间的一个命令解释器,也就是用户与Linux操作系统之间沟通的桥梁。

bash是最常用的一种shell程序,Ubuntu和大部分常见的Linux发行版默认的shell程序就是bash。

.bashrc就是bash这个shell程序的配置文件。

所以bashrc本身的语法也是bash的语法,是一种脚本语言。

不过我们来学习一下如何将命令行提示符设为高亮(就是不再是白色的了,而是彩色的)。

看到有一行是#force_color_prompt=yes了吗?
去掉#force_color_prompt=yes 最前面那个#号之后,保存退出,再启动一个新的终端,可以看到我们的命令行提示符已经高亮显示了,有颜色了,是不是感觉颜值瞬间提高了很多?嗯嗯。

创建别名

别名的英语是alias。如果我们向下查找我们的.bashrc文件,会发现有alias开头的行,如下所示:

也不难理解:

当我们在终端输入比如ll(两个小写的L),其实就是等同于 ls -alF

当我们在终端输入比如la,其实就是等同于 ls -A

等等。

所以说,别名设置得好,可以降低我们的工作量,因为输入ll总比输入ll -alF简单吧。

在.bashrc中创建别名的语法是这样的:

alias name='command'

name就是别名的名字,而command就是替换别名的实际的终端命令。

全局的bashrc

之前的nano有全局的配置文件:

/etc/nanorc

我们的终端所有的bash也有它的全局配置文件:

/etc/bash.bashrc

对于每个用户来说,家目录下的.bashrc文件的优先级比系统的/etc/bash.bashrc文件高。
例如同样的配置选项,如果.bashrc/etc/bash.bashrc不同,那么以.bashrc的为准。

profile配置文件

在我们的家目录下,其实还有一个.profile文件,而且它也有对应的全局profile文件,是

/etc/profile

profile在英语中是“外观,轮廓”的意思。那么这个profile文件和bashrc有什么区别呢?

简单来说是这样的:

profile这个配置文件是用户登录的终端的配置文件,也就是我们以前学过的tty1tty6这6个命令行终端(没有图形界面的,分别通过Ctrl+Alt+F1-F6进入)。profile是这些需要登录的,非图形界面的终端的配置文件。

bashrc这个配置文件是不用用户登录的终端,也就是我们一直在使用的终端形式,图形化的终端的情况。这种终端是读取.bashrc为配置文件的。

有一点需要记住:profile文件会调用.bashrc,所以其实我们修改了.bashrc,也就是间接修改了profile文件。因为profile文件会用profile本身的配置再加上.bashrc的配置。

在我们修改了.bashrc和profile文件后,默认是在用户下次登录系统时才能生效。但是我们可以用source命令来使改动立即生效:

source .bashrc
source .profile

软件安装

在Ubuntu下,我们也有类似的程序,但是我们不称之为“安装程序”,而称之为“软件包”,英语是Package。

一个软件包其实是软件的所有文件的压缩包,二进制形式的,包含了安装软件的所有指令。在Debian一族里,软件包的后缀是.deb(是Debian的前三个字母),Ubuntu作为Debian一族的一员,当然也是用.deb的软件包。而如果是Red Hat一族(包括Red Hat,Fedora,等),软件包是.rpm为后缀。

那么,一个.deb格式的软件包,其实是类似Windows下的.exe的安装程序咯?

确实很像,但是其实它们的运作方式不一样。我们列出主要的两个不同点:

  • 软件包管理包括了依赖关系的管理

  • 软件包不需要我们通过搜索引擎来找到并下载,几乎所有的.deb软件包都存放在相同地方,称为软件仓库,英语叫repository。

依赖关系

通常来说,很少有一个软件可以单独在Linux上运行,也就是说它不依赖于其他程序。一个软件经常需要使用到其他程序或者其他程序的片段(我们称之为库)。我们说这个软件依赖其他程序,这就是依赖关系。

比如说,Linux下类似Photoshop的软件GIMP,它不能单独运行,它的正常运作还需要调用图片读取的库(比如说如何读取一个JPG图片),往往依赖关系还有下层依赖关系,环环相扣。

当然,在Windows里面你也遇到过依赖问题,比如你运行Eclipse软件,它会说你还没安装Java环境;你运行一个大型游戏,它提示你先安装Direct X,等等。

幸运的是,Debian的包管理系统非常智能。每一个软件包都“知道”它依赖于哪几个程序。这可以让系统去寻找并安装缺失的依赖程序。

所以,你只要告诉包管理系统“我要安装某某软件”,包管理系统会为你打理一切。

软件仓库

上面我们说了,Linux的软件包都存放在一个地方,叫做软件仓库,repository。

但是你也许会问:假如全球的Linux用户都到同一个地方去下载软件,那么存放软件的那个服务器岂不是会死机?

好问题,很有道理。所以,其实软件仓库绝不只是存放在一台服务器上,全球有很多个软件仓库(也就是有很多服务器),大部分软件仓库里的软件都是一样的,只不过是拷贝而已。

有一些特别的软件仓库,会存放其他软件仓库没有的软件,但一般我们用不到这样的软件仓库。

我们一般建议用户选择离自己所在地较近的软件仓库的服务器,这样下载速度会比较快。

管理软件仓库

上面说了,用默认的官方版本没有太大坏处,但是有时候会卡。所以我们要学习如何切换软件仓库。

我们Ubuntu系统使用的软件仓库的列表是记录在一个文件中。为了修改这个文件,我们要用文本编辑器。

们要编辑的那个包含软件仓库的列表的文件是:

/etc/apt/sources.list

这个文件是系统文件,只能被root用户修改。

用nano打开此文件之后,我们看到文件内容类似如下:


上图中,由#开始的行是注释,会被忽略,不会被处理。

通常来说,这个文件中有作用的行是由以下两个指令开头:

  • deb:用于下载软件的二进制版本,大多数情况下我们都是用这个。

  • deb-src:用于下载软件的源代码。一般我们用不到,除非你很好奇想查看软件的源代码。这也是自由软件运动的一个好处。

以下是一行的例子:

deb http://fr.archive.ubuntu.com/ubuntu/ trusty universe

第一个参数 http://fr.archive.ubuntu.com/ubuntu 是法国Ubuntu官方软件仓库的服务器。

第二个参数trusty,是我们所使用的Ubuntu的版本号,trusty是Ubuntu 14.04的代号。14.04全称是 Trusty Tahr(值得信赖的塔尔羊)。

最后一个参数(或者后面还有其他参数)是软件仓库的区域,也就是你要查看的代码仓库的不同分区。

上面的概念稍微有点复杂。但其实你只要知道一件事:如果要切换其他的软件仓库,只需要将/etc/apt/sources.list这个文件中的http://fr.archive.ubuntu.com/ubuntu 这个服务器地址替换为其他软件仓库的服务器地址即可。

那么问题来了:我怎么知道其他软件仓库的服务器地址呢?

你可以用搜索引擎来寻找,比如可以搜“Ubuntu repository”。

当然也可以用图形界面来更改。

包管理工具
我们来总结一下:

package:包。这是软件的二进制安装包。类似Windows中软件的安装程序(大多以.exe结尾)。

dependency:依赖。一个软件包可能需要其他的软件包作为运行的基础。这是依赖关系。

repository:仓库。软件的仓库,就是存放软件的服务器,我们从这些服务器上下载软件。

我们上面演示了如何切换其他软件仓库,但也不一定要切换,用默认的软件仓库也是可以的。

当然了,我们也可以使用终端来管理软件包,终端的软件包管理命令一般用两个:

  • apt-get:最常用的,一般小编用这个比较多。

  • aptitude:这个命令在卸载软件时可以卸载不用的依赖。

sudo apt-get update,软件包缓存的更新

sudo apt-cache search,搜索软件包

sudo apt-get install xxx,安装软件包,xxx是对应软件包名

sudo apt-get autoremove xxx,删除软件包,xxx是对应软件包名

sudo apt-get upgrade,升级所有已安装的软件包

RTFM

Read The Fking Manual的缩写,翻成中文是“阅读那该死的手册”。

man命令,显示使用手册

man是manual的缩写,就是英语“使用手册”的意思。

man命令用法很简单,后接你想要显示使用手册的命令,函数或者其他。

此命令用于查看系统中自带的各种参考手册,但是手册分为好几个类别,如下所示:

1 可执行程序或shell命令

2 系统调用(Linux内核提供的函数)

3 库调用(程序库中的函数)

4 特殊文件(通常在/dev下)

5 文件格式和惯例(例如 /etc/passwd)

6 游戏

7 杂项(包括宏包和惯例,比如man(7),groff(7))

8 系统管理命令(通常只能被root用户使用)

9 内核子程序

在shell中输入

man+数字+命令/函数

即可以查到相关的命令和函数。若不加数字,那man命令默认从数字较小的手册中寻找相关命令和函数。

例如,本来是想寻找C语言标准库中的rand()函数,直接使用man rand得到的是一个rand命令的手册,直接用来产生一个随机数,这个内容在手册第1部分中。

如果使用man 3 rand就可以得到想要的库函数中rand()的用法了。man 3 rand

比如,我们举个例子,用man命令来显示ls命令的使用手册:

man ls

正如我们在上图中所看到的,手册页分为不同的区域。这些区域的名字是用大写和粗体表示,且靠左对齐:

  • NAME:英语“名字”的意思。手册页对应的命令或函数名字,后接简单描述。

  • SYNOPSIS: 英语“概要,大意,摘要”的意思。使用此命令的所有方法。下面我们会详述这个区域,因为此区域的内容极为关键。

  • DESCRIPTION: 英语“描述”的意思。命令的更深入的描述。这个区域也会包括所有参数及其用法。一般来说这个区域是文字最多的。

  • AUTHOR: 英语“作者”的意思。命令的作者。有时候不止一个作者。

  • REPORTING BUGS: 英语“报告故障”的意思。如果使用时遇到bug(程序的缺陷),有汇报问题的联系方式,通常是邮件。

  • COPYRIGHT: 英语“版权”的意思。版权。也就是用了什么许可证(Licence)。大多数命令都是在GPL许可证之下的开源代码。

  • SEE ALSO: 英语“另见”的意思。与此命令有关的其他命令。扩展阅读。

一般来说,前三个区域(NAME, SYNOPSIS, DESCRIPTION)是最重要的。

SYNOPSIS区域

SYNOPSIS这个区域是手册页中很重要的一个区域,但也是最难理解的区域之一。

SYNOPSIS这个区域的作用就是列出使用命令的所有可能方法。简单地说,SYNOPSIS这个区域显示了所有可能的参数组合。

有些命令的SYNOPSIS区域比较简单,但有些就很复杂了,会是一长串,看得人头大。

我们下面就用一些实际的例子来学习。

我们一点点解析此SYNOPSIS区域:

SYNOPSIS:
mkdir [OPTIONS] ... DIRECTORY ...
  • mkdir:使用mkdir命令,我们当然需要先输入mkdir,这是很好理解的。

  • [OPTION]:option是英语“选项”的意思。表示在mkdir之后,我们可以加选项参数(就是 -v,-h之类)。在SYNOPSIS区域中,中括号中的内容表示可选,所以我们并不一定要添加选项参数。

  • DIRECTORY:directory是英语“目录”的意思。就是需要用mkdir命令创建的目录。这个参数是必须的,因为并没有用中括号括起来。这也不难理解,因为mkdir命令就是用于创建目录的,那最少也要输入一个目录的名字吧。

  • ... :省略号表示可以有多个此类内容。在[OPTION]和DIRECTORY后都有省略号,分别表示可以有多个选项和多个目录名。也即是说可以同时指定多个选项参数,也可以用mkdir同时创建多个目录。

那么为什么mkdir使用粗体,而OPTION和DIRECTORY都是用下划线呢?

SYNOPSIS区域中,粗体的文字表示要原封不动地输入,下划线的文字表示要用实际的内容替换。

这也不难理解:mkdir命令肯定要原封不动地输入,而DIRECTORY就要替换成实际要创建的目录名称。

SYNOPSIS区域的语法总结

  • 粗体:原封不动地输入。

  • 下划线的部分:用实际的内容替换。

  • [-hvc]:-h,-v和-c选项都是可选的,非强制性的。

  • a|b:你可以输入a或者b选项,但是不能够同时输入a和b。

  • option...:省略号表示前面的内容可以输入任意多个。

apropos命令:查找命令

在使用man命令时,我们需要先知道我们要显示使用手册的那个命令的名字。那如果不知道那个命令叫什么怎么办呢?

这时候我们就需要请apropos命令上场了,apropos是英语“关于”的意思。

apropos命令的用法很简单,只要后接一个关键字,apropos命令就会为你在所有手册页中查找相关的命令。

我们用实际例子来学习:你想要知道如何用终端的命令来控制音量。

你可以这样查找:

apropos sound

为什么用sound这个关键字呢?因为sound是英语“声音,音量”的意思。

如上图所见,运行apropos sound之后,就列出了所有使用手册中有sound这个关键字的命令。

可以看到,左侧是命令的名字,后边是命令的手册中出现关键字的句子。

我们就知道了要调节音量可以用的命令是:

alsamixer

其他阅读手册的方式
虽说man命令和apropos命令是最常用的两个有关手册的命令,但是还有其他查阅手册的方式。

那么哪些是man的替代品呢?

-h或--help参数

虽然并不一定,但是大多数命令都接受-h这个参数(有时候它等价的参数--help也可以)。

-h参数中的h是help的首字母,help是英语“帮助”的意思。所以-h或--help参数的作用是显示帮助文档。

虽说一般帮助文档没有man命令显示的使用手册那么详细,但是也很有用,且往往比man显示的手册易于阅读。

比如我们要查看apt-get命令的帮助文档,可以这样:

apt-get -h
whatis命令

what是英语“什么”的意思,is是英语“是”的第三人称单数形式。所以连起来what is就是“是什么”的意思。

whatis命令可以说是man命令的精简版,它只会列出man命令显示的手册的开头部分,就是概述命令的作用。

例如用whatis命令来查看ls命令的作用。

whatis ls

查找文件

locate命令,快速查找

第一种查找文件的方法可以说是很简单的。用到的命令是locate。

locate是英语“定位”的意思。这个命令用于定位要查找的文件,而且此命令很快。

locate命令的用法也很直观,后接需要查找的文件名(当然也可以用正则表达式)。

例如我们来查找一个叫做 renamed_file的文件:

locate renamed_file

可以看到locate命令帮我们找到了renamed_file文件,位于 /home/oscar/linux_c目录下。



我们再来用locate查找france文件。

我们运行locate france后,终端列出了所有包含france的文件和目录。


所以locate命令是搜索包含关键字的所有文件和目录。

在使用locate命令查找文件时,大家可能会遇到这样的问题:我刚创建的文件,为什么用locate命令查找不到呢?

这正好是locate命令的缺陷,我正要说到:locate命令不会对你实际的整个硬盘进行查找,而是在文件的数据库里查找记录。

locate命令的原理如下图所示:


对于刚创建不久的文件,因为它们还没被收录进文件数据库,因此locate命令就找不到其索引,自然就不会返回任何结果。

Linux系统一般每天会更新一次文件数据库。因此,只要你隔24小时再用locate查找,应该就能找到你刚创建的文件了。

我们可以用updatedb命令强制系统立即更新文件数据库。但是updatedb命令只能由root用户执行。

因此我们可以这样:

sudo updatedb

这个命令执行需要一点时间,小编执行的时候等了几分钟才完毕。

一旦执行成功,你再用locate查找你刚才创建的文件,就可以找到了。

总结一下:locate命令方便快捷,易于使用。但缺点也很明显:

  • locate命令会列出所有在文件数据库中找到的内容,有时候结果太多了,太繁杂。

  • locate命令不能找到一天之内刚创建的文件,除非你先用root身份运行updatedb命令来更新文件数据库。

当locate命令不够用时,我们需要一个更强大的命令,它就是find命令。

find命令,深入查找

find命令是查找文件的利器,而且它可以让我们对每个找到的文件做后续的操作。find命令非常强大,可以做很多事情,因此也比较复杂。

find命令可以说是Linux中最常用的命令之一了。所以,一起来探秘吧。

与locate命令不同,find命令不会在文件数据库中查找文件的记录,而是遍历你的实际硬盘。

所以,如果你的硬盘容量很大的话,那find命令会查找比较久。

find命令的这种“耿直”的查找方式保证了我们不会遗漏一天之内创建的文件。但这绝对不是find的唯一强大之处,远远不是。

find命令的用法是这样的:

find 《何处》《何物》《做什么》

这几个参数中,只有《何物》是必须指定的,也就是要查找什么。

  • 何处:指定在哪个目录中查找。此目录的所有子目录也会被查找。与locate命令的查找所有文件数据库的所有记录不同,find命令可以限定查找目录,比如我们可以只让find查找/home目录。默认地,假如我们没有给出《何处》这个参数,那么find命令会在当前目录及其子目录中查找。

  • 何物:也就是要查找什么。我们可以根据文件的名字来查找,也可以根据其大小来查找,也可以根据其最近访问时间来查找,等等。这个参数是必须的。

  • 做什么:用find命令找到我们要的文件后,可以对每个文件做一定的操作,称为“后续处理”。默认地,假如不指定这个参数,那么find命令只会显示找到的文件,不会做其他事情。

find命令的基础用法

根据文件名查找

我们首先来学习最基本的查找:用文件名来查找。

首先,我们定位到用户的家目录中(对于小编来说是/home/oscar),然后我要在当前目录及其子目录中查找france1.jpg这个文件。

find -name "france1.jpg"

这里,我们用-name参数指定了文件名字,是france1.jpg,用双引号括起来。不加双引号或者用单引号也是可以的。

经过了一点时间,查找才停止,因为find命令会遍历指定的所有目录。

最终,find命令找到了france1.jpg这个文件,位于/home/oscar/Photos目录下。

如果find命令没有结果显示,那么表示此文件不存在。

因为我们没有指定《何处》这个参数,所以find命令就会在当前目录(~,也就是用户的家目录中,/home/oscar)及其子目录中查找。

假如,现在我位于我的家目录中,我却想在其他目录中进行查找,怎么办呢?

那就须要指定《何处》这个参数了。

例如,我要在/var/log目录下查找名为syslog的文件,我应该这么输入:

find /var/log -name "syslog"

我们注意到了:与locate命令不同的是,find命令只会查找完全符合《何物》的字符串表示的文件。locate会查找所有包含关键字的文件。比如,如果要用find来找thing这个文件,那么只会找到名字就是thing的文件;而locate命令会查找到比如thing,thing1,onething,twothings这样的文件。

因此,我们用find查找syslog文件时,就不会查找到syslog2这样的文件。

不过我们可以用我们之前学过的通配符:*(星号)来实现匹配多个名称。

例如,我要查找所有以syslog这个关键字开头的文件,可以这样来实现:

find /var/log -name "syslog*"

根据文件大小查找

如果你不知道你要找的文件的名称,那怎么办呢?

不要担心,还有其他方式来查找文件的。

我们先来看如何根据文件大小查找。

例如,我们可以查找/var中大小超过10M的文件(当然你要以root身份):

find /var -size +10M

这次,我们使用了-size参数,来指定查找文件的大小。size是英语“尺寸,大小”的意思。

后面紧跟的+10M表示大于10兆字节。

M是兆,也就是10的6次方;平时我们所说的Ko,Mo,Go其实分别是千字节,兆字节,千兆字节的意思。

如果我们要查找小于指定大小的文件,可以用减号。例如:

# 表示查找小于50Ko的文件。
find /var -size -50K

# 表示查找大于20Go的文件。
find /var -size +20G

如果没有加减号,则查找大小等于指定数值的文件。

根据文件的最近访问时间查找

如果你记得你近7天里在家目录中访问过JPG格式的图片,但是你忘记它们的名字了,如何查找呢?

可以使用-atime参数。atime是access和time的缩写。
可以这样查找:

find -name "*.jpg" -atime -7

-atime参数后面紧跟的-7表示7天之内,减号的作用是表示小于。

仅查找目录或文件

我们可以指定查找的文件类型,我们知道Linux中文件的类型大致分为两种:目录和文件。

因此,我们可以用-type参数来指定查找的文件类型。type是英语“类型”的意思。

  • -type d:只查找目录类型。d是directory的首字母,表示“目录”。

  • -type f:只查找文件类型。f是file的首字母,表示“文件”。

如果不用-type参数指定类型,那么find命令默认是查找目录和文件的。比如说,有syslog这个文件,和syslog这个目录,那么find会把他们都查找出来。

用法如下:

find /var/log -name "mysql" -type d

可以看到只查找到了mysql这个目录。

find命令的高级用法:操作查找结果

到目前为止,我们只是使用了find的基本功能。我们并没有指定《做什么》这个参数,也就是还没对查找到的结果做任何操作。

当然了,默认地,find命令会显示每个查找到的文件。

事实上,

find -name "*.jpg"

等价于

find -name "*.jpg" -print

-print参数用于打印结果。

格式化打印查找结果

默认地,find命令只列出查找到的文件,但是我们可以将其用格式化的方式打印出来。

我们可以使用-printf参数。是不是想起了C语言中的printf函数?是的,printf是print formatted的缩写,表示“格式化打印”。

例如,我们可以这样打印查找到的内容:

find ~/Photos -name "*.jpg" -printf "%p - %u\n"

我们在-printf参数后面写了"%p - %u\n",这个格式字符串的意思如下:

  • %p:文件名。

  • -:就是一个短横。

  • %u:文件的所有者,这里是小编的用户名,所以是oscar。

  • \n:用于换行。

可以看到,用法和C语言的printf函数很类似。

删除查找到的文件

假如我要删除查找到的文件,我可以用-delete参数。用法很简单:

find -name "*.jpg" -delete

将会删除当前目录及其子目录下所有以.jpg为后缀的文件。而且不会有确认提示。所以慎用-delete参数。

调用命令

使用-exec参数,可以后接一个命令,对每个查找到的文件进行操作。

exec是execute的缩写。

假设我想要将当前目录下所有查找到的JPG文件的访问权限都改为600,那么我们可以这样做:

find -name "*.jpg" -exec chmod 600 {} \;

就是说对于每个找到的.jpg结尾的文件,都进行-exec参数指定的操作:

这个操作不必用双引号括起来。

  • {} 会用查找到的每个文件来替换。

  • ; 是必须的结尾。

虽然-exec参数一开始有点看不懂其用法,但是慢慢地你会发现,这个参数太强大了,你可以对查找到的文件做任何你想要的操作。

如果你对于没有确认提示不太放心,你可以将-exec参数换成-ok参数,用法一样,只不过-ok参数会对每一个查找到的文件都做确认提示,输入y加回车表示对此文件进行此操作;输入n加回车表示对此文件不进行此操作。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容