我们先了解一下Linux中用户是如何组织的,然后再来学习如何变身为超级用户。
在Linux中,理论上说来,我们可以创建无数个用户。但是这些用户是被划分到不同的群组里面的。
有一个用户,名叫root,是一个很特殊的用户。字大管家,号超级用户。因为在Linux系统中,它可以做任何事情。
sudo命令:以root身份运行命令
sudo是英语Substitute User DO的缩写,substitute是“替换,代替,替身”的意思,user是“用户”的意思,do就是“做”的意思。所以连在一起就是“替换用户来执行...”的意思。
因此,如果我们要运行只有root才可以运行的命令,那么可以在此命令前面加上sudo命令,如下:
sudo su命令:一直成为root,当我们身为root时,只要运行exit命令,就随时可以回到个人用户。
在Ubuntu以外的其他Linux发行版,也许切换到root账户,不是用sudo su,而是只需要su就可以了。当然我们比较建议再加一个横线,用
这样不仅能切换为root,还可以直接定位到root的家目录。而且可以直接使用root才能用的那些命令。
我们就可以来学习一些只有root用户才能运行的命令了。
adduser命令:添加新用户
passwd命令:修改密码
如果之后你对设定的密码不满意,那么可以用passwd命令来修改当前密码。
用法也类似adduser,只要在其后加上需要修改密码的那个用户名,例如:
运行deluser thomas这个命令,终端不会提示你确认是否删除,而是直接删除了用户thomas。
所以,deluser这个命令还是要谨慎使用。单单用deluser命令,不加参数的话,只会删除用户,但是不会删除在/home目录中的用户家目录。如果你想要连此用户的家目录也一并删除,可以加上--remove-home
这个参数,如下:
这样,不仅删除了thomas这个用户,连/home/thomas这个目录也会删除。其他的LInux发行版,一般来说,添加用户和删除用户是用useradd
和userdel
命令。
把用户分在不同的群组,到底有何意义呢?
在用户不多的时候,我们会觉得一个用户属于一个群组(比如默认是与用户名相同的群组名)是挺不错的。但是一旦用户一多,你可能就想要创建群组了。
usermod命令:修改用户账户
usermod命令有好多参数,可以实现不同的功能。不过我们暂时只需要记得它的两个参数:
-
-l:对用户重命名,但是/home目录中的用户家目录名不会改变,需要手动修改。
-
-g:修改用户所在群组
用法很简单,假如我要将thomas这个用户放到我刚创建的friends这个群组里,可以这样写:
我们怎么知道用户thomas的群组已经改变为friends了呢?
我们可以用groups
命令,这个命令可以获知一个用户属于哪个(些)群组。
用法很简单,后接用户名就可以了,当然用户要存在才行。
当然我们也可以一次将一个用户添加到多个群组,就用 -G 参数(大写的G)。用法如下:
以上命令把thomas添加到friends,happy和funny三个群组。记得群组名之间要用逗号分隔,而且没有空格。
注意:使用usermod时要小心,因为配合-g或-G参数时,它会把用户从原先的群组里剔除,加入到新的群组。如果你不想离开原先的群组,又想加入新的群组,可以在-G参数的基础上加上-a参数,a是英语append的缩写,表示“追加”。例如:
注意:groups命令如果单独用,不加任何参数,会显示当前用户所在群组。
记得,追加群组的时候,一定要用大写的G这个参数,不能用小写的g这个参数,即使只追加一个群组。
其他的LInux发行版,一般来说,添加用户和删除用户是用groupadd
和groupdel
命令。
修改文件的所有者和群组
只有root用户可以修改一个文件的所有者和群组。
chown命令:改变文件的所有者
用法也很简单,后接新的所有者的用户名,再接文件名。例如:
第一个参数 /ubuntu
是法国Ubuntu官方软件仓库的服务器。
第二个参数trusty,是我们所使用的Ubuntu的版本号,trusty是Ubuntu /ubuntu 这个服务器地址替换为其他软件仓库的服务器地址即可。
那么问题来了:我怎么知道其他软件仓库的服务器地址呢?
你可以用搜索引擎来寻找,比如可以搜“Ubuntu repository”。
当然也可以用图形界面来更改。
package:包。这是软件的二进制安装包。类似Windows中软件的安装程序(大多以.exe结尾)。
dependency:依赖。一个软件包可能需要其他的软件包作为运行的基础。这是依赖关系。
repository:仓库。软件的仓库,就是存放软件的服务器,我们从这些服务器上下载软件。
我们上面演示了如何切换其他软件仓库,但也不一定要切换,用默认的软件仓库也是可以的。
当然了,我们也可以使用终端来管理软件包,终端的软件包管理命令一般用两个:
-
apt-get:最常用的,一般小编用这个比较多。
-
aptitude:这个命令在卸载软件时可以卸载不用的依赖。
man命令,显示使用手册
man是manual的缩写,就是英语“使用手册”的意思。
man命令用法很简单,后接你想要显示使用手册的命令,函数或者其他。
此命令用于查看系统中自带的各种参考手册,但是手册分为好几个类别,如下所示:
1 可执行程序或shell命令
2 系统调用(Linux内核提供的函数)
3 库调用(程序库中的函数)
4 特殊文件(通常在/dev下)
8 系统管理命令(通常只能被root用户使用)
即可以查到相关的命令和函数。若不加数字,那man命令默认从数字较小的手册中寻找相关命令和函数。
例如,本来是想寻找C语言标准库中的rand()函数,直接使用man rand得到的是一个rand命令的手册,直接用来产生一个随机数,这个内容在手册第1部分中。
比如,我们举个例子,用man命令来显示ls命令的使用手册:
正如我们在上图中所看到的,手册页分为不同的区域。这些区域的名字是用大写和粗体表示,且靠左对齐:
-
NAME:英语“名字”的意思。手册页对应的命令或函数名字,后接简单描述。
-
SYNOPSIS: 英语“概要,大意,摘要”的意思。使用此命令的所有方法。下面我们会详述这个区域,因为此区域的内容极为关键。
-
DESCRIPTION: 英语“描述”的意思。命令的更深入的描述。这个区域也会包括所有参数及其用法。一般来说这个区域是文字最多的。
-
AUTHOR: 英语“作者”的意思。命令的作者。有时候不止一个作者。
-
REPORTING BUGS: 英语“报告故障”的意思。如果使用时遇到bug(程序的缺陷),有汇报问题的联系方式,通常是邮件。
-
COPYRIGHT: 英语“版权”的意思。版权。也就是用了什么许可证(Licence)。大多数命令都是在GPL许可证之下的开源代码。
-
SEE ALSO: 英语“另见”的意思。与此命令有关的其他命令。扩展阅读。
SYNOPSIS这个区域是手册页中很重要的一个区域,但也是最难理解的区域之一。
SYNOPSIS这个区域的作用就是列出使用命令的所有可能方法。简单地说,SYNOPSIS这个区域显示了所有可能的参数组合。
有些命令的SYNOPSIS区域比较简单,但有些就很复杂了,会是一长串,看得人头大。
我们下面就用一些实际的例子来学习。
我们一点点解析此SYNOPSIS区域:
-
mkdir:使用mkdir命令,我们当然需要先输入mkdir,这是很好理解的。
-
[OPTION]:option是英语“选项”的意思。表示在mkdir之后,我们可以加选项参数(就是 -v,-h之类)。在SYNOPSIS区域中,中括号中的内容表示可选,所以我们并不一定要添加选项参数。
-
DIRECTORY:directory是英语“目录”的意思。就是需要用mkdir命令创建的目录。这个参数是必须的,因为并没有用中括号括起来。这也不难理解,因为mkdir命令就是用于创建目录的,那最少也要输入一个目录的名字吧。
-
... :省略号表示可以有多个此类内容。在[OPTION]和DIRECTORY后都有省略号,分别表示可以有多个选项和多个目录名。也即是说可以同时指定多个选项参数,也可以用mkdir同时创建多个目录。
SYNOPSIS区域中,粗体的文字表示要原封不动地输入,下划线的文字表示要用实际的内容替换。
这也不难理解:mkdir命令肯定要原封不动地输入,而DIRECTORY就要替换成实际要创建的目录名称。
-
粗体:原封不动地输入。
-
下划线的部分:用实际的内容替换。
-
[-hvc]:-h,-v和-c选项都是可选的,非强制性的。
-
a|b:你可以输入a或者b选项,但是不能够同时输入a和b。
-
option...:省略号表示前面的内容可以输入任意多个。
在使用man命令时,我们需要先知道我们要显示使用手册的那个命令的名字。那如果不知道那个命令叫什么怎么办呢?
这时候我们就需要请apropos命令上场了,apropos是英语“关于”的意思。
apropos命令的用法很简单,只要后接一个关键字,apropos命令就会为你在所有手册页中查找相关的命令。
我们用实际例子来学习:你想要知道如何用终端的命令来控制音量。
为什么用sound这个关键字呢?因为sound是英语“声音,音量”的意思。
如上图所见,运行apropos sound之后,就列出了所有使用手册中有sound这个关键字的命令。
可以看到,左侧是命令的名字,后边是命令的手册中出现关键字的句子。
我们就知道了要调节音量可以用的命令是:
虽说man命令和apropos命令是最常用的两个有关手册的命令,但是还有其他查阅手册的方式。
那么哪些是man的替代品呢?
虽然并不一定,但是大多数命令都接受-h这个参数(有时候它等价的参数--help也可以)。
-h参数中的h是help的首字母,help是英语“帮助”的意思。所以-h或--help参数的作用是显示帮助文档。
虽说一般帮助文档没有man命令显示的使用手册那么详细,但是也很有用,且往往比man显示的手册易于阅读。
比如我们要查看apt-get命令的帮助文档,可以这样:
what是英语“什么”的意思,is是英语“是”的第三人称单数形式。所以连起来what is就是“是什么”的意思。
whatis命令可以说是man命令的精简版,它只会列出man命令显示的手册的开头部分,就是概述命令的作用。
例如用whatis命令来查看ls命令的作用。
locate命令,快速查找
第一种查找文件的方法可以说是很简单的。用到的命令是locate。
locate是英语“定位”的意思。这个命令用于定位要查找的文件,而且此命令很快。
locate命令的用法也很直观,后接需要查找的文件名(当然也可以用正则表达式)。
例如我们来查找一个叫做 renamed_file的文件:
我们运行locate france后,终端列出了所有包含france的文件和目录。
所以locate命令是搜索包含关键字的所有文件和目录。
在使用locate命令查找文件时,大家可能会遇到这样的问题:我刚创建的文件,为什么用locate命令查找不到呢?
这正好是locate命令的缺陷,我正要说到:locate命令不会对你实际的整个硬盘进行查找,而是在文件的数据库里查找记录。
locate命令的原理如下图所示:
对于刚创建不久的文件,因为它们还没被收录进文件数据库,因此locate命令就找不到其索引,自然就不会返回任何结果。
Linux系统一般每天会更新一次文件数据库。因此,只要你隔24小时再用locate查找,应该就能找到你刚创建的文件了。
我们可以用updatedb命令强制系统立即更新文件数据库。但是updatedb命令只能由root用户执行。
这个命令执行需要一点时间,小编执行的时候等了几分钟才完毕。
一旦执行成功,你再用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这个文件。
这里,我们用-name参数指定了文件名字,是france1.jpg,用双引号括起来。不加双引号或者用单引号也是可以的。
经过了一点时间,查找才停止,因为find命令会遍历指定的所有目录。
如果find命令没有结果显示,那么表示此文件不存在。
因为我们没有指定《何处》这个参数,所以find命令就会在当前目录(~,也就是用户的家目录中,/home/oscar
)及其子目录中查找。
假如,现在我位于我的家目录中,我却想在其他目录中进行查找,怎么办呢?
那就须要指定《何处》这个参数了。
例如,我要在/var/log目录下查找名为syslog的文件,我应该这么输入:
我们注意到了:与locate命令不同的是,find命令只会查找完全符合《何物》的字符串表示的文件。locate会查找所有包含关键字的文件。比如,如果要用find来找thing这个文件,那么只会找到名字就是thing的文件;而locate命令会查找到比如thing,thing1,onething,twothings这样的文件。
因此,我们用find查找syslog文件时,就不会查找到syslog2这样的文件。
不过我们可以用我们之前学过的通配符:*(星号)来实现匹配多个名称。
例如,我要查找所有以syslog这个关键字开头的文件,可以这样来实现:
如果你不知道你要找的文件的名称,那怎么办呢?
不要担心,还有其他方式来查找文件的。
我们先来看如何根据文件大小查找。
例如,我们可以查找/var中大小超过10M的文件(当然你要以root身份):
这次,我们使用了-size参数,来指定查找文件的大小。size是英语“尺寸,大小”的意思。
后面紧跟的+10M表示大于10兆字节。
M是兆,也就是10的6次方;平时我们所说的Ko,Mo,Go其实分别是千字节,兆字节,千兆字节的意思。
如果我们要查找小于指定大小的文件,可以用减号。例如:
# 表示查找小于50Ko的文件。
# 表示查找大于20Go的文件。
如果没有加减号,则查找大小等于指定数值的文件。
根据文件的最近访问时间查找
如果你记得你近7天里在家目录中访问过JPG格式的图片,但是你忘记它们的名字了,如何查找呢?
-atime参数后面紧跟的-7表示7天之内,减号的作用是表示小于。
我们可以指定查找的文件类型,我们知道Linux中文件的类型大致分为两种:目录和文件。
因此,我们可以用-type参数来指定查找的文件类型。type是英语“类型”的意思。
-
-type d:只查找目录类型。d是directory的首字母,表示“目录”。
-
-type f:只查找文件类型。f是file的首字母,表示“文件”。
如果不用-type参数指定类型,那么find命令默认是查找目录和文件的。比如说,有syslog这个文件,和syslog这个目录,那么find会把他们都查找出来。
可以看到只查找到了mysql这个目录。
find命令的高级用法:操作查找结果
到目前为止,我们只是使用了find的基本功能。我们并没有指定《做什么》这个参数,也就是还没对查找到的结果做任何操作。
当然了,默认地,find命令会显示每个查找到的文件。
-print参数用于打印结果。
默认地,find命令只列出查找到的文件,但是我们可以将其用格式化的方式打印出来。
我们可以使用-printf参数。是不是想起了C语言中的printf函数?是的,printf是print formatted的缩写,表示“格式化打印”。
例如,我们可以这样打印查找到的内容:
我们在-printf参数后面写了"%p - %u\n",这个格式字符串的意思如下:
-
%u:文件的所有者,这里是小编的用户名,所以是oscar。
可以看到,用法和C语言的printf函数很类似。
假如我要删除查找到的文件,我可以用-delete参数。用法很简单:
将会删除当前目录及其子目录下所有以.jpg为后缀的文件。而且不会有确认提示。所以慎用-delete参数。
使用-exec参数,可以后接一个命令,对每个查找到的文件进行操作。
假设我想要将当前目录下所有查找到的JPG文件的访问权限都改为600,那么我们可以这样做:
就是说对于每个找到的.jpg结尾的文件,都进行-exec参数指定的操作:
这个操作不必用双引号括起来。
-
{} 会用查找到的每个文件来替换。
虽然-exec参数一开始有点看不懂其用法,但是慢慢地你会发现,这个参数太强大了,你可以对查找到的文件做任何你想要的操作。
如果你对于没有确认提示不太放心,你可以将-exec参数换成-ok参数,用法一样,只不过-ok参数会对每一个查找到的文件都做确认提示,输入y加回车表示对此文件进行此操作;输入n加回车表示对此文件不进行此操作。