对服务器来讲,图形界面会占用更多的系统资源,而且会安装更多的服务、开放更多的端口,这对服务器的稳定性和安全性都有负面影响。其实,服务器是一个连显示器都没有的家伙,要图形界面干什么?说到这里,有很多人会很崩溃。但是,大家要理解,对服务器来讲,稳定性、可靠性、安全性才是最主要的。而简单易用不是服务器需要考虑的事情,所以学习Linux,这些枯燥的命令是必须学习和记忆的内容。
登录系统后,第一眼看到的内容是:
[root@localhost ~]$
这就是Linux系统的命令提示符。那么,这个提示符的含义是什么呢?
家目录是什么?Linux系统是纯字符界面,用户登录后,要有一个初始登录的位置,这个初始登录位置就称为用户的家。
用户在自己的家目录中拥有完整权限,所以我们也建议操作实验可以放在家目录中进行。我们切换一下用户所在目录,看看有什么效果。
[root@localhost ~]cd /usr/local/
[root@localhost local]
仔细看,如果切换用户所在目录,那么命令提示符中的“~”会变成用户当前所在目录的最后一个目录(不显示完整的所在目录/usr/local/,只显示最后一个目录local)。
接下来看看Linux命令的基本格式:
[root@localhost ~]# 命令 [选项] [参数]
命令格式中的[]代表可选项,也就是有些命令可以不写选项或参数,也能执行。那么,我们就用Linux中最常见的ls命令来解释一下命令的格式。如果按照命令的分类,那么ls命令应该属于目录操作命令。
[root@localhost ~] ls
anaconda-ks.cfg install.log install.log.syslog
ls命令之后不加选项和参数也能执行,不过只能执行最基本的功能,即显示当前目录下的文件名。那么加入一个选项,会出现什么结果?
[root@localhost ~] ls -l
总用量 44
-rw-------. 1 root root 1207 1月 14 18:18 anaconda-ks.cfg
-rw-r--r--. 1 root root 24772 1月 14 18:17 install.log
-rw-r--r--. 1 root root 7690 1月 14 18:17 install.log.syslog
如果加一个“-l”选项,则可以看到显示的内容明显增多了。“-l”是长格式(long list)的意思,也就是显示文件的详细信息。至于“-l”选项的具体含义,我们稍后再详细讲解。可以看到选项的作用是调整命令功能。如果没有选项,那么命令只能执行最基本的功能;而一旦有选项,则可以显示更加丰富的数据。
Linux的选项又分为短格式选项(-l)和长格式选项(–all)。短格式选项是英文的简写,一般用一个减号调用,例如:
[root@localhost ~] ls -l
而长格式选项是英文完整单词,一般用两个减号调用,例如:
[root@localhost ~] ls --all
一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如ls命令的短格式选项-l就没有对应的长格式选项。所以具体的命令选项可以通过帮助命令来进行查询。
参数是命令的操作对象,一般文件、目录、用户和进程等可以作为参数被命令操作。例如:
[root@localhost ~] ls -l anaconda-ks.cfg
-rw-------. 1 root root 1207 1月 14 18:18 anaconda-ks.cfg
但是为什么一开始ls命令可以省略参数?那是因为有默认参数。命令一般都需要加入参数,用于指定命令操作的对象是谁。如果可以省略参数,则一般都有默认参数。例如:
[root@localhost ~] ls
anaconda-ks.cfg install.log install.log.syslog
这个ls命令后面没有指定参数,默认参数是当前所在位置,所以会显示当前目录下的文件名。
总结一下:命令的选项用于调整命令功能,而命令的参数是这个命令的操作对象。
我们先来学习最为常用的和目录相关的操作命令。
ls是最常见的目录操作命令,主要作用是显示目录下的内容。这个命令的基本信息如下:
对命令的基本信息进行说明:英文原意有助于理解和记忆命令;执行权限是命令只能被超级用户执行,还是可以被所有用户执行;功能描述指的是这个命令的基本作用。
[root@localhost ~]#ls [选项] [文件名或目录名]
选项:
-a: 显示所有文件
--color=when: 支持颜色输出,when的值默认是always(总显示颜色),也可以是
never(从不显示颜色)和auto(自动)
-d: 显示目录信息,而不是目录下的文件
-h: 人性化显示,按照我们习惯的单位显示文件大小
-i: 显示文件的i节点号
-l: 长格式显示
学习命令,主要学习的是命令选项,但是每个命令的选项非常多,比如ls命令就支持五六十个选项,我们不可能讲解每个选项,也没必要讲解每个选项,只能讲解最为常用的选项,即可满足我们日常操作使用。
例子1:“-a”选项,-a选项中的a是all的意思,也就是显示隐藏文件。例如:
[root@localhost ~] ls
anaconda-ks.cfg install.log install.log.syslog
[root@localhost ~] ls -a
. anaconda-ks.cfg .bash_logout .bashrc install.log .mysql_history .viminfo
.. .bash_history .bash_profile .cshrc install.log.syslog .tcshrc
可以看到,加入“-a”选项后,显示出来的文件明显变多了。而多出来的这些文件都有一个共同的特性,就是以“.”开头。在Linux中以“.”开头的文件是隐藏文件,只有通过“-a”选项才能查看。
说到隐藏文件的查看方式,曾经有学生问超哥:“为什么在Linux中查看隐藏文件这么简单?这样的话隐藏文件还有什么意义?”其实,他理解错了隐藏文件的含义。隐藏文件不是为了把文件藏起来不让其他用户找到,而是为了告诉用户这些文件都是重要的系统文件,如非必要,不要乱动!所以,不论是Linux还是Windows都可以非常简单地查看隐藏文件,只是在Windows中绝大多数的病毒和木马都会把自己变成隐藏文件,给用户带来了错觉,以为隐藏文件是为了不让用户发现。
例子2:“-l”选项
[root@localhost ~] ls -l
总用量 44
-rw-------. 1 root root 1207 1月 14 18:18 anaconda-ks.cfg
-rw-r--r--. 1 root root 24772 1月 14 18:17 install.log
-rw-r--r--. 1 root root 7690 1月 14 18:17 install.log.syslog
#权限 引用计数所有者所属组大小文件修改时间 文件名
我们已经知道“-l”选项用于显示文件的详细信息,那么“-l”选项显示的这7列分别是什么含义?
例子3:“-d”选项,如果我们想查看某个目录的详细信息,例如:
[root@localhost ~] ls -l /root/
总用量 44
-rw-------. 1 root root 1207 1月 14 18:18 anaconda-ks.cfg
-rw-r--r--. 1 root root 24772 1月 14 18:17 install.log
-rw-r--r--. 1 root root 7690 1月 14 18:17 install.log.syslog
这个命令会显示目录下的内容,而不会显示这个目录本身的详细信息。如果想显示目录本身的信息,就必须加入“-d”选项。
[root@localhost ~] ls -ld /root/
dr-xr-x---. 2 root root 4096 1月 20 12:30 /root/
例子4:“-h”选项,“ls -l”显示的文件大小是字节,但是我们更加习惯的是千字节用KB显示,兆字节用MB显示,而“-h”选项就是按照人们习惯的单位显示文件大小的,例如:
[root@localhost ~] ls -lh
总用量 44K
-rw-------. 1 root root1.2K 1月 14 18:18 anaconda-ks.cfg
-rw-r--r--. 1 root root25K 1月 14 18:17 install.log
-rw-r--r--. 1 root root7.6K 1月 14 18:17 install.log.syslog
例子5:“-i”选项,每个文件都有一个被称作inode(i节点)的隐藏属性,可以看成系统搜索这个文件的ID,而“-i”选项就是用来查看文件的inode号的,例如:
[root@localhost ~] ls -i
262418 anaconda-ks.cfg 262147 install.log 262148 install.log.syslog
从理论上来说,每个文件的inode号都是不一样的,当然也有例外(如硬链接)。
cd是切换所在目录的命令,这个命令的基本信息如下:
Linux的命令按照来源方式分为两种:Shell内置命令和外部命令。所谓Shell内置命令,就是Shell自带的命令,这些命令是没有执行文件的;而外部命令就是由程序员单独开发的,是外来命令,所以会有命令的执行文件。Linux中的绝大多数命令是外部命令,而cd命令是一个典型的Shell内置命令,所以cd命令没有执行文件所在路径。
[root@localhost ~]cd [目录名]
cd命令是一个非常简单的命令,仅有的两个选项-P和-L的作用非常有限,很少使用。-P (大写)是指如果切换的目录是软链接目录,则进入其原始的物理目录,而不是进入软链接目录;-L(大写)是指如果切换的目录是软链接目录,则直接进入软链接目录。
例子1:基本用法,cd命令切换目录只需在命令后加目录名称即可。例如:
[root@localhost ~]cd /usr/local/src/
[root@localhost src]
#进入/usr/local/src/目录
通过命令提示符,我们可以确定当前所在目录已经切换。
例子2:简化用法,cd命令可以识别一些特殊符号,用于快速切换所在目录,这些符号如下表所示:
这些简化用法以加快命令切换,我们来试试。
[root@localhost src] cd ~
[root@localhost ~]
“cd ~”命令可以快速回到用户的家目录,cd命令直接按回车键也是快速切换到家目录。
[root@localhost ~]cd /etc/
[root@localhost etc] cd
[root@localhost ~]
#直接使用cd命令,也回到了家目录
再试试“cd -”命令。
[root@localhost ~] cd /usr/local/src/
#进入/usr/local/src/目录
[root@localhost src]cd -
/root
[root@localhost ~]
#“cd –”命令回到进入src目录之前的家目录
[root@localhost ~] cd -
/usr/local/src
[root@localhost src]
#再执行一遍“cd –”命令,又回到了/usr/local/src/目录
再来试试“.”和“…”。
[root@localhost ~] cd /usr/local/src/
#进入测试目录
[root@localhost src] cd ..
#进入上级目录
[root@localhost local] pwd
/usr/local
#pwd是查看当前所在目录的命令,可以看到我们进入了上级目录/usr/local/
[root@localhost local] cd .
#进入当前目录
[root@localhost local] pwd
/usr/local
#这个命令不会有目录的改变,只是告诉大家“.”代表当前目录
Linux的路径中是有绝对路径的,那是因为Linux有最高目录,也就是根目录。如果路径是从根目录开始,一级一级指定的,那使用的就是绝对路径。例如:
[root@localhost ~] cd /usr/local/src/
[root@localhost src] cd /etc/rc.d/init.d/
这些切换目录的方法使用的就是绝对路径。
所谓相对路径,就是只从当前所在目录开始,切换目录。例如:
[root@localhost /] cd etc/
#当前所在路径是/目录,而/目录下有etc目录,所以可以切换
[root@localhost etc] cd etc/
-bash: cd: etc/: 没有那个文件或目录
#而同样的命令,由于当前所在目录改变了,所以就算是同一个命令也会报错,除非在/etc/目录中还有一
个etc目录
所以,虽然绝对路径输入更加烦琐,但是更准确,报错的可能性也更小。
再举个例子,假设我当前在root用户的家目录中:
[root@localhost ~]
那么,该如何使用相对路径进入/usr/local/src/目录中呢?
[root@localhost ~]cd ../usr/local/src/
从我当前所在路径算起,加入“…”代表进入上一级目录,而上一级目录是根目录,而根目录中有usr目录,就会一级一级地进入src目录了。
mkdir是创建目录的命令,其基本信息如下:
[root@localhost ~]mkdir [选项] 目录名
选项:
-p: 递归建立所需目录
mkdir也是一个非常简单的命令,其主要作用就是新建一个空目录。
例子1:建立目录:
[root@localhost ~]mkdir cangls
[root@localhost ~]ls
anaconda-ks.cfg cangls install.log install.log.syslog
我们建立一个名为cangls的目录,通过ls命令可以查看到这个目录已经建立。注意:我们在建立目录的时候使用的是相对路径,所以这个目录被建立到当前目录下。
例子2:递归建立目录:
如果想建立一串空目录,可以吗?
[root@localhost ~]mkdir lm/movie/jp/cangls
mkdir: 无法创建目录"lm/movie/jp/cangls": 没有那个文件或目录
李明老师想建立一个保存电影的目录,结果这条命令报错,没有正确执行。这是因为这4个目录都是不存在的,mkdir默认只能在已经存在的目录中建立新目录。而如果需要建立一系列的新目录,则需要加入“-p”选项,递归建立才可以。例如:
[root@localhost ~]mkdir -p lm/movie/jp/cangls
[root@localhost ~]ls
anaconda-ks.cfg cangls install.log install.log.syslog lm
[root@localhost ~]ls lm/
movie
#这里只查看一级子目录,其实后续的jp目录、cangls目录都已经建立
所谓的递归建立,就是一级一级地建立目录。
既然有建立目录的命令,就一定会有删除目录的命令rmdir,其基本信息如下:
[root@localhost ~] rmdir [选项] 目录名
选项:
-p: 递归删除目录
[root@localhost ~]rmdir cangls
但rmdir命令的作用十分有限,因为只能删除空目录,所以一旦目录中有内容,就会报错。例如:
[root@localhost ~]mkdir test
#建立测试目录
[root@localhost ~]touch test/boduo
[root@localhost ~]touch test/longze
#在测试目录中建立两个文件
[root@localhost ~]rmdir test/
rmdir: 删除 "test/" 失败: 目录非空
这个命令比较“笨”,所以我们不太常用。后续我们不论删除的是文件还是目录,都会使用rm命令。
tree命令以树形结构显示目录下的文件,其基本信息如下:
tree命令非常简单,用法也比较单一,就是显示目录树,例如:
[root@localhost ~] tree /etc/
/etc/
├── abrt
│ ├── abrt-action-save-package-data.conf
│ ├── abrt.conf
│ ├── gpg_keys
│ └── plugins
│ ├── CCpp.conf
│ └── python.conf
├── acpi
│ ├── actions
│ │ └── power.sh
│ └── events
│ ├── power.conf
│ └── video.conf
…省略部分内容…
其实计算机的基本操作大多数可以归纳为“增删改查”4个字,文件操作也不例外。只是修改文件数据需要使用文件编辑器,如Vim。在学习文件操作命令时,如果需要修改文件内容,则会暂时使用“echo 9527>> test”(这条命令会向test文件末尾追加一行“9527”数据)这样的方式来修改文件。
在学习文件操作命令时,如果需要修改文件内容,则会暂时使用“echo 9527>> test”(这条命令会向test文件末尾追加一行“9527”数据)这样的方式来修改文件:
[root@localhost ~] touch [选项] 文件名或目录名
选项:
-a: 只修改文件的访问时间(Access Time)
-c: 如果文件不存在,则不建立新文件
-d: 把文件的时间改为指定的时间
-m: 只修改文件的数据修改时间(Modify Time)
Linux中的每个文件都有三个时间,分别是访问时间(Access Time)、数据修改时间(Modify Time)和状态修改时间(Change Time)。这三个时间可以通过stat命令来进行查看。不过touch命令只能手工指定是只修改访问时间,还是只修改数据修改时间,而不能指定只修改状态修改时间。因为不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,所以状态修改时间会随之改变。
注意:在Linux中,文件没有创建时间。
[root@localhost ~]touch bols
#建立名为bols的空文件
如果文件不存在,则会建立文件:
[root@localhost ~]touch bols
[root@localhost ~]touch bols
#而如果文件已经存在,则也不会报错,只是会修改文件的访问时间
在Linux中,文件有访问时间、数据修改时间、状态修改时间这三个时间,而没有创建时间。stat是查看文件详细信息的命令,而且可以看到文件的这三个时间,其基本信息如下:
[root@localhost ~] stat [选项] 文件名或目录名
选项:
-f: 查看文件所在的文件系统信息,而不是查看文件的信息
例子1:查看文件的详细信息:
[root@localhost ~] stat anaconda-ks.cfg
File: "anaconda-ks.cfg"
#文件名
Size: 1170 Blocks: 8 IO Block: 4096 普通文件
#文件大小 占用的block数 块大小 文件类型
Device: 803h/2051d Inode: 130834 Links: 1
#i节点号 链接数
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
#权限 所有者 所属组
Access: 2016-05-06 23:31:41.396893415 +0800
#访问时间
Modify: 2016-05-06 23:31:41.396893415 +0800
#数据修改时间
Change: 2016-05-06 23:31:41.411006937 +0800
#状态修改时间
例子2:查看文件系统信息,如果使用“-f”选项,就不再是查看指定文件的信息,而是查看这个文件所在文件系统的信息,例如:
[root@localhost ~]stat -f anaconda-ks.cfg
File: "anaconda-ks.cfg"
ID: c05ad05e0e3b0580 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 5045314 Free: 4356956 Available: 4100662
Inodes: Total: 1283632 Free: 1192731
例子3:三种时间的含义,查看系统当前时间,如下:
[root@localhost ~] date
2016年 05月 07日 星期六 01:40:49 CST
再查看bols文件的三种时间,可以看到,和当前时间是有差别的,如下:
[root@localhost ~] stat bols
File: "bols"
Size: 0 Blocks: 0 IO Block: 4096 普通空文件
Device: 803h/2051d Inode: 130829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-05-07 00:10:23.794319970 +0800
Modify: 2016-05-07 00:10:23.794319970 +0800
Change: 2016-05-07 00:10:23.794319970 +0800
#这些时间都是最后一次修改文件的时间,并不是当前时间
而如果用cat命令读取一下这个文件,就会发现文件的访问时间(Access Time)变成了cat命令的执行时间,如下:
[root@localhost ~] cat bols
[root@localhost ~] stat bols
File: "bols"
Size: 0 Blocks: 0 IO Block: 4096 普通空文件
Device: 803h/2051d Inode: 130829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-05-07 01:41:08.202924900 +0800
#只有访问时间变为了cat命令的执行时间,其他两个时间没有改变
Modify: 2016-05-07 00:10:23.794319970 +0800
Change: 2016-05-07 00:10:23.794319970 +0800
而如果用echo命令向文件中写入点数据,那么文件的数据修改时间(Modify Time)就会发生改变。但是文件数据改变了,系统会认为文件的状态也会改变,所以状态修改时间(Change Time)也会随之改变,如下:
[root@localhost ~]echo 9527> bols
[root@localhost ~]stat bols
File: "bols"
Size: 6 Blocks: 8 IO Block: 4096 普通文件
Device: 803h/2051d Inode: 130829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-05-07 01:41:08.202924900 +0800
#这个时间还是上次修改时间
Modify: 2016-05-07 01:42:42.459614017 +0800
Change: 2016-05-07 01:42:42.459614017 +0800
#而这两个时间变为了echo命令的执行时间
而如果只修改文件的状态(比如改变文件的所有者),而不修改文件的数据,则只会更改状态修改时间(Change Time),如下:
[root@localhost ~]chown nobody bols
[root@localhost ~]stat bols
File: "bols"
Size: 6 Blocks: 8 IO Block: 4096 普通文件
Device: 803h/2051d Inode: 130829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 502/ nobody) Gid: ( 0/ root)
Access: 2016-05-07 01:41:08.202924900 +0800
Modify: 2016-05-07 01:42:42.459614017 +0800
#前两个时间还是之前修改的时间
Change: 2016-05-07 01:43:09.676860399 +0800
#而状态修改时间变为了chown命令的执行时间
而如果用touch命令再次触摸这个文件,则这个文件的三个时间都会改变。touch命令的作用就是这样的,大家记住即可。如下:
[root@localhost ~] touch bols
[root@localhost ~] stat bols
File: "bols"
Size: 6 Blocks: 8 IO Block: 4096 普通文件
Device: 803h/2051d Inode: 130829 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 502/ nobody) Gid: ( 0/ root)
Access: 2016-05-07 01:54:14.466809236 +0800
Modify: 2016-05-07 01:54:14.466809236 +0800
Change: 2016-05-07 01:54:14.466809236 +0800
#三个时间都会变为touch命令的执行时间
cat命令用来查看文件内容。这个命令是concatenate(连接、连续)的简写,基本信息如下:
[root@localhost ~] cat [选项] 文件名
选项:
-A: 相当于-vET选项的整合,用于列出所有隐藏符号
-E: 列出每行结尾的回车符$
-n: 显示行号
-T: 把Tab键用^I显示出来
-v: 列出特殊字符
cat命令用于查看文件内容,不论文件内容有多少,都会一次性显示。如果文件非常大,那么文件开头的内容就看不到了。不过Linux可以使用“PgUp+上箭头”向上翻页,但是这种翻页是有极限的,如果文件足够长,那么还是无法看全文件的内容。所以cat命令适合查看不太大的文件。当然,在Linux中是可以使用其他的命令或方法来查看大文件的,我们以后再来学习。cat命令本身非常简单,我们可以直接查看文件的内容。例如:
[root@localhost ~]cat anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
cdrom
lang zh_CN.UTF-8
…省略部分内容…
而如果使用“-n”选项,则会显示行号。例如:
[root@localhost ~] cat -n anaconda-ks.cfg
1 # Kickstart file automatically generated by anaconda.
2
3
4 #version=DEVEL
5 install
6 cdrom
…省略部分内容…
如果使用“-A”选项,则相当于使用了“-vET”选项,可以查看文本中的所有隐藏符号,包括回车符($)、Tab键(^I)等。例如:
[root@localhost ~] cat -A anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.$
$
$
#version=DEVEL$
install$
cdrom$
…省略部分内容…
如果文件过大,则cat命令会有心无力,这时more命令的作用更加明显。more是分屏显示文件的命令,其基本信息如下:
[root@localhost ~] more 文件名
more命令比较简单,一般不用什么选项,命令会打开一个交互界面,可以识别一些交互命令。常用的交互命令如下:
[root@localhost ~] more anaconda-ks.cfg
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
cdrom
…省略部分内容…
--More--(69%)
#在这里执行交互命令即可
less命令和more命令类似,只是more是分屏显示命令,而less是分行显示命令,其基本信息如下:
命令格式如下:
[root@localhost ~] less 文件名
less命令可以使用上、下箭头,用于分行查看文件内容。
head是用来显示文件开头的命令,其基本信息如下:
[root@localhost ~] head [选项] 文件名
选项:
-n 行数: 从文件头开始,显示指定行数
-v: 显示文件名
[root@localhost ~] head anaconda-ks.cfg
head命令默认显示文件的开头10行内容。如果想显示指定的行数,则只需使用“-n”选项即可,例如:
[root@localhost ~] head -n 20 anaconda-ks.cfg
这是显示文件的开头20行内容,也可以直接写“-行数”,例如:
[root@localhost ~] head -20 anaconda-ks.cfg
既然有显示文件开头的命令,就会有显示文件结尾的命令。tail命令的基本信息如下:
[root@localhost ~] tail [选项] 文件名
选项:
-n 行数: 从文件结尾开始,显示指定行数
-f: 监听文件的新增内容
例子1:基本用法
[root@localhost ~] tail anaconda-ks.cfg
tail命令和head命令的格式基本一致,默认会显示文件的后10行。如果想显示指定的行数,则只需使用“-n”选项即可,例如:
[root@localhost ~] tail -n 20 anaconda-ks.cfg
也可以直接写“-行数”,例如:
[root@localhost ~] tail -20 anaconda-ks.cfg
例子2:监听文件的新增内容,tail命令有一种比较有趣的用法,可以使用“-f”选项来监听文件的新增内容,例如:
[root@localhost ~] tail -f anaconda-ks.cfg
@server-platform
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end
#光标不会退出文件,而会一直监听在文件的结尾处
这条命令会显示文件的最后10行内容,而且光标不会退出命令,而会一直监听在文件的结尾处,等待显示新增内容。这时如果向文件中追加一些数据(需要开启一个新终端),那么结果如下:
[root@localhost ~] echo 2222222222 >> anaconda-ks.cfg
[root@localhost ~] echo 33333333333 >> anaconda-ks.cfg
#在新终端中通过echo命令向文件中追加数据
在原始的正在监听的终端中,会看到如下信息:
[root@localhost ~] tail -f anaconda-ks.cfg
@server-platform
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
%end2222222222
33333333333
#在文件的结尾处监听到了新增数据
如果要想说清楚ln命令,则必须先解释一下ext文件系统是如何工作的。分区的格式化就是写入文件系统,而我们的Linux目前使用的是ext4文件系统。如果用一张示意图来描述ext4文件系统,则可以参考下图:
ext4文件系统会把分区主要分为两大部分(暂时不提超级块):一小部分用于保存文件的inode(i节点)信息;剩余的大部分用于保存block信息。
inode的默认大小为128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的block编号。每个文件需要占用一个inode。大家如果仔细查看,就会发现inode中是不记录文件名的,那是因为文件名记录在文件所在目录的block中。
block的大小可以是1KB、2KB、4KB,默认为4KB。block用于实际的数据存储,如果一个block放不下数据,则可以占用多个block。例如,有一个10KB的文件需要存储,则会占用3个block,虽然最后一个block不能占满,但也不能再放入其他文件的数据。这3个block有可能是连续的,也有可能是分散的。
了解了ext文件系统的概念,我们来看看ln命令的基本信息:
ln命令的基本格式如下:
[root@localhost ~] ln [选项] 源文件 目标文件
选项:
-s: 建立软链接文件。如果不加“-s”选项,则建立硬链接文件
-f: 强制。如果目标文件已经存在,则删除目标文件后再建立链接文件
如果创建硬链接:
[root@localhost ~] touch cangls
[root@localhost ~] ln /root/cangls /tmp/
#建立硬链接文件,目标文件没有写文件名,会和原名一致
#也就是/root/cangls和/tmp/cangls是硬链接文件
如果创建软链接:
[root@localhost ~] touch bols
[root@localhost ~] ln /root/bols /tmp/
#建立软链接文件
这里需要注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。这是初学者非常容易犯的错误。
建立硬链接和软链接非常简单,那这两种链接有什么区别?它们都有什么作用?这才是链接文件最不容易理解的地方,我们分别来讲讲。
我们再来建立一个硬链接文件,然后看看这两个文件的特点:
[root@localhost ~] touch test
#建立源文件
[root@localhost ~] ln /root/test /tmp/test-hard
#给源文件建立硬链接文件/tmp/test-hard
[root@localhost ~] ll -i /root/test /tmp/test-hard
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test
262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard
#查看两个文件的详细信息,可以发现这两个文件的inode号是一样的,“ll”等同于“ls -l”
这里有一件很奇怪的事情,我们之前在讲inode号的时候说过,每个文件的inode号都应该是不一样的。inode号就相当于文件ID,我们在查找文件的时候,要先查找inode号,才能读取到文件的内容。
但是这里源文件和硬链接文件的inode号居然是一样的,那我们在查找文件的时候,到底找到的是哪一个文件呢?我们来画一张示意图,如下图所示:
在inode信息中,是不会记录文件名称的,而是把文件名记录在上级目录的block中。也就是说,目录的block中记录的是这个目录下所有一级子文件和子目录的文件名及inode的对应;而文件的block中记录的才是文件实际的数据。当我们查找一个文件,比如/root/test时,要经过以下步骤:
通过这个过程,我们就可以总结出软链接的特点(软链接的特点和Windows中的快捷方式完全一致):
我们测试一下软链接的特性:
[root@localhost ~] echo 111 >> /root/check
#修改源文件
[root@localhost ~] cat /root/check
111
[root@localhost ~] cat /tmp/check-soft
111
#不论是源文件还是软链接文件,数据都发生改变
[root@localhost ~] echo 2222 >> /tmp/check-soft
#修改软链接文件
[root@localhost ~] cat /tmp/check-soft
111
2222
[root@localhost ~] cat /root/check
111
2222
#不论是源文件还是软链接文件,数据也都会发生改变
[root@localhost ~] rm -rf /root/check
#删除源文件
[root@localhost ~] cat /tmp/check-soft
cat: /tmp/check-soft: 没有那个文件或目录
#软链接无法正常使用
软链接是可以链接目录的,例如:
[root@localhost ~] mkdir test
#建立源目录
[root@localhost ~] ln -s /root/test/ /tmp/
[root@localhost ~] ll -d /tmp/test
lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test -> /root/test/
#软链接可以链接目录
rm是强大的删除命令,不仅可以删除文件,也可以删除目录。这个命令的基本信息如下:
[root@localhost ~] rm [选项] 文件或目录
选项:
-f: 强制删除(force)
-i: 交互删除,在删除之前会询问用户
-r: 递归删除,可以删除目录(recursive)
例子1:基本用法,rm命令如果任何选项都不加,则默认执行的是“rm -i文件名”,也就是在删除一个文件之前会先询问是否删除。例如:
[root@localhost ~] touch cangls
[root@localhost ~] rm cangls
rm:是否删除普通空文件 "cangls"? y
#删除前会询问是否删除
例子2:删除目录,如果需要删除目录,则需要使用“-r”选项。例如:
[root@localhost ~] mkdir -p /test/lm/movie/jp/
#递归建立测试目录
[root@localhost ~] rm /test/
rm: 无法删除"/test/": 是一个目录
#如果不加“-r”选项,则会报错
[root@localhost ~] rm -r /test/
rm:是否进入目录"/test"? y
rm:是否进入目录"/test/lm"? y
rm:是否进入目录"/test/lm/movie"? y
rm:是否删除目录 "/test/lm/movie/jp"? y
rm:是否删除目录 "/test/lm/movie"? y
rm:是否删除目录 "/test/lm"? y
rm:是否删除目录 "/test"? y
#会分别询问是否进入子目录、是否删除子目录
大家会发现,如果每级目录和每个文件都需要确认,那么在实际使用中简直是灾难!
例子3:强制删除,如果要删除的目录中有1万个子目录或子文件,那么普通的rm删除最少需要确认1万次。所以,在真正删除文件的时候,我们会选择强制删除。例如:
[root@localhost ~] mkdir -p /test/lm/movie/jp/
#重新建立测试目录
[root@localhost ~] rm -rf /test/
#强制删除,一了百了
加入了强制功能之后,删除就会变得很简单,但是需要注意:
cp是用于复制的命令,其基本信息如下:
[root@localhost ~] cp [选项] 源文件 目标文件
选项:
-a: 相当于-dpr选项的集合,这几个选项我们一一介绍
-d: 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接
-i: 询问,如果目标文件已经存在,则会询问是否覆盖
-l: 把目标文件建立为源文件的硬链接文件,而不是复制源文件
-s: 把目标文件建立为源文件的软链接文件,而不是复制源文件
-p: 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)
-r: 递归复制,用于复制目录
例子1:基本用法,cp命令既可以复制文件,也可以复制目录。我们先来看看如何复制文件,例如:
[root@localhost ~] touch cangls
#建立源文件
[root@localhost ~] cp cangls /tmp/
#把源文件不改名复制到/tmp/目录下
如果需要改名复制,则命令如下:
[root@localhost ~] cp cangls /tmp/bols
#改名复制
如果复制的目标位置已经存在同名的文件,则会提示是否覆盖,因为cp命令默认执行的是“cp -i”的别名,例如:
[root@localhost ~] cp cangls /tmp/
cp:是否覆盖"/tmp/cangls"? y
#目标位置有同名文件,所以会提示是否覆盖
接下来我们看看如何复制目录,其实复制目录只需使用“-r”选项即可,例如:
[root@localhost ~] mkdir movie
#建立测试目录
[root@localhost ~] cp -r /root/movie/ /tmp/
#目录原名复制
例子2:复制软链接属性,如果源文件不是一个普通文件,而是一个软链接文件,那么是否可以复制软链接的属性呢?我们试试:
[root@localhost ~] ln -s /root/cangls /tmp/cangls_slink
#建立一个测试软链接文件/tmp/cangls_slink
[root@localhost ~] ll /tmp/cangls_slink
lrwxrwxrwx 1 root root 12 6月 14 05:53 /tmp/cangls_slink -> /root/cangls
#源文件本身就是一个软链接文件
[root@localhost ~] cp /tmp/cangls_slink /tmp/cangls_t1
#复制软链接文件,但是不加“-d”选项
[root@localhost ~] cp -d /tmp/cangls_slink /tmp/cangls_t2
#复制软链接文件,加入“-d”选项
[root@localhost ~] ll /tmp/cangls_t1 /tmp/cangls_t2
-rw-r--r-- 1 root root 0 6月 14 05:56 /tmp/cangls_t1
#会发现不加“-d”选项,实际复制的是软链接的源文件,而不是软链接文件
lrwxrwxrwx 1 root root 12 6月 14 05:56 /tmp/cangls_t2 -> /root/cangls
#而如果加入了“-d”选项,则会复制软链接文件
这个例子说明:如果在复制软链接文件时不使用“-d”选项,则cp命令复制的是源文件,而不是软链接文件;只有加入了“-d”选项,才会复制软链接文件。请大家注意,“-d”选项对硬链接是无效的。
例子3:保留源文件属性复制,我们发现,在执行复制命令后,目标文件的时间会变成复制命令的执行时间,而不是源文件的时间。例如:
[root@localhost ~] cp /var/lib/mlocate/mlocate.db /tmp/
[root@localhost ~] ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 2328027 6月 14 02:08 /var/lib/mlocate/mlocate.db
#注意源文件的时间和所属组
[root@localhost ~] ll /tmp/mlocate.db
-rw-r----- 1 root root 2328027 6月 14 06:05 /tmp/mlocate.db
#由于复制命令由root用户执行,所以目标文件的所属组变为了root,而且时间也变成了复制命令的执行
时间
而当我们在执行数据备份、日志备份的时候,这些文件的时间可能是一个重要的参数,这就需要执行“-p”选项了。这个选项会保留源文件的属性,包括所有者、所属组和时间。例如:
[root@localhost ~] cp -p /var/lib/mlocate/mlocate.db /tmp/mlocate.db_2
#使用“-p”选项
[root@localhost ~] ll /var/lib/mlocate/mlocate.db /tmp/mlocate.db_2
-rw-r----- 1 root slocate 2328027 6月 14 02:08 /tmp/mlocate.db_2
-rw-r----- 1 root slocate 2328027 6月 14 02:08 /var/lib/mlocate/mlocate.db
#源文件和目标文件的所有属性都一致,包括时间
我们之前讲过,“-a”选项相当于“-dpr”选项,这几个选项我们已经分别讲过了。所以,当我们使用“-a”选项时,目标文件和源文件的所有属性都一致,包括源文件的所有者、所属组、时间和软链接属性。使用“-a”选项来取代“-dpr”选项更加方便。
例子4:“-l”和“-s”选项,我们如果使用“-l”选项,则目标文件会被建立为源文件的硬链接;而如果使用了“-s”选项,则目标文件会被建立为源文件的软链接。这两个选项和“-d”选项是不同的,“-d”选项要求源文件必须是软链接,目标文件才会复制为软链接;而“-l”和“-s”选项的源文件只需是普通文件,目标文件就可以直接复制为硬链接和软链接。例如:
[root@localhost ~] touch bols
#建立测试文件
[root@localhost ~] ll -i bols
262154 -rw-r--r-- 1 root root 0 6月 14 06:26 bols
#源文件只是一个普通文件,而不是软链接文件
[root@localhost ~] cp -l /root/bols /tmp/bols_h
[root@localhost ~] cp -s /root/bols /tmp/bols_s
#使用“-l”和“-s”选项复制
[root@localhost ~] ll -i /tmp/bols_h /tmp/bols_s
262154 -rw-r--r-- 2 root root 0 6月 14 06:26 /tmp/bols_h
#目标文件/tmp/bols_h为源文件的硬链接文件
932113 lrwxrwxrwx 1 root root 10 6月 14 06:27 /tmp/bols_s -> /root/bols
#目标文件/tmp/bols_s为源文件的软链接文件
mv是用来剪切的命令,其基本信息如下:
[root@localhost ~] mv [选项] 源文件 目标文件
选项:
-f: 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖
-i: 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项)
-n: 如果目标文件已经存在,则不会覆盖移动,而且不询问用户
-v: 显示详细信息
例子1:移动文件或目录:
[root@localhost ~] mv cangls /tmp/
#移动之后,源文件会被删除,类似剪切
[root@localhost ~] mkdir movie
[root@localhost ~] mv movie/ /tmp/
#也可以移动目录。和rm、cp不同的是,mv移动目录不需要加入“-r”选项
如果移动的目标位置已经存在同名的文件,则同样会提示是否覆盖,因为mv命令默认执行的也是“mv -i”的别名,例如:
例子2:强制移动,之前说过,如果目标目录下已经存在同名文件,则会提示是否覆盖,需要手工确认。这时如果移动的同名文件较多,则需要一个一个文件进行确认,很不方便。如果我们确认需要覆盖已经存在的同名文件,则可以使用“-f”选项进行强制移动,这就不再需要用户手工确认了。例如:
[root@localhost ~] touch cangls
#重新建立文件
[root@localhost ~] mv -f cangls /tmp/
#就算/tmp/目录下已经存在同名的文件,由于“-f”选项的作用,所以会强制覆盖
例子3:不覆盖移动,既然可以强制覆盖移动,那也有可能需要不覆盖的移动。如果需要移动几百个同名文件,但是不想覆盖,这时就需要“-n”选项的帮助了。例如:
[root@localhost ~] ls /tmp/*ls
/tmp/bols /tmp/cangls
#在/tmp/目录下已经存在bols、cangls文件了
[root@localhost ~] mv -vn bols cangls lmls /tmp/
"lmls" -> "/tmp/lmls"
#再向/tmp/目录中移动同名文件,如果使用了“-n”选项,则可以看到只移动了lmls,而同名的bols
和cangls并没有移动(“-v”选项用于显示移动过程)
例子4:改名,如果源文件和目标文件在同一个目录中,那就是改名。例如:
[root@localhost ~] mv bols lmls
#把bols改名为lmls
目录也可以按照同样的方法改名。
例子5:显示移动过程,如果我们想要知道在移动过程中到底有哪些文件进行了移动,则可以使用“-v”选项来查看详细的移动信息。例如:
[root@localhost ~]# touch test1.txt test2.txt test3.txt
#建立三个测试文件
[root@localhost ~]# mv -v *.txt /tmp/
"test1.txt" -> "/tmp/test1.txt"
"test2.txt" -> "/tmp/test2.txt"
"test3.txt" -> "/tmp/test3.txt"
#加入“-v”选项,可以看到有哪些文件进行了移动
我们发现,初学者并不是不能理解权限命令,而是不能理解为什么需要设定不同的权限。所有的人都直接使用管理员身份,不可以吗?这是由于绝大多数用户使用的是个人计算机,而使用个人计算机的用户一般都是被信任的用户(如家人、朋友等)。在这种情况下,大家都可以使用管理员身份直接登录。又因为管理员拥有最大权限,所以给我们带来了错觉,以为在计算机中不需要分配权限等级,不需要使用不同的账户。但是在服务器上就不是这种情况了,在服务器上运行的数据越重要(如游戏数据),价值越高(如电子商城数据、银行数据),那么对权限的设定就要越详细,用户的分级也要越明确。所以,在服务器上,绝对不是所有的用户都使用root身份登录,而要根据不同的工作需要和职位需要,合理分配用户等级和权限等级。
前面讲ls命令的-l选项时,简单解释过所有者和所属组,例如:
[root@localhost ~] ls -linstall.log
-rw-r--r--. 1root root 24772 1月 14 18:17 install.log
命令的第三列root用户就是文件的所有者,第四列root组就是文件的所属组。而且我们也介绍过,文件的所有者一般就是这个文件的建立者,而系统中绝大多数系统文件都是由root建立的,所以绝大多数系统文件的所有者都是root。
接下来我们解释一下所属组,首先讲解一下用户组的概念。用户组就是一组用户的集合,类似于大学里的各种社团。那为什么要把用户放入一个用户组中呢?当然是为了方便管理。大家想想,如果我有100位用户,而这100位用户对同一个文件的权限是一致的,那我是一位用户一位用户地分配权限方便,还是把100位用户加入一个用户组中,然后给这个用户组分配权限方便呢?不言而喻,一定是给一个用户组分配权限更加方便。
综上所述,给一个文件区分所有者、所属组和其他人,就是为了分配权限方便。就像我买了一台电脑,那我当然是这台电脑的所有者,可以把我的学生加入一个用户组,其他不认识的路人当然就是其他人了。分配完了用户身份,就可以分配权限了,所有者当然对这台电脑拥有所有的权限,而位于所属组中的这些学生可以借用我的电脑,而其他人则完全不能碰我的电脑。
前面讲解ls命令时,我们已经知道长格式显示的第一列就是文件的权限,例如:
[root@localhost ~] ls -linstall.log
-rw-r--r--. 1 root root 24772 1月 14 18:17 install.log
第一列的权限位如果不计算最后的“.”(这个点的含义我们在后面解释),则共有10位,这10位权限位的含义如下图所示:
第1位代表文件类型。Linux不像Windows使用扩展名表示文件类型,而是使用权限位的第1位表示文件类型。虽然Linux文件的种类不像Windows中那么多,但是分类也不少,详细情况可以使用“info ls”命令查看。在这里只讲一些常见的文件类型:
第2~4位代表文件所有者的权限。
第5~7位代表文件所属组的权限,同样拥有“rwx”权限。
第8~10位代表其他人的权限,同样拥有“rwx”权限。
这就是文件基本权限的含义,那我们看看下面这个文件的权限是什么。
[root@localhost ~] ls -linstall.log
-rw-r--r--. 1 root root 24772 1月 14 18:17 install.log
这个文件的所有者,也就是root用户,拥有读和写权限;所属组中的用户,也就是root组中除root用户以外的其他用户,拥有只读权限;而其他人拥有只读权限。
最后,我们再看看权限位的这个“.”的作用。这个点是在CentOS 6以上的系统中才出现的,在以前的系统中是没有的。刚开始,我也饱受这个点的困扰,在各种资料中都查不到这个点的说明。直到无意中查询了“info ls”命令,才明白这个点的含义:如果在文件的权限位中含有“.”,则表示这个文件受SELinux的安全规则管理。
这个示例说明,任何资料都不如Linux自带的帮助文档准确和详细。所以,如果以后出现了不能解释的内容,则记得先查看Linux自带的帮助文档。
首先来看修改权限的命令chmod,其基本信息如下:
[root@localhost ~] chmod [选项] 权限模式 文件名
选项:
-R: 递归设置权限,也就是给子目录中的所有文件设定权限
chmod命令的权限模式的格式是“[ugoa][[±=][perms]]”,也就是“[用户身份][[赋予方式][权限]]”的格式,我们来解释一下:
用户身份:
赋予方式:
权限
例子1:用“+”加入权限:
[root@localhost ~] touch lmls
#建立测试文件
[root@localhost ~] ll lmls
-rw-r--r-- 1 root root 0 6月 15 02:48 lmls
#这个文件的默认权限是“所有者:读、写权限;所属组:只读权限;其他人:只读权限”
[root@localhost ~] chmod u+x lmls
#给所有者加入执行权限
[root@localhost ~] ll lmls
-rwxr--r-- 1 root root 0 6月 15 02:48 lmls
#权限生效
例子2:给多个身份同时加入权限:
[root@localhost ~] chmod g+w, o+w lmls
#给所属组和其他人同时加入写权限
[root@localhost ~] ll lmls
-rwxrw-rw- 1 root root 0 6月 15 02:48 lmls
#权限生效
例子3:用“-”减去权限:
[root@localhost ~]chmod u-x, g-w, o-w lmls
#给所有者减去执行权限,给所属组和其他人都减去写权限,也就是恢复默认权限
[root@localhost ~]ll lmls
-rw-r--r-- 1 root root 0 6月 15 02:48 lmls
例子4:用“=”设置权限:
大家有没有发现,用“±”赋予权限是比较麻烦的,需要先确定原始权限是什么,然后在原始权限的基础上加减权限。有没有简单一点的方法呢?可以使用“=”来设定权限,例如:
[root@localhost ~] chmod u=rwx, g=rw, o=rw lmls
#给所有者赋予权限“rwx”,给所属组和其他人赋予权限“rw”
[root@localhost ~] ll lmls
-rwxrw-rw- 1 root root 0 6月 15 02:48 lmls
使用“=”赋予权限,确实不用在原始权限的基础之上进行加减了,但是依然要写很长一条命令,依然觉得不够简单,还可以使用数字权限的方式来赋予权限。
数字权限的赋予方式是最简单的,但是不如之前的字母权限好记、直观。我们来看看这些数字权限的含义:
举个例子:
[root@localhost ~] chmod 755 lmls
#给文件赋予“755权限”
[root@localhost ~]# ll lmls
-rwxr-xr-x 1 root root 0 6月 15 02:48 lmls
解释一下“755权限”:
Linux自带的帮助命令是最准确、最可靠的资料。我不止一次发现通过其他途径搜索到的信息都不准确,甚至是错误的。所以,虽然Linux自带的帮助命令是英文的,但是我们要静下心来慢慢学习。
man是最常见的帮助命令,也是Linux最主要的帮助命令,其基本信息如下:
[root@localhost ~] man [选项] 命令
选项:
-f: 查看命令拥有哪个级别的帮助
-k: 查看和命令相关的所有帮助
man命令比较简单,我们举个例子:
[root@localhost ~] man ls
#获取ls命令的帮助信息
这就是man命令的基本使用方法,非常简单。但是帮助命令的重点不是命令如何使用,而是帮助信息应该如何查询。
还是查看ls命令的帮助,我们看看这个帮助信息的详细内容:
[root@localhost ~]# man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
#命令名称及英文原意
SYNOPSIS
ls [OPTION]... [FILE]...
#命令的格式
DESCRIPTION
#开始详细介绍命令选项的作用
List information about the FILEs (the current directory by default). Sort
entries
alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
-a, --all
do not ignore entries starting with .
-A, --almost-all
do not list implied . and ..
…省略部分内容…
AUTHOR
Written by Richard M. Stallman and David MacKenzie.
#作者
REPORTING BUGS
#bug的报告地址
Report ls bugs to bug-coreutils@gnu.org
GNU coreutils home page: //www.gnu.org/software/coreutils/>
General help using GNU software: //www.gnu.org/gethelp/>
Report ls translation bugs to http://translationproject.org/team/
COPYRIGHT
#著作权受GPL规则保护
Copyright © 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL
version 3 or
later//gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO
WAR-
RANTY, to the extent permitted by law.
SEE ALSO
#可以通过其他哪些命令查看到ls的相关信息
The full documentation for ls is maintained as a Texinfo manual. If the info
and ls
programs are properly installed at your site, the command
info coreutils 'ls invocation'
should give you access to the complete manual.
GNU coreutils 8.4 June 2012 LS(1)
虽然不同命令的man信息有一些区别,但是每个命令man信息的整体结构皆如演示这样。在帮助信息中,我们主要查看的就是命令的格式和选项的详细作用。不过大家请注意,在man信息的最后,可以看到还有哪些命令可以查看到此命令的相关信息。这是非常重要的提示,不同的帮助信息记录的侧重点是不太一样的。所以,如果在man信息中找不到想要的内容,则可以尝试查看其他相关帮助命令。
[root@localhost ~] man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
SYNOPSIS
ls [OPTION]... [FILE]...
…省略部分内容…
/--color
#从当前页向下搜索--color字符串,这是ls命令定义输出颜色的选项
搜索内容是非常常用的技巧,可以方便地找到需要的信息。命令回车之后,可以快速找到第一个“–color”字符串;再按“n”键,就可以找到下一个“–color”字符串;如果按“N”键,则可以找到上一个“–color”字符串。
不知道大家有没有注意到,在执行man命令时,命令的开头会有一个数字标识这个命令的帮助级别。例如:
[root@localhost ~] man ls
LS(1) User Commands LS(1)
#这里的(1)就代表这是ls的1级别的帮助信息
这些命令的级别号代表什么含义呢?我们通过下表来说明:
我们来试试,ls命令的帮助级别是1,我们已经看到了。那么我们找一个只有超级用户才能执行的命令,如useradd命令(添加用户的命令),来看看这个命令的帮助:
[root@localhost ~] man useradd
USERADD(8) System Management Commands USERADD(8)
#我们可以看到,默认useradd命令的帮助级别是8,因为这是只有超级用户才可以执行的命令
命令拥有哪个级别的帮助可以通过“-f”选项来进行查看。例如:
[root@localhost ~] man -f ls
ls (1) - list directory contents
#可以看到ls命令只拥有1级别的帮助
ls是一个比较简单的Linux命令,所以只有1级别的帮助。我们再查看一下passwd命令(给用户设定密码的命令)的帮助:
[root@localhost ~] man -f passwd
passwd (1) - update user's authentication tokens
#passwd命令的帮助
passwd (5) - password file
#passwd配置文件的帮助
passwd [sslpasswd] (1ssl) - compute password hashes
#这里是SSL的passwd的帮助,和passwd命令并没有太大关系
passwd是一个比较复杂的命令,而且这个命令有一个相对比较复杂的配置文件/etc/passwd。所以系统既给出了passwd命令的帮助,也给出了/etc/passwd配置文件的帮助。大家可以使用如下命令查看:
[root@localhost ~] man 1 passwd
#查看passwd命令的帮助
[root@localhost ~] man 5 passwd
#查看/etc/passwd配置文件的帮助
man命令还有一个“-k”选项,它的作用是查看命令名中包含指定字符串的所有相关命令的帮助。例如:
[root@localhost ~] man -k useradd
luseradd(1) - Add an user
useradd(8) - create a new user or update default new user information
useradd [adduser] (8) - create a new user or update default new user information
useradd_selinux (8) -Security Enhanced Linux Policy for the useradd processes
#这条命令会列出系统中所有包含useradd字符串的命令,所以才会找到一些包含“useradd”字符串,
但是和我们要查找的useradd无关的命令
如果我们使用“man -k ls”命令,则会发现输出内容会多出几页,那是因为很多命令中都包含“ls”这个关键字。这条命令适合你只记得命令的几个字符,用来查找相关命令的情况。
在系统中还有两个命令:
不过这两个命令和man基本一致,所以了解就好。不过Linux的命令很有意思,想知道这个命令是干什么的,可以执行whatis命令;想知道命令在哪里,可以执行whereis命令;想知道当前登录用户是谁,可以执行whoami命令。
如果执行以上两个命令报错,那是因为whatis数据库没有建立。只要手工执行以下命令,重新建立whatis数据库即可:
[root@localhost ~] makewhatis
info命令也可以获取命令的帮助。和man命令不同的是,info命令的帮助信息是一套完整的资料,每个单独命令的帮助信息只是这套完整资料中的某一个小章节。大家可以把info帮助信息看成一部独立的电子书,所以每个命令的帮助信息都会和书籍一样,拥有章节编号。例如:
[root@localhost ~]# info ls
File: coreutils.info, Node: ls invocation, Next: dir invocation, Up: Directory
listing
10.1 'ls': List directory contents
==================================
The 'ls' program lists information about files (of any type, including
directories). Options and file arguments can be intermixed
arbitrarily, as usual.
…省略部分内容…
可以看到,ls命令的帮助只是整个info帮助信息中的第10.1节。在这个帮助信息中,如果标题的前面有“*”符号,则代表这是一个可以进入查看详细信息的子页面,只要按下回车键就可以进入。例如:
[root@localhost ~]# info ls
…省略部分内容…
Also see *note Common options::.
* Menu:
* Which files are listed::
* What information is listed::
* Sorting the output::
* Details about version sort::
* General output formatting::
* Formatting file timestamps::
* Formatting the file names::
…省略部分内容…
这是ls命令的info帮助信息中可以查看详细的子页面的标题。info命令主要是靠快捷键来进行操作的,我们来看看常用的快捷键,如下表所示:
help是非常简单的命令,而且不经常使用。因为help只能获取Shell内置命令的帮助,但在Linux中绝大多数命令是外部命令,所以help命令的作用非常有限。而且内置命令也可以使用man命令获取帮助。help命令的基本信息如下:
help命令的格式非常简单:
[root@localhost ~] help 内置命令
Linux中有哪些命令是内置命令呢?我们可以随意使用man命令来查看一个内置命令的帮助,例如:
[root@localhost ~] man help
BASH_BUILTINS(1) BASH_BUILTINS(1)
NAME
bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, compgen,
complete, compopt, continue, declare, dirs, disown, echo, enable, eval, exec,
exit, export,
false, fc, fg, getopts, hash, help, history, jobs, kill, let, local, logout,
mapfile, popd, printf, pushd, pwd, read, readonly, return, set, shift, shopt,
source, suspend, test, times, trap, true, type, typeset, ulimit, umask,
unalias, unset, wait – bash built-in commands, see bash(1)
…省略部分内容…
#这里列出的命令就是所有的Shell内置命令
可以发现,如果使用man命令去查看任意一个Shell内置命令,则会列出所有Shell内置命令的帮助。查看一个具体的Shell内置命令如history的帮助,可以执行“help history”。
如果我们使用help命令查看外部命令的帮助,则会如何呢?
[root@localhost ~] help ls
-bash: help: no help topics match 'ls'. Try 'help help' or 'man -k ls' or 'info
ls'.
#这里会报错,报错信息是“help无法得到ls命令的帮助,请查看help的帮助,或者用man和info来
查看ls的帮助信息”
绝大多数命令都可以使用“–help”选项来查看帮助,这也是一种获取帮助的方法。例如:
[root@localhost ~]# ls --help
这种方法非常简单,输出的帮助信息基本上是man命令的信息简要版。
对于这4种常见的获取帮助的方法,大家可以按照自己的习惯任意使用。
Linux拥有强大的搜索功能,但是强大带来的缺点是相对比较复杂。但是大家不用担心,搜索命令只是选项较多,不容易记忆而已,并不难理解。
在使用搜索命令的时候,大家还是需要注意,如果搜索的范围过大、搜索的内容过多,则会给系统造成巨大的压力,所以不要在服务器访问的高峰执行大范围的搜索命令。
whereis是搜索系统命令的命令(像绕口令一样),也就是说,whereis命令不能搜索普通文件,而只能搜索系统命令。whereis命令的基本信息如下:
看英文原意,就能发现whereis命令不仅可以搜索二进制命令,还可以找到命令的帮助文档的位置。
[root@localhost ~]# where [选项] 命令
选项:
-b: 只查找二进制命令
-m: 只查找帮助文档
whereis命令的使用比较简单,我们来试试,例如:
[root@localhost ~] whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
#既可以看到二进制命令的位置,也可以看到帮助文档的位置
which也是搜索系统命令的命令。和whereis命令的区别在于,whereis命令可以在查找到二进制命令的同时,查找到帮助文档的位置;而which命令在查找到二进制命令的同时,如果这个命令有别名,则还可以找到别名命令。which命令的基本信息如下:
which命令非常简单,可用选项也不多,我们直接举个例子:
[root@localhost ~]# which ls
alias ls='ls --color=auto'
/bin/ls
#which命令可以查找到命令的别名和命令所在位置
#alias这段就是别名,别名就是小名,也就是说,当我们输入ls命令时,实际上执行的是ls --color=
auto
whereis和which命令都是只能搜索系统命令的命令,而locate命令才是可以按照文件名搜索普通文件的命令。但是locate命令的局限也很明显,它只能按照文件名来搜索文件,而不能执行更复杂的搜索,比如按照权限、大小、修改时间等搜索文件。如果要按照复杂条件执行搜索,则只能求助于功能更加强大的find命令。locate命令的优点也非常明显,那就是搜索速度非常快,而且耗费系统资源非常小。这是因为locate命令不会直接搜索硬盘空间,而会先建立locate数据库,然后在数据库中按照文件名进行搜索,是快速的搜索命令。locate命令的基本信息如下:
…
在系统中,如果需要有大量的文件进行复制和保存,那么把它们打成压缩包是不错的选择。打包压缩作为常规操作,在Windows和Linux中都比较常见。Windows中常见的压缩包格式主要有“.zip”“.rar”和“.7z”等,但是你了解这些不同压缩格式的区别吗?其实普通用户并不用理解这些压缩格式的算法有什么区别、压缩比有哪些不同,只要在碰到这些压缩包时会正确地解压缩,在想要压缩时可以正确地操作,目的就达到了。
在Linux中也是一样的,可以识别的常见压缩格式有十几种,比如“.zip”“.gz”“.bz2”“.tar”“.tar.gz”“.tar.bz2”等。我们也不需要知道这些压缩格式的具体区别,只要对应的压缩包会解压缩、想要压缩的时候会操作即可。
还有一件事,我一直强调“Linux不靠扩展名区分文件类型,而是靠权限”,那压缩包也不应该区分扩展名啊?为什么还要区分是“.gz”还是“.bz2”的扩展名呢?这是因为,在Linux中,不同的压缩方法对应的解压缩方法也是不同的,这里的扩展名并不是Linux系统一定需要的(Linux不区分扩展名),而是用来给用户标识压缩格式的。只有知道了正确的压缩格式,才能采用正确的解压缩命令。
大家可以想象一下,如果你压缩了一个文件,起了一个名字“abc”,今天你知道这是一个压缩包,可以解压缩,那半年之后呢?而如果你将它命名为“etc_bak.tar.gz”,那无论什么时候、无论哪个用户都知道这是/etc/目录的备份压缩包。所以压缩文件一定要严格区分扩展名,这不是系统必需的,而是用来让管理员区分文件类型的。
“.zip”是Windows中最常用的压缩格式,Linux也可以正确识别“.zip”格式,这可以方便地和Windows系统通用压缩文件。
压缩命令就是zip,其基本信息如下:
命令格式如下:
[root@localhost ~] zip [选项] 压缩包名 源文件或源目录
选项:
-r: 压缩目录
zip压缩命令需要手工指定压缩之后的压缩包名,注意写清楚扩展名,以方便解压缩时使用。举个例子:
[root@localhost ~] zip ana.zip anaconda-ks.cfg
adding: anaconda-ks.cfg (deflated 37%)
#压缩
[root@localhost ~] ll ana.zip
-rw-r--r-- 1 root root 935 6月 17 16:00 ana.zip
#压缩文件生成
zip压缩命令需要手工指定压缩之后的压缩包名,注意写清楚扩展名,以方便解压缩时使用。举个例子:
[root@localhost ~] zip ana.zip anaconda-ks.cfg
adding: anaconda-ks.cfg (deflated 37%)
#压缩
[root@localhost ~]# ll ana.zip
-rw-r--r-- 1 root root 935 6月 17 16:00 ana.zip
#压缩文件生成
所有的压缩命令都可以同时压缩多个文件,例如:
[root@localhost ~] zip test.zip install.log install.log.syslog
adding: install.log (deflated 72%)
adding: install.log.syslog (deflated 85%)
#同时压缩多个文件到test.zip压缩包中
[root@localhost ~] ll test.zip
-rw-r--r-- 1 root root 8368 6月 17 16:03 test.zip
#压缩文件生成
如果想要压缩目录,则需要使用“-r”选项,例如:
[root@localhost ~] mkdir dir1
#建立测试目录
[root@localhost ~] zip -r dir1.zip dir1
adding: dir1/ (stored 0%)
#压缩目录
[root@localhost ~] ls -dl dir1.zip
-rw-r--r-- 1 root root 160 6月 17 16:22 dir1.zip
#压缩文件生成
“.zip”格式的解压缩命令是unzip,其基本信息如下:
命令格式如下:
[root@localhost ~] unzip [选项] 压缩包名
选项:
-d: 指定解压缩位置
不论是文件压缩包,还是目录压缩包,都可以直接解压缩,例如:
[root@localhost ~] unzip dir1.zip
Archive: dir1.zip
creating: dir1/
#解压缩
也可以手工指定解压缩位置,例如:
[root@localhost ~] unzip -d /tmp/ ana.zip
Archive: ana.zip
inflating: /tmp/anaconda-ks.cfg
#把压缩包解压到指定位置
通过前面的学习,我们发现,不论是gzip命令还是bzip2命令,好像都比较笨,gzip命令不能打包目录,而只能单独压缩目录下的子文件;bzip2命令干脆就不支持目录的压缩。在Linux中,对打包和压缩是区别对待的。也就是说,在Linux中,如果想把多个文件或目录打包到一个文件包中,则使用的是tar命令;而压缩才使用gzip或bzip2命令。
“.tar”格式的打包和解打包都使用tar命令,区别只是选项不同。我们先看看tar命令的基本信息:
命令的基本格式如下:
[root@localhost ~] tar [选项] [-f 压缩包名] 源文件或目录
选项:
-c: 打包
-f: 指定压缩包的文件名。压缩包的扩展名是用来给管理员识别格式的,所以一定
要正确指定扩展名
-v: 显示打包文件过程
例子1:基本使用,我们先打包一个文件练练手:
[root@localhost ~] tar -cvf anaconda-ks.cfg.tar anaconda-ks.cfg
#把anaconda-ks.cfg打包为anaconda-ks.cfg.tar文件
选项“-cvf”一般是习惯用法,记住打包时需要指定打包之后的文件名,而且要用“.tar”作为扩展名。那打包目录呢?我们也试试:
[root@localhost ~] ll -d test/
drwxr-xr-x 2 root root 4096 6月 17 21:09 test/
#test是我们之前的测试目录
[root@localhost ~] tar -cvf test.tar test/
test/
test/test3
test/test2
test/test1
#把目录打包为test.tar文件
tar命令也可以打包多个文件或目录,只要用空格分开即可。例如:
[root@localhost ~] tar -cvf ana.tar anaconda-ks.cfg /tmp/
#把anaconda-ks.cfg文件和/tmp目录打包成ana.tar文件包
例子2:打包压缩目录,我们已经解释过了,压缩命令不能直接压缩目录,我们就先用tar命令把目录打成数据包,然后再用gzip命令或bzip2命令压缩。例如:
[root@localhost ~] ll -d test test.tar
drwxr-xr-x 2 root root 4096 6月 17 21:09 test
-rw-r--r-- 1 root root 10240 6月 18 01:06 test.tar
#我们之前已经把test目录打包成test.tar文件
[root@localhost ~] gzip test.tar
[root@localhost ~] ll test.tar.gz
-rw-r--r-- 1 root root 176 6月 18 01:06 test.tar.gz
#gzip命令会把test.tar压缩成test.tar.gz
[root@localhost ~] gzip -d test.tar.gz
#解压缩,把test.tar.gz解压缩为test.tar
[root@localhost ~] bzip2 test.tar
[root@localhost ~] ll test.tar.bz2
-rw-r--r-- 1 root root 164 6月 18 01:06 test.tar.bz2
#bzip2命令会把test.tar压缩为test.tar.bz2格式
“.tar”格式的解打包也需要使用tar命令,但是选项不太一样。命令格式如下:
[root@localhost ~] tar [选项] 压缩包
选项:
-x: 解打包
-f: 指定压缩包的文件名
-v: 显示打包文件过程
-t: 测试,就是不解打包,只是查看包中有哪些文件
-C 目录: 指定解打包位置
其实解打包和打包相比,只是把打包选项“-cvf”更换为“-xvf”。我们来试试:
[root@localhost ~] tar -xvf anaconda-ks.cfg.tar
#解打包到当前目录下
如果使用“-xvf”选项,则会把包中的文件解压到当前目录下。如果想要指定解压位置,则需要使用“-C(大写)”选项。例如:
[root@localhost ~]# tar -tvf test.tar
drwxr-xr-x root/root 02016-06-17 21:09 test/
-rw-r--r-- root/root 02016-06-17 17:51 test/test3
-rw-r--r-- root/root 02016-06-17 17:51 test/test2
-rw-r--r-- root/root 02016-06-17 17:51 test/test1
#会用长格式显示test.tar文件包中文件的详细信息
你可能会觉得Linux实在太不智能了,一个打包压缩,居然还要先打包成“.tar”格式,再压缩成“.tar.gz”或“.tar.bz2”格式。其实tar命令是可以同时打包压缩的,前面的讲解之所以把打包和压缩分开,是为了让大家了解在Linux中打包和压缩的不同。
使用tar命令直接打包压缩。命令格式如下:
[root@localhost ~] tar [选项] 压缩包 源文件或目录
选项:
-z: 压缩和解压缩“.tar.gz”格式
-j: 压缩和解压缩“.tar.bz2”格式
例子1:压缩与解压缩“.tar.gz”格式,我们先来看看如何压缩“.tar.gz”格式:
[root@localhost ~] tar -zcvf tmp.tar.gz /tmp/
#把/tmp/目录直接打包压缩为“.tar.gz”格式,通过“-z”来识别格式,“-cvf”和打包选项一致
解压缩也只是在解打包选项“-xvf”前面加了一个“-z”选项:
[root@localhost ~] tar -zxvf tmp.tar.gz
#解压缩与解打包“.tar.gz”格式
前面讲的选项“-C”用于指定解压位置、“-t”用于查看压缩包内容,在这里同样适用。
例子2:压缩与解压缩“.tar.bz2”格式,和“.tar.gz”格式唯一的不同就是“-zcvf”选项换成了“-jcvf”。
[root@localhost ~] tar -jcvf tmp.tar.bz2 /tmp/
#打包压缩为“.tar.bz2”格式,注意压缩包文件名
[root@localhost ~] tar -jxvf tmp.tar.bz2
#解压缩与解打包“.tar.bz2”格式
把文件直接压缩成“.tar.gz”和“.tar.bz2”格式,才是Linux中最常用的压缩方式,这是大家一定要掌握的压缩和解压缩方法。
说到关机和重启,很多人认为,重要的服务器(比如银行的服务器、电信的服务器)如果重启了,则会造成大范围的灾难。在这里解释一下。
首先,就算是银行或电信的服务器,也不是不需要维护,而是依靠备份服务器来代替。
其次,每个人的经验都是和自己的技术成长环境息息相关的。比如有人是游戏运维出身,而游戏又是数据为王,所以一切操作的目的就是保证数据的可靠和安全。这时,有计划的重启远比意外宕机造成的损失要小得多,所以定时重启是游戏运维的重要手段。既然是按照自己的技术出身来给出建议,那么难免有局限性,所以超哥一再强调,这些只是“建议”,如果你有自己的经验,则完全可以按照自己的经验来维护服务器。
当我们在计算机上保存数据的时候,其实是先在内存中保存一定时间,再写入硬盘。这其实是一种缓存机制,当在内存中保存的数据需要被读取的时候,从内存中读取要比从硬盘中读取快得多。不过这也会带来一些问题,如果数据还没有来得及保存到硬盘中,就发生了突然宕机(比如断电)的情况,数据就会丢失。
sync命令的作用就是把内存中的数据强制向硬盘中保存。这个命令在常规关机的命令中其实会自动执行,但如果不放心,则应该在关机或重启之前手工执行几次,避免数据丢失。sync命令的基本信息如下:
sync命令直接执行就可以了,不需要任何选项:
[root@localhost ~] sync
记得在关机或重启之前多执行几次sync命令,多一重保险总是好的。
在早期的Linux系统中,应该尽量使用shutdown命令来进行关机和重启。因为在那时的Linux中,只有shutdown命令在关机或重启之前会正确地中止进程及服务,所以我们一直认为shutdown才是最安全的关机与重启命令。而在现在的系统中,一些其他的命令(如reboot)也会正确地中止进程及服务,但我们仍建议使用shutdown命令来进行关机和重启。shutdown命令的基本信息如下:
命令的基本格式如下:
[root@localhost ~] shutdown [选项] 时间 [警告信息]
选项:
-c: 取消已经执行的shutdown命令
-h: 关机
-r: 重启
例子1:重启与定时重启,先来看看如何使用shutdown命令进行重启:
[root@localhost ~] shutdown -r now
#重启,now是现在重启的意思
[root@localhost ~] shutdown -r 05:30
#指定时间重启,但会占用前台终端
[root@localhost ~] shutdown -r 05:30 &
#把定时重启命令放入后台,&是后台的意思
[root@localhost ~] shutdown -c
#取消定时重启
[root@localhost ~] shutdown -r +10
#10分钟之后重启
例子2:关机和定时关机:
[root@localhost ~] shutdown -h now
#现在关机
[root@localhost ~] shutdown -h 05:30
#指定时间关机
在现在的系统中,reboot命令也是安全的,而且不需要加入过多的选项。
[root@localhost ~] reboot
#重启
[root@localhost ~] halt
#关机
[root@localhost ~] poweroff
#关机
init是修改Linux运行级别的命令,也可以用于关机和重启。
[root@localhost ~] init 0
#关机,也就是调用系统的0级别
[root@localhost ~] init 6
#重启,也就是调用系统的6级别
介绍一下如何给Linux配置IP地址,以及一些常用的网络命令。
IP地址是计算机在互联网中唯一的地址编码。每台计算机如果需要接入网络和其他计算机进行数据通信,就必须配置唯一的公网IP地址。
Linux当然也需要配置IP地址才可以正常使用网络。其实Linux主要是通过修改网卡配置文件来永久修改IP地址的。setup是一个简化命令,是Red Hat系列专有的命令,其他的Linux系列不一定有此命令。setup命令的基本信息如下:
setup命令会开启一个图形化的配置工具,如下图所示:
这是一个综合工具,既可以配置IP地址,也可以管理防火墙和系统服务。如果我们需要配置IP地址,则只要选择“网络配置”就会开始IP地址配置。
ifconfig是Linux中查看和临时修改IP地址的命令,其基本信息如下:
ifconfig命令最主要的作用就是查看IP地址的信息,直接输入ifconfig命令即可:
[root@localhost ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:C5:FB:AA
#eth0网卡信息 网络类型为以太网 MAC地址
inet addr:192.168.44.3 Bcast:192.168.44.255 Mask:255.255.255.0
#IP地址 广播地址 子网掩码
inet6 addr: fe80::20c:29ff:fec5:fbaa/64 Scope:Link
#IPv6的地址(目前不生效)
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
#网络参数 最大传输单元 数据包转送次数
RX packets:881 errors:0 dropped:0 overruns:0 frame:0
#接收到的数据包情况
TX packets:853 errors:0 dropped:0 overruns:0 carrier:0
#发送的数据包情况
collisions:0 txqueuelen:1000
#数据包碰撞 数据缓冲区长度
RX bytes:82229 (80.3 KiB) TX bytes:273463 (267.0 KiB)
#接收包的大小 发送包的大小
Interrupt:19 Base address:0x2000
#IRQ中断 内存地址
lo Link encap:Local Loopback
#本地回环网卡信息
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:840 (840.0 b) TX bytes:840 (840.0 b)
ifconfig命令主要用于查看IP地址、子网掩码和MAC地址这三类信息,其他信息我们有所了解即可。
lo网卡是Loopback的缩写,也就是本地回环网卡,这个网卡的IP地址是127.0.0.1。它只代表我们的网络协议正常,就算不插入网线也可以ping通,所以基本没有实际使用价值,大家了解一下即可。
ifconfig命令除可以查看IP地址之外,还可以临时配置IP地址,但是一旦重启,IP地址就会失效,所以我们还是应该使用setup命令来进行IP地址配置。使用ifconfig命令临时配置IP地址的示例如下:
[root@localhost ~]ifconfig eth0192.168.44.3
#配置IP地址,不指定子网掩码就会使用标准子网掩码
[root@localhost ~]ifconfig eth0192.168.44.3 netmask 255.255.255.0
#配置IP地址,同时配置子网掩码
ifup和ifdown是两个非常简单的命令,其作用类似于Windows中的启用和禁用网卡,主要用于启用和关闭网卡:
[root@localhost ~] ifdown eth0
#关闭eth0网卡
[root@localhost ~] ifup eth0
#启用eth0网卡
ping是常用的网络命令,主要通过ICMP协议进行网络探测,测试网络中主机的通信情况。ping命令的基本信息如下:
命令的基本格式如下:
[root@localhost ~] ping [选项] IP
选项:
-b: 后面加入广播地址,用于对整个网段进行探测
-c 次数: 用于指定ping的次数
-s 字节: 指定探测包的大小
指定ping的次数:
如果不想一直ping下去,则可以使用“-c”选项指定ping的次数。例如:
[root@localhost ~]# ping -c 3 192.168.103.151
#只探测3次,就中止ping命令
探测网段中的可用主机:
在ping命令中,可以使用“-b”选项,后面加入广播地址,探测整个网段。我们可以使用这个选项知道整个网络中有多少主机是可以和我们通信的,而不用一个一个IP地址地进行探测。例如:
[root@localhost ~] ping -b -c 3192.168.103.255
WARNING: pinging broadcast address
PING 192.168.103.255 (192.168.103.255) 56(84) bytes of data.
64 bytes from 192.168.103.199: icmp_seq=1 ttl=64 time=1.95 ms
64 bytes from 192.168.103.168: icmp_seq=1 ttl=64 time=1.97 ms (DUP! )
64 bytes from 192.168.103.252: icmp_seq=1 ttl=64 time=2.29 ms (DUP! )
…省略部分内容…
#探测192.168.103.0/24网段中有多少可以通信的主机
我们需要先简单了解一下端口的作用。在互联网中,如果IP地址是服务器在互联网中唯一的地址标识,那么大家可以想象一下:我有一台服务器,它有固定的公网IP地址,通过IP地址可以找到我的服务器。但是我的服务器中既启动了网页服务(Web服务),又启动了文件传输服务(FTP服务),那么你的客户端访问我的服务器,到底应该如何确定你访问的是哪一个服务呢?
端口就是用于网络通信的接口,是数据从传输层向上传递到应用层的数据通道。我们可以理解为每个常规服务都有默认的端口号,通过不同的端口号,我们就可以确定不同的服务。也就是说,客户端通过IP地址访问到我的服务器,如果数据包访问的是80端口,则访问的是Web服务;而如果数据包访问的是21端口,则访问的是FTP服务。
我们可以简单地理解为每个常规服务都有一个默认端口(默认端口可以修改),这个端口是所有人都知道的,客户端可以通过固定的端口访问指定的服务。而我们通过在服务器中查看已经开启的端口号,就可以判断服务器中开启了哪些服务。
netstat是网络状态查看命令,既可以查看到本机开启的端口,也可以查看有哪些客户端连接。netstat命令的基本信息如下:
命令格式如下:
[root@localhost ~] netstat [选项]
选项:
-a: 列出所有网络状态,包括Socket程序
-c 秒数: 指定每隔几秒刷新一次网络状态
-n: 使用IP地址和端口号显示,不使用域名与服务名
-p: 显示PID和程序名
-t: 显示使用TCP协议端口的连接状况
-u: 显示使用UDP协议端口的连接状况
-l: 仅显示监听状态的连接
-r: 显示路由表
例子1:查看本机开启的端口,这是本机最常用的方式,使用选项“-tuln”。因为使用了“-l”选项,所以只能看到监听状态的连接,而不能看到已经建立连接状态的连接。例如:
[root@localhost ~] netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 :::11211 :::* LISTEN
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:11211 0.0.0.0:*
udp 0 0 :::11211 :::*
#协议接收队列发送队列本机的IP地址及端口号 远程主机的IP地址及端口号 状态
这个命令的输出较多:
1、Proto:网络连接的协议,一般就是TCP协议或者UDP协议。
2、Recv-Q:表示接收到的数据,已经在本地的缓冲中,但是还没有被进程取走。
3、Send-Q:表示从本机发送,对方还没有收到的数据,依然在本地的缓冲中,一般是不具备ACK标志的数据包。
4、Local Address:本机的IP地址和端口号。
5、Foreign Address:远程主机的IP地址和端口号。
6、State:状态。常见的状态主要有以下几种:
在这些状态中,我们最常用的就是LISTEN和ESTABLISHED状态,一种代表正在监听,另一种代表已经建立连接。
例子2:查看本机有哪些程序开启的端口,如果使用“-p”选项,则可以查看到是哪个程序占用了端口,并且可以知道这个程序的PID。例如:
[root@localhost ~] netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2359/mysqld
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 1563/memcached
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1490/sshd
tcp 0 0 :::11211 :::* LISTEN 1563/memcached
tcp 0 0 :::80 :::* LISTEN 21025/httpd
tcp 0 0 :::22 :::* LISTEN 1490/sshd
udp 0 0 0.0.0.0:11211 0.0.0.0:* 1563/memcached
udp 0 0 :::11211 :::* 1563/memcached
#比之前的命令多了一个“-p”选项,结果多了“PID/程序名”,可以知道是哪个程序占用了端口
例子3:查看所有连接,使用选项“-an”可以查看所有连接,包括监听状态的连接(LISTEN)、已经建立连接状态的连接(ESTABLISHED)、Socket程序连接等。因为连接较多,所以输出的内容有很多。例如:
[root@localhost ~] netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN
tcp 0 0117.79.130.170:80 78.46.174.55:58815 SYN_RECV
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0117.79.130.170:22 124.205.129.99:10379 ESTABLISHED
tcp 0 0117.79.130.170:22 124.205.129.99:11811 ESTABLISHED
…省略部分内容…
udp 0 0 0.0.0.0:11211 0.0.0.0:*
udp 0 0 :::11211 :::*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 9761 @/var/run/hald/dbus-fr41WkQn1C
…省略部分内容…
从“Active UNIX domain sockets”开始,之后的内容就是Socket程序产生的连接,之前的内容都是网络服务产生的连接。我们可以在“-an”选项的输出中看到各种网络连接状态,而之前的“-tuln”选项则只能看到监听状态。
在服务器上,有时会有多个用户同时登录,一些必要的沟通就显得尤为重要。比如,我必须关闭某个服务,或者需要重启服务器,当然需要通知同时登录服务器的用户,这时就可以使用write命令。write命令的基本信息如下:
write命令的基本格式如下:
[root@localhost ~] write 用户名 [终端号]
write命令没有多余的选项,我们要向在某个终端登录的用户发送信息,就可以这样来执行命令:
[root@localhost ~]write user1 pts/1
hello
I will be in 5 minutes to restart, please save your data
#向在pts/1(远程终端1)登录的user1用户发送信息,使用“Ctrl+D”快捷键保存发送的数据
这时,user1用户就可以收到你要在5分钟之后重启系统的信息了。
write命令用于给指定用户发送信息,而wall命令用于给所有登录用户发送信息,包括你自己。执行时,在wall命令后加入需要发送的信息即可,例如:
[root@localhost ~] wall "I will be in 5 minutes to restart, please save your data"
mail是Linux的邮件客户端命令,可以利用这个命令给其他用户发送邮件。mail命令的基本信息如下:
例子1:发送邮件:
[root@localhost ~]# mail user1
Subject: hello <- 邮件标题
Nice to meet you! <- 邮件具体内容
. <- 使用“.”来结束邮件输入
#发送邮件给user1用户
我们接收到的邮件都保存在“/var/spool/mail/用户名”中,每个用户都有一个以自己的用户名命名的邮箱。