美文网首页我爱编程
Linux 从 0 到 1(二) - 权限,用户及群组管理,Na

Linux 从 0 到 1(二) - 权限,用户及群组管理,Na

作者: Zoulf | 来源:发表于2018-03-16 10:53 被阅读0次

    用户和权限

    我们先了解一下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加回车表示对此文件不进行此操作。

    相关文章

      网友评论

        本文标题:Linux 从 0 到 1(二) - 权限,用户及群组管理,Na

        本文链接:https://www.haomeiwen.com/subject/nyhlqftx.html