用户和权限
我们先了解一下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发行版,一般来说,添加用户和删除用户是用useradd
和userdel
命令。
群组管理的命令
把用户分在不同的群组,到底有何意义呢?
在用户不多的时候,我们会觉得一个用户属于一个群组(比如默认是与用户名相同的群组名)是挺不错的。但是一旦用户一多,你可能就想要创建群组了。
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发行版,一般来说,添加用户和删除用户是用groupadd
和groupdel
命令。
修改文件的所有者和群组
只有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加回车表示对此文件不进行此操作。
网友评论