目录
一、vi与linux常用命令
1.1 Linux服务器环境
1.1.1 vi编译器
1.1.1.1 什么是vi
vi是Linux操作系统中一个自带的编辑器。没有图形界面,只能编译文本内容,没有字体段落等设置,通过命令强大的命令完成一系列的编写工作。
1.1.1.2 学习目的
- 在实际工作中,要对 服务器上的文件进行 简单 的修改,使用
vi
进行快速的编辑即可。 - 对一些配置文件的修改,需要一定的权限,这时vi编辑器是最佳选择。
- vi 编辑器在 系统管理、服务器管理编辑文件时,其功能不是图形界面的编辑器能比拟的。
1.1.1.3 操作使用
- 打开和新建文件
$ vi 文件名
如果文件已经存在,会直接打开该文件
如果文件不存在,会新建一个文件
vim +# :打开文件,并定位于第#行
vim +:打开文件,定位至最后一行
vim +/PATTERN : 打开文件,定位至第一次被PATTERN匹配到的行的行首
- 工作模式
- 命令模式
- 打开文件首先进入命令模式,是使用
vi
的 入口 - 通过 命令 对文件进行常规的编辑操作,例如:定位、翻页、复制、粘贴、删除……
- 在其他图形编辑器下,通过 快捷键 或者 鼠标 实现的操作,都在 命令模式 下实现
- 打开文件首先进入命令模式,是使用
- 底行模式 —— 执行 保存、退出 等操作
- 要退出
vi
返回到控制台,需要在末行模式下输入命令 - 末行模式 是
vi
的 出口
- 要退出
- 编辑模式 —— 正常的编辑文字
- 编辑模式命令
命令 | 英文 | 功能 | 常用 |
---|---|---|---|
i | insert | 当前字符前 | 常用 |
I | insert | 行首 | 较常用 |
a | append | 当前字符后 | |
A | append | 行末 | 较常用 |
o | 行后插入一空行 | 常用 | |
O | 行前插入一空行 | 常用 | |
ZZ | 保存并退出 不需要冒号,编辑模式 |
- 底行模式常用命令
命令 | 功能 | |
---|---|---|
w | 保存 | |
q | 退出,如果没有保存,不允许退出 | |
q! | 强行退出,不保存退出 | |
wq | 保存并退出 | |
x | 等价于:wq |
-
命令模式常用命令
- 1)光标移动
命令 功能 h 向左 j 向下 k 向上 l 向右 - 2)行内移动
命令 功能 w 向后移动一个单词 b 向前移动一个单词 e 跳至当前或下一个单词的词尾 0 行首 ^ 行首,第一个不是空白字符的位置 $ 行尾 - 3 ) 行数移动
命令 功能 gg 文件顶部 G 文件末尾 数字G 移动到 数字 对应行数 翻屏 ctrl+f;后翻 ctrl+b 前翻 -
撤销和恢复撤销
命令 | 功能 |
---|---|
u | 撤销上次命令 |
CTRL + r | 恢复撤销的命令 |
. | 重复上一步的操作 |
- 删除和替换文本
命令 | 功能 |
---|---|
x | 删除光标所在字符,或者选中文字 |
数字x | 删除光标开始3个字符 |
c | 和移动命令连用,删除光标所在位置到指定位置内容 |
dw,dd | 删除本行 |
cw # 从光标位置删除到单词末尾
c0 # 从光标位置删除到一行的起始位置
cb # 从光标位置删除到单词开头
- 剪切、复制、粘贴
命令 | 功能 |
---|---|
yw,yy | 复制一行,可以 nyy 复制多行 |
ndd | 可以 复制多行 |
p,P | 粘贴 |
- 替换
命令 | 功能 | 工作模式 |
---|---|---|
r | 替换当前字符 | 命令模式 |
R | 替换当前行光标后的字符 | 替换模式 |
R
命令可以进入 替换模式,替换完成后,按下ESC
可以回到 命令模式
- 查找
命令 | 功能 |
---|---|
/str | 查找 str |
查找到指定内容之后,使用
n
查找下一个出现的位置
查找
命令 | 功能 |
---|---|
!ls -l / | 不退出编辑模式下进入bash下 |
:[范围]s/str/replace/g | 替换str为replace,范围(n:行号;.:当前光标行;+n:偏移n行; : 末 尾 行 , :末尾行, :末尾行,-3;%:全文) |
临近s命令的第一个字符为边界字符 :/,%,#
g:一行内全部替换
i:忽略大小写范围
1.2 Linux常用命令
- 学习目的
- Linux下有非常丰富的命令,可以用来完成大部分重要的Linux服务器操作维护功能,而且至今有些功能仍然通过命令操作比较方便。
- 实际工作中,大量服务器维护工作都是工程师通过远程控制来完成的,并没有图形界面,这时维护工作都需要通过命令来完成。
- 作为后端工程师,我们将来所写的代码都需要在服务器上运行,掌握基本的Linux 操作命令有助于我们将来对项目的部署和控制工作。
1.2.1 终端与命令行
-
终端 : 使用命令对Linux系统进行操作的窗口
-
命令行:书写Linux命令的提示行
-
打开关闭终端方法
- 点击图形界面终端图标,通过ctrl+alt +t ,shift+ctrl + t , shift+ctrl+n 都可以快速打开一个终端。
- 通过图形界面关闭,或者在命令行输入exit。
-
终端字体大小控制
- 放大 摁住 ctrl 和 + 号 (不要忘了+号要使用shift)
- 缩小 摁住 ctrl 和 - 号
1.2.2 Linux常用命令
-
命令格式
command [-options] [parameter] 说明: command:命令名称,一般为英文单词或单词的缩写 [-options]:命令选项,辅助命令进行功能细化,也可以省略 parameter:传给命令的参数,可以是0个或多个
1.2.2.1 帮助命令
command --help
说明:
显示
command
命令的帮助信息
man command
说明:
- 查阅
command
命令的使用手册,摁q退出
1.2.2.2 基础操作命令
序号 | 命令 | 作用 |
---|---|---|
01 | ls | 查看当前文件夹下的内容 |
02 | pwd | 查看当前所在文件夹 |
03 | cd [目录名] | 切换文件夹 |
04 | touch [文件名] | 如果文件不存在,新建文件 |
05 | mkdir [目录名] | 创建目录 |
06 | rm [文件名] | 删除指定的文件名 |
07 | cp | 复制一个文件 |
08 | mv | 移动一个文件 |
09 | clear | 清屏 |
- 部分命令细节说明
- ls : -l 展示详细信息,-a展示隐藏文件(Linux下 . 开头的为隐藏文件)。
- cd: 参数为绝对路径或者相对路径,直接cd表示回到主目录。
- touch: 可以同时跟多个参数表示创建多个文件。
- mkdir: -p选项可以创建层目录
- cp:如果拷贝的是一个目录需要使用 -r ,同时这个命令有另存为的作用
- mv: 即使移动目录页不需要选项,有重命名的作用。
- rm:删除表示直接删除,无法找回,如果删除目录需要加 -r选项
- clear:等同于ctrl-l,清空屏幕。
小技巧: 使用Tab键可以自动补全文件名,目录名等信息
-
通配符
- 作用:对一类文件名称的书写进行简化,例如file1.txt、file2.txt、file3.txt……,用户不必一一输入文件名,可以使用通配符完成。
通配符 含义 实例 星号(*) 匹配任意长度的字符串 用file_*.txt,匹配file_wang.txt、file_Lee.txt、file_Liu.txt 问号(?) 匹配一个长度的字符 用flie_?.txt,匹配file_1.txt、file_2.txt、file_3.txt 方括号([…]) 匹配其中指定的一个字符 用file_[otr].txt,匹配file_o.txt、file_r.txt和file_t.txt 方括号([ - ]) 匹配指定的一个字符范围 用file_[a-z].txt,匹配file_a.txt、file_b.txt,直到file_z.txt
1.2.2.3 文件操作
序号 | 命令 | 作用 |
---|---|---|
01 | cat 文件名 | 查看文件内容、创建文件、文件合并、追加文件内容等功能 |
less | ||
more | ||
02 | head 文件名 | 显示文件头部 |
03 | tail 文件名 | 显示文件尾部 |
04 | grep 搜索文本 文件名 | 搜索文本文件内容 |
05 | find 路径 -name 文件名 | 查找文件 |
06 | file 文件名 | 查看文件类型 |
07 | wc 文件名 | 查看文件行数,单词数等信息 |
08 | diff 文件1 文件2 | 对比两个文件差异 |
- 部分命令细节说明
- head,tail : 选项-n,n表示一个数字,即可指定查看前n行或者后n行,不加选项默认查看10行。-f 监控文件的内容增加
- grep : -n 用于显示行号,-i忽略大小写
- wc : -c 表示查看多少字符,-l查看多少行,-w 查看多少单词。如果不加选项则显示这三项。
- find:会从指定目录及其所有子目录中查询搜索文件。
1.2.2.4 压缩解压
序号 | 命令 | 作用 |
---|---|---|
01 | zip ,unzip | 将文件压缩为zip格式/将zip格式文件解压 |
02 | gzip,gunzip | 将文件压缩为gz格式/将gz格式文件解压 |
03 | bzip2,bunzip2 | 将文件压缩为bz2格式/将bz2格式文件解压 |
04 | tar | 对gz或者bz2格式进行压缩解压 |
-
部分命令细节说明
-
zip: 用于常与windows交互的情况,-r选项可以压缩目录
-
zip test.zip filelist
-
unzip test.zip
-
-
gzip,bzip2:不常用,因为压缩或者解压后源文件就不再了,而且只能对一个文件操作
-
tar:-cjf 用于压缩bz2格式文件,-czf用于压缩gz格式文件,-xvf用于解压文件,兼容了gzip和bzip2命令的功能。
-
tar -czf file.tar.gz file1 file2
-
tar -xvf file.tar.gz
-
-
1.2.2.5 权限管理
序号 | 命令 | 作用 |
---|---|---|
01 | sudo | 放在一个命令前,表示使用管理员权限执行 |
02 | chmod | 修改文件权限 |
-
部分命令细节说明
-
sudo: 在打开终端第一次使用sudo时需要输入密码
-
chmod
在设置权限时,可以字母也可以使用三个数字分别对应 拥有者 / 组 和 其他 用户的权限
直接修改文件|目录的 读|写|执行 权限,但是不能精确到 拥有者|组|其他 chmod augo+/-rwx 文件名/目录名
例如:
777
===>u=rwx,g=rwx,o=rwx
755
===>u=rwx,g=rx,o=rx
644
===>u=rw,g=r,o=r
-
1.2.2.6 显示展示命令
序号 | 命令 | 作用 |
---|---|---|
01 | echo | 向终端打印内容 |
02 | date | 显示当前时间 |
03 | df | 显示磁盘剩余空间 |
04 | whoami | 显示当前用户 |
05 | which | 显示执行命令所在位置 |
-
部分命令细节说明
-
echo : -n表示打印完成不换行
-
df: -h选项以M为单位显示,-T显示文件系统类型 ext4的为磁盘
-
which:命令也是一个程序,实际就是显示程序所在位置
-
-
输出重定向
重定向符 含义 实例 > file 将file文件重定向为输出源,新建模式 echo “hello world” > out.txt,将执行结果,写到out.txt文件中,若有同名文件将被删除 >> file 将file文件重定向为输出源,追加模式 ls /usr >> Lsoutput.txt,将ls /usr的执行结果,追加到Lsoutput.txt文件已有内容后 -
管道
管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。
ls | grep 'test'
1.2.2.7 其他命令
序号 | 命令 | 作用 |
---|---|---|
01 | shutdown | 关机或者重启 |
02 | ln | 创建链接 |
-
部分命令细节说明
-
shutdown:
-
shutdown -r now 立即重启
-
shutdown now 立即关机
-
shutdown +10 10分钟后关机
-
shutdown -c 取消关机计划
-
-
ln : 一般使用 -s 选项 创建软链接,相当于快捷方式。
ln -s hello.py hello
-
二、文件与目录
2.1 目录与文件的权限意义
2.1.1 权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件,数据库内容文件,二进制可执行文件(binary program)等等,因此,文件权限有如下意义:
r(read):可读取此文件的实际内容,如读取文本文件的文字内容等;
w(write):可以编辑、新增或者是修改该文件的内容
x(execute):该文件具有可以被系统执行的权限。
注意:在Linux中,文件是否能被执行是由是否具有”x”这个权限来决定,与拓展名无关。
2.1.2 权限对目录的重要性
r(read contents in directory):表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。所以你就可以利用ls这个指令将该目录的内容列表显示出来。
w(modify contents of directory):这个可写入的权限对目录来说,表示你具有改变目录结构清单的权限,也就是底下这些权限:
建立新的文件或子目录;
删除已经存在的文件或子目录(不论该文件的权限)
将已存在的文件或目录进行重命名;
移动该目录内的文件、目录位置。
x(access directory):在Linux中,目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途。所谓的工作目录(work directory)就是你目前所在的目录。举例来说,当你登入Linux时,你所在的Home目录就是你当下的工作目录。
综上:
2.2 Linux文件种类与拓展名
2.2.1 文件类型(了解)
1.文件
正规文件(regular file):就是一般我们在进行存取的类型的文件,在由ls -al所显示出来的属性方面,第一个字符为[ - ],例如[-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:
纯文字档(ASCII):这是Linux系统中最多的一种文件类型,称为纯文本文件是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。举例来说,你可以使用[cat ~/.bashrc]就可以看到该文件的内容。(cat是将一个文件内容读出来的指令)
二进制文件(binary):你的Linux当中的可执行文件(scripts,文字批处理文件不算)举例来说,刚刚下达的命令cat就是一个binary file。
数据格式文件(data):有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件(data file)。举例来说,我们的Linux在用户登录时,都会将登录的数据记录在/var/log/wtmp那个文件内,该文件是一个data file,通过last这个命令读出来。但是使用cat时,会读出乱码,因为他是属于一种特殊格式的文件。
2.目录(directory):
第一个属性为[ d ],例如[drwxrwxrwx]。
3.连接文件(link):
就是类似Windows系统中的快捷方式,第一个属性为[ l ],例如[lrwxrwxrwx];
4.设备与设备文件(device):
与系统外设及储存等相关的一些文件,通常都集中在/dev这个目录之下,通常又分为两种:
块(block)设备文件:就是一些储存数据,以提供系统随机访问的接口设备,举例来说,硬盘与软盘等,你可以随机的在硬盘的不同内存块读写。你可以自行查一下/dev/sda看看,会发现第一个属性为[ b ]。
字符(character)设备文件:也即是一些串行端口的接口设备,例如键盘、鼠标。这些设备的特色就是”一次性读取“的,不能够截断输出。举例来说,你不可能让鼠标跳到另一个界面,而是滑动到另一个地方。第一个属性为[ c ]。
5.数据接口文件(sockets):
既然被称为数据接口文件,这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求,而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为[ s ],最常在/var/run目录中看到这种文件类型了。
6.数据输送文件(FIFO,pipe):
FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为[p]。
2.2.2 Linux文件拓展名
基本上,Linux的档案是没有所谓的扩展名的,一个Linux档案能不能被执行,与他的第一栏的十个属性有关,与文件名根本一点关系也没有。这个观念跟Windows的情况不相同,在Windows中,能被执行的文件扩展名通常是.exe .bat等等,而在Linux底下,只要你的权限当中具有x的话,例如[ -rwxr-xr-x ]即代表这个文件具有可以被执行的能力。虽然如此,我们还是可以通过拓展名来了解这个文件格式,常用的拓展名有以下这些:
*.sh:脚本或批处理文件(scripts),因为批处理文件由shell写成,拓展名即为.sh。
*Z,tar,tar.gz,.zip,.tgz:经过打包的压缩文件。这是因为压缩软件分别为gunzip,tar等等,因为压缩文件不同,取其对应的拓展名。
.html,.php:网页相关文件,分别代表HTML语法与PHP语法的网页文件,.html的文件可使用浏览器来直接开启。
基本上Linux系统上的文件拓展名只是为了让你了解文件的用途,是否执行还得需要对应的文件权限。
Linux文件长度限制
在Linux下,使用传统的Ext2/Ext3/Ext4文件系统时,针对文件的文件名长度限制为:
单一文件或目录的最大容许文件名为255bytes,以一个ASCII英文占用一个bytes来说,则大约可达255个字符长度。若是以每个中文字占用2bytes来说,最大文件名就是大约在128个中文字左右。
Linux文件名称的限制:
由于在Linux在文字界面下的一些命令操作关系,我们尽量避免使用某些特殊字符,例如, * ? >< ; & ! [ ] | \ ’ " ` ( ) { }
2.3 Linux目录配置标准:FHS
在了解了每个文件的相关种类和属性,以及了解如何修改文件属性/权限的相关信息后,再来要了解的就是,为什么每套Linux distribution(发行版)的配置文件、执行文件、每个目录内放置的内容其实都差不多?原来是有一套标准依据的。我们下面就来介绍这方面的内容。
参考《鸟哥Linux私房菜基础学习篇》(第三版)6.3节
FHS(Filesystem Hierarchy Standard)标准主要目的是希望让用户,可以了解到已安装软件通常放置于那个目录下。换句话说,FHS重点在于规范每个特定目录下应该要放置什么样的数据而已。
下表中的目录是一些具有代表性的目录:
2.3.1 四种类型
上面的表格中出现了一些典型的目录,同时出现了四种类型,我们先不要管这些目录,先来了解下四种类型:
可分享的:可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据,是能够分享给网络上其他主机挂载用的目录;
不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等,由于仅与自身机器有关,所以当然就不适合分享给其他主机了。
不变的:有些数据是不会经常变动的,不会跟随着distribution而变动。例如函式库、文件的说明文件、系统管理员所管理的主机服务配置文件等等;
可变动的:经常改变的数据,例如登录文件、普通用户可接收的新闻组等。
事实上,FHS针对目录树结构仅仅定义了三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
/(root根目录):与开机系统有关;
/usr(UNIX software resource):与软件安装/执行有关;
/var(variable):与系统运作过程有关;
注意:这个root在Linux里面的意义真的很多很多,躲到让人搞不懂那是啥玩意儿。如果以“账号”的角度来看,所谓的root指的是“系统管理员”的身份;如果以“目录”的角度来看,所谓的root意指根目录(/).
2.3.2 根目录(/)的意义与内容
根目录是整个系统最重要的一个目录,因为所有目录都是由根目录衍生出来的,同时根目录也与开机,还原,系统修复等操作有关。
FHS标准建议:根目录(/)所在的分区越小越好,且应用程序安装的软件最好不要与根目录放在同一个分区内。这样做不但性能较好,根目录所在文件系统也较不容易发生问题。也是基于此原因,FHS定义出根目录(/)下要有这些子目录的存在才好:
目录 应放置的文件内容
/bin 放置系统执行文件的目录,但是/bin比较特殊,因为/bin放置的是单用户维护模式下
还能够被操作的命令。在/bin下面的命令可以被root与一般账号所使用,
主要有cat、chmod、chown、mv、mkdir、cp、vi等常用命令
/boot 主要放置系统开机会使用到的文件,包括Linux内核文件以及开机菜单与开机所需配置文件等。
Linux kernel(内核)常用的文件名为vmlinuz,如果使用的是grub这个引导装载程序,
则还会存在/boot/grub这个目录
/dev 任何设备与接口设备都是以文件的形式保存在该目录下。你只需要通过访问这个目录下的
某个文件就等于访问某个设备。比较重要的文件有
/dev/null,/dev/zero,/dev/tty,/dev/lp*,/dev/hd*,/dev/sd*等
/etc 放置系统主要的配置文件。比如:人员的账号密码文件、各种服务的起始文件等。
一般来说,这个目录下的各文件属性时可以让一般用户查阅的,但是只有root用户权修改。
FHS建议,该目录下不要放可执行文件(binary)。
比较重要的文件有/etc/inittab,/etc/modprobe.conf,/etc/fstab等。
比较重要的目录如下:
/etc/init.d/ 所有服务的默认启动脚本都是放在这里的,
例如要启动或关闭iptable是的话:/etc/init.d/iptables start、
/etc/init.d/iptables stop
c/X11/ 与X Window有关的各种配置文件都在这里。
/etc/xinetd.d/ 这就是所谓的super daemon管理的各项服务的配置文件目录。
/home 这是系统默认的用户主文件夹(home directory)。在你创建一个一般用户账号时,
默认的用户主文件夹都会规范到这里。比较重要的是,主文件夹有两种代号:
~:代表当前用户的主文件夹(如当前用户为hadoop,命令行前缀[hadoop@localhost ~]$
时表示当前目录为/home/hadoop/;也可以在其它目录使用命令“cd ~”进入当前用户主目录)
~dmtsai:则代表dmtsai的主文件夹(如:cd ~hadoop
则进入hadoop账户的主目录/home/hadoop/)。
/root 系统管理员root的主文件夹。之所以放在这里,
是因为如果进入单用户维护模式而仅挂载根目录时,该目录就能够拥有root的主文件夹,
所以我们会希望root的主文件夹与根目录放置在同一个分区中。
/sbin Linux有非常多的命令是用来设置系统环境的,这些命令只有用户root用来“设置 ”系统,
其他用户最多只能用来“查询”而已。放置/sbin下的为开机过程所需要的,
包含开机、修复、还原系统所需的命令。
/lib 系统函数库非常多,而/lib放置的则是在开机时会用到的函数库,
以及在/bin或/sbin下面的命令会调用的函数库而已。
/media Media“媒体”的意思,该目录下面放置的可以删除的设备。
包括软盘、光盘、DVD等设备都暂时挂载于此。
/mnt 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。
media出现之前,该目录和media目录作用相似,media目录出现之后,该目录便用来暂时挂载。
/opt 第三方软件放置目录,如jdk、tomcat
/srv service的缩写,是一些网络服务启动之后,这些服务所需要取用的数据目录。
常见的服务如www、ftp等。www服务需要的网页数据就可以放置在/src/www/里面。
/tmp 这是一般用户或正在执行的程序放置临时文件的地方。这个目录任何人都可以访问,
所以你需要定期清理一下。当然重要的数据不可放置在此目录。
以为FHS甚至建议在开机时,应该将/tmp目录下的数据删除。
事实上FHS针对根目录所定义的标准就仅有上面列举的数据,不过下面几个目录也是linux系统中非常重要的目录
目录 应放置文件内容
/lost+found 这个目录是使用标准的ext2、ext3文件系统格式才会产生的目录,目的在于当系统发生错误时,
将一些丢失的片段放置到这个目录下。这个目录通常会在分区的最顶层存在,
例如你加载一块硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录
“/disk、lost+found”
/proc 该目录本身是一个虚拟文件系统。它放置的数据都是在内存当中,
例如系统内核、进程(process)、外部设备的状态及网络状态等。
因为这个木下的数据都是在内存当中,所以本身不占任何硬盘空间。
/sys 该目录和/proc非常相似,也是一个虚拟的文件系统,主要也是记录与内核相关的信息。
包括目前已经加载的内核模块与内核检查到硬件设备信息等。这个目录同样不占用磁盘容量。
除了这些目录的内容之外,另外要注意的是,早期Linux在设计的时候,若发生问题时,救援模式通常仅挂载根目录而已,其他分区则是在开机完成之后才会持续进行挂载的行为。因此根目录下与开机过程有关的目录就不能够与根目录放到不同的分区。哪些目录不可与根目录分开呢?
/etc:配置文件
/bin:重要执行文件
/dev:所需要的设备文件
/lib:执行文件所需要的函数库与内核所需的模块
/sbin:重要的系统执行文件。
而现在许多的Linux distributions由于已经将许多非必要的文件移出/usr之外了,所以/usr也是越来越精简,同时因为/usr被建议为:即使挂载成为只读,系统还是可以正常运作的模样,所以救援模式也能同时挂载/usr。例如我们的这个CentOS 7.x版本在救援模式的情况下就是这样。因此那个五大目录的限制已经被打破。例如CentOS 7.x就已经将/sbin,/bin,/lib通通移动到/usr底下。
2.3.3 /usr的意义与内容
依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable,static),如果你知道如何通过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给区域网络内的其他主机来使用。
另外,usr是UNIX Software Resource的缩写(不是user的缩写),说明里面放置的是UNIX操作系统资源,而非很多同学所误认为的用户数据。
由于所有系统默认的软件都会放置到/usr下面,因此这个目录有点类似Windows系统的“C:\Window”和“C:\Program Files”这两个目录的综合体,为此这个目录会占用最多的硬盘容量,一般来说,/usr的子目录建议有以下这些:
目录 应放置的文件内容
/usr/bin/ 绝大部分的用户可使用的命令都放在这里。注意与/bin的不同(是否与开机过程有关)
/usr/include/ C/C++等程序语言的头文件(header)和包含文件(include)放置处,
当我们以tarball方式(*.tar.zip的方式安装软件)安装某些数据时,
会使用到该目录下的许多文件。
/usr/lib/ 包含各应用软件的函数库、目标文件,以及不被一般用户管用的执行文件或脚本(script)。
某些软件会提供一些特殊的命令来进行服务器设置,
这些命令也不会经常被系统管理员使用,那就会被放置到该目录下。
注意:如何你使用的X86_64的Linux系统,那可能会有/usr/lib64目录产生。
/usr/local 系统管理员在本机自行安装自己下载的软件(非distribution默认提供者,如jdk、tomcat),
建议安装到该目录。这样会比较便于管理。另外你的distribution提供的软件较旧,
你想安装较新的软件,但又不想删除旧版本的话,可以将新版本安装到该目录下,
可与原先的旧版本有区别(/usr/local/目录下也存在bin、etc、lib、sbin、include…)
/usr/sbin 非系统正常运行所需要的系统命令。
/usr/src 一般源代码建议放置该目录下,src有source的意思。
至于内核源代码建议放置到/usr/src/linux/目录下。
/usr/share 放置共享文件的地方,在这个目录下放置的几乎都是文本文件。常见的子目录:
/usr/share/man 在线帮助文档
/usr/share/doc 软件杂项的文件说明
/usr/share/zoneinfo 与时区有关的时区文件。
2.3.4 /var的意义与内容
/var目录在系统运行后才会渐渐占用磁盘容量的目录,主要针对常态性变动的文件,包括缓存(cache),登陆文件(log file)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者数据库的文件等等,其常见的子目录如下所示:
目录 应放置文件内容
/var/cache/ 应用文件在运行过程中会产生的一些缓存文件。
/var/lib/ 程序本身执行过程中,需要使用到的数据文件放置的目录。
在此目录下各自的软件应该要有各自的目录。举例来说rpm数据库则放置到/var/lib/rpm目录下。
/var/lock/ 某些设备或者文件资源一次只能被一个应用程序使用,
如果同时两个程序使用该设备是就可能产生一些错误状况,
因此就得将该设备上锁(lock),以确保该设备同时只会给单一设备使用。比如刻录机
/var/log/ 这是登录文件放置的目录。
/var/mail/ 放置个人电子邮箱的目录,通常这个目录为连接文件,连接/var/spool/mail/目录。
/var/run/ 某些程序或服务启动后,会将他们的PID放置到这个目录下。
/var/spool/ 这个目录通常放置一些队列数据,所谓“队列”数据就是等待其他程序使用的数据。
这些数据被使用后通常会被删除。如:系统收到新邮件会放置到/var/spool/mail/目录下,
当用户收下该信件后,原则上该目录下的这封信将会被删除。
2.3.5 目录树(directory tree)
我们知道在Linux下所有文件与目录都是由根目录开始,然后在一个个分支走下去,我们将这种结构称作目录树,其主要特性有以下几点:
1.目录树的起始点为根目录(/,root);
2.每一个目录不止能使用本地端的partition的文件系统,也可以使用网络上的文件系统。举例来说,可以利用Network File System(NFS)服务器挂载某特定目录等。
3.每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。
通过操作我们可以看到CentOS在根目录下的数据:
若将整个目录树以图示的形式来显示,重要的文件资料列出来,整个架构会像以下图中的模样:
这里只有就各目录进行的简单解释,详细解释查看2.6.1中的表格
2.4 目录的相关操作
2.4.1 绝对路径与相对路径
文件名是我们的另一个关注点,因为文件名写法的不同,可以将路径(path)分为绝对路径(absolute)和相对路径(relative)。这两种文件名/路径的写法依据如下:
绝对路径:由根目录(/)开始写起的文件名或目录名。
相对路径:相对于当前路径的文件名写法。
在Linux中:
“.”代表当前目录,也可以使用./来表示
“…”代表上一层目录,也可以使用…/来表示
案例:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?
答:由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中,因此最简单的指令下达方法为:
cd /var/spool/mail
cd …/cron
思考:请问Linux系统的根目录下是否存在[…]?
答:使用ls-al查询,发现存在[…]目录,仔细查询[.]和[…]的属性和权限完全相同,这代表[…]与[.]是同一个目录。
需要特别注意的是:在所有目录下都会存在两个目录,[.]和[…]。
2.4.2 目录的相关操作
在Linux下有一些比较特殊的目录(除了前文讲到的“.”和“…”):
-代表前一个工作目录
~代表当前用户所在的home目录
~account代表account账户这个用户的home目录
几个常见的目录操作命令:
cd(changedirectory):改变目录
pwd(print working directory):显示当前目录
mkdir:新建新的目录
rmdir:删除一个空目录
2.4.3 可执行文件路径的变量:$PATH
我们直到,在Linux所使用的命令都是对应的文件。那么为什么我们在任何地方均可以执行某些命令呢?这就是PATH变量起到的作用。
PATH这个变量由一些目录组成,每个目录由:分隔,这些目录有先后顺序,若是将目录加入到PATH中,那么在PATH中定义的这些目录中便可以执行相关命令。
将某一目录加入到PATH当中:
那么/root下的命令文件便可以到处执行了。
有兴趣的同学,可以将某些命令从原有路径中挪出来,将该命令放入一个新建的目录中。你可以尝试该命令能否生效,再试试将该目录加到PATH中,看看能否生效。(记得做还原,否则系统的命令不能用了就尴尬了…)
综上&补充:
不同用户默认的PATH不同,默认可执行的命令也不同
PATH可以做修改
指令最好放在正确的目录下,以保证正确的执行
本目录(.)出于安全考虑,不建议加入到PATH当中
2.5 文件与目录管理
2.5.1 文件与目录的查看:ls
2.5.2 复制,删除和移动:cp,rm,mv
cp(复制文件或目录):
rm(移除文件或目录)
rm是remove的缩写,在使用时需要注意文件不要被root误删。默认删除文件或者空目录。若要连同目录中的内容一起删除,那么使用-r选项进行循环删除。
mv(移动文件与目录,或重命名)
mv是move的意思,我们通过它可以进行文件或目录的移动,同时我们用的多的是文件或文档的重命名。关于重命名Linux提供了另一个命令,rename,感兴趣的同学可以通过manrename查询使用方法。
2.5.3 取得路径的文件名称与目录名称
每个文件的完整文件名包括了前面的目录与最终的文件名,而每个文件名的长度都可以达到255字符。我们通过”/”来判断文件名还是目录名.
2.5.4 文件内容查看!!!
常用命令如下:
cat:由第一行开始显示文件内容
tac:从最后一行开始显示
head:只看头几行
tail:只看尾部几行
nl:显示的时候,连同行号一并输出
more:一页一页的显示文件内容
less:和more类似,但是可以向前翻页
od:以二进制方式读取文件内容
2.5.1.1 直接查看文件内容
直接查看一个文件的内容可以使用cat,tac,nl这几个指令
cat(concatenate):
cat是concatenate的缩写,其功能时间一个文件的内容连续的输出。该命令适合看行数较少的文件。另外,需要查看一般DOS文件时,可以通过-A选项来显示换行符和[tab]。
tac(反向输出):
与上面的cat命令进行比较,是由最后一行先显示。
tac功能与cat类似,但是是由文件最后一行反向连续输出到屏幕上。
nl(添加行号打印):
nl可以将输出的文件内容自动的加上行号。
2.5.1.2 可翻页查看
more(一页一页翻动):
more会在最后一行输出目前按显示内容的所占百分比,在现实过程中我们还可以输入以下命令进行进一步操作:
空格(space):向下翻页
回车(Enter):向下翻一行
“/字符串”:在当前显示内容中线下查询字符串内容
“:f”:立即显示出文件名以及目前显示的行数
“q”:离开显示内容
“b”或[ctrl]-b:代表回翻,该操作仅对文件有效
less(一页一页翻动)
查看文件内容的时候可以进行一下操作:
空格:向下翻一页
[pagedown]:向下翻动一页
[pageup]:向上翻动一页
“/字符串”:向下搜索字符串内容
“?字符串”:向上搜寻字符串内容
n:重复上一次查询任务
N:反向重复前一个查询任务
g:到文件的第一行
G:到文件的最后一行(注意大小写)
q:离开文件
2.5.1.3 文件选取
head(取出前面几行,Centos6.5使用/etc/man.config文件):
tail(取出后面几行Centos6.5使用/etc/man.config文件):
2.5.1.4 非纯文本文件:od(了解)
2.5.1.5 修改文件时间或创建新文件:touch
linux记录文件的时间参数主要有三个:
modification time(mtime):当文件内容被修改了,就会更新该时间
statustime(ctime):文件的属性,权限被修改,会更新该时间
accesstime(atime):文件内容被访问了,会更新该时间
在linux中ls显示出来的是该文件的mtime,也就是这个文件内容上次被改动的时间。
通过touch指令,我们可以轻易修改文件的日期与时间,touch最常用的情况如下:
创建一个新文件
将某个文件日期修改为当前时间(mtime和atime)
范例演示。
2.6 文件与目录的默认权限与隐藏权限
我们之前学习过文件与目录的基本权限,以及文件与目录的属性。其实在linux中,除了基本权限r,w,x等权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性。可以通过chattr来设定,以lsattr来查看。
2.6.1 目录默认权限:umask
umask就是指定当前用户在创建档案或目录时的权限默认值。
不难发现,umask一共有四组数据,其中,第一组是特殊权限用的,后面三个是普通权限使用的。我们先来看后面三个普通权限,默认情况如下:
若当前用户创建新文件,默认没有可执行权限,即-rw-rw-rw
若当前用户创建新目录,由于可执行权限决定能否进入该目录,为此默认所有权限均开放,即drwxrwxrwx
而需要注意的是,umask的计算方式是,默认值为需要减去的权限。举例说明,若umask为022,对于当前用户:
创建新文件时:(-rw-rw-rw)-(-----w–w-) =-rw-r—r–
创建新目录时:(drwxrwxrwx)-(d----w–w-) =drwxr-xr-x
设置umask:
2.6.2 文件隐藏属性
chatter(设置文件隐藏属性):
需要注意,chattr指令只能在Ext2/Ext3/Ext4的创痛文件系统上面完整生效,其他的文件系统可能就无法完整的支持该指令。
由于隐藏属性在体统数据安全上非常重要,所以需要以lsattr查看。上述选项中常用的是+i,+a两个选项。
lsattr(显示文件隐藏属性):
2.6.3 文件特殊权限:SUID,SGID,SBIT!(了解)
注意上面文件的权限,发现两个特殊权限(s与t),我们来详细看下:
Set UID
当s权限出现在文件拥有者的x权限位置上时,例如上述的/usr/bin/passwd这个文件,此时就被称作SetUID,简称SUID。它的特点如下:
SUID权限仅对二进制程序有效
执行者对于该程序需要具有x的可执行权限
该权限仅在执行该程序的过程中有效(run-time)
执行者将具有该程序拥有者(owner)的权限
举例说明:
Linux下所有账号密码存在/etc/shadow这个文件中:
该文件仅仅能被root可读,且仅可被root强制写入。当前用户能通过passwd命令进行密码的修改就是通过SUID实现的。具体过程如下:
1.当前用户对/usr/bin/passwd是有x权限的,表示当前用户能够执行passwd
2.passwd的拥有者是root
3.当前用户在执行passwd的过程中或暂时获得root权限
4./etc/shadow就可以被当前用户所执行的passwd命令修改
但是如果当前用户直接使用cat去读取/etc/shadow时,是被拒绝的,因为cat不具有SUID权限。
SetGID
当s权限在文件拥有者的x位置上时,s所在的用户组的x被称为Set GID,简称SGID。
它有如下特点:
1.SGID对二进制程序有效
2.程序执行者对于该程序而言,需要具备x权限
3.执行者在执行过程中将会获得该用户组的支持
举例说明:/usr/bin/locate这个程序,可以查询/var/lib/mlocate.db这个文件的内容,它们的权限如下:
与SUID类似,若使用当前用户去执行locate,那么当前用户会取得slocate用户组的支持,因此就能够去读取mlocate.db了。
处理二进制程序,SGID也可以用在目录上,当一个目录设置了SGID权限后,她将具有以下功能:
1.使用者若对于此目录具有r与x的权限时,该使用者能够进入此目录
2.使用者在此目录下的有效群组(effective group)将会变成该目录的群组
3.用途:若使用者再次目录下具有w的权限(可以新建文件),则使用者所创建的新文件,该新文件的用户组与此目录的用户组相同。
Sticky Bit:
SBIT目前仅针对目录有效,它对于目录的作用是:
1.当使用者对于此目录具有w,x权限,也就是具有写入权限
2.当使用者在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件
换句话说,当甲这个使用者对于A目录是具有同组或其他人的身份,且拥有该目录w的权限,这表示甲使用者对该目录内内任何人创建的目录或文件均可进行”删除/更名/搬移”等动作。但是当A目录上加了SBIT权限时,则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无权操作其他人的文件。
2.6.4 SUID/SGID/SBIT权限的设置(了解)
SUID为4
SGID为2
SBIT为1
除了数字修改权限,还可以通过符号修改权限:
SUID为u+s
SGID为g+s
SBIT为o+t
2.6.5 查看文件类型:file!!!
我们可以通过file命令来查看文件的基本数据类型:
2.7 命令与文件的查找
2.7.1 命令文件名的搜索!!!
which(寻找”可执行文件”)
这个命令是根据PATH这个环境变量所规范的路径,去搜索”可执行文件”的文件名。which后面接的是完整文件名,若加上-a选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已。
2.7.2 文件文件名的查询
对于文件的查询,我们通常先使用whereis或locate来检查,如果这两种方法找不到,那就是用find来查找。whereis只找系统中某一些特定目录下的文件而已,locate则是利用数据库来搜索文件名。
whereis(从一些特定的目录中寻找文件文件名)
whereis可以加入选项来寻找相关的数据。
whereis主要是针对/bin/sbin下面的可执行文件,以及/usr/share/man下面的manpage文件,以及其他几个特殊目录。可以使用whereis-l来查看它所查询的目录。
locate/updated(contos 6.5不支持)
locate+文件部分名称。
它的使用是通过/var/lib/mlocate/里面的数据来进行查询。而/var/lib/mlocate/的更新频率取决于不同distribution。为此你新建一个文件,在未更新/var/lib/mlocate/之前,你无法找到的。
更新/var/lib/mlocate/通过updatedb命令来实现。updatedb指令回去读取/etc/updated.conf这个配置文件进行更新。
find
对于上述时间的计算方法,可以参见下面这张图:
+4代表大于等于5天前的文件名
-4代表小于等于4天内的文件文件名
4代表4-5那一天的文件文件名
除上述用法之外,find命令还可以做以下用法:
范例八:
该范例中特殊的地方有{}以及;还有-exec这个关键字,意义如下:
{}代表的是”由find找到的内容”,如上图所示,find的查询结果会被放置到{}中;
-exec到;是关键字,在本例中就是”ls-l{}”
注意:”;”在bash环境下是有特殊意义的,为此利用反斜线来转义
此外find还可以模糊查询:
可以查询目录,以及子目录,并且可以利用其他选项与参数来着找到正确的文件名,但是由于它会扫描整个硬盘,效率较低。
三、文件压缩与打包
压缩:指通过某些算法,将文件尺寸进行相应的缩小,同时不损失文件的内容。
打包:指将多个文件(或目录)合并成一个文件,方便传递或部署。
压缩文件或打包文件常见的扩展名: .tar.gz, .tar.bz2;linux系统一般文件的扩展名用途不大,但是压缩或打包文件的扩展名是必须的,因为linux支持的压缩命令较多,不同的压缩技术使用的压缩算法区别较大,根据扩展名能够使用对应的解压算法。
常见文件扩展名:
.tar.gz tar程序打包的文件,并且经过 gzip 的压缩
.tar.bz2 tar程序打包的文件,并且经过 bzip2 的压缩
tar命令,选项与参数:
-c :建立打包文件,
-t :查看打包文件的内容含有哪些文件
-x :解打包或解压缩的功能,可以搭配-C(大写)在特定到特定目录解开
-j :通过bzip2的支持进行压缩/解压缩:此时文件最好为 *.tar.bz2
-z :通过gzip的支持进行压缩/解压缩:此时文件最好为 *.tar.gz
-v :在压缩/解压缩的过程中,将正在处理的文件名显示出来
-f filename:-f 后面跟处理后文件的全名称(路径+文件名+后缀名)
-C 目录:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个 选项
-p :保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件
注意 -c, -t, -x 不可同时出现在一串指令列中
tar常用的指令组合!!!
打包与压缩:
tar –zcv –f [/路径/]filename.tar.gz 被压缩的文件或目录
tar –jcv –f [/路径/] filename.tar.bz2 被压缩的文件或目录
练习:将/etc目录下的所有文件打包并压缩/tmp/part1/tar/etc01.tar.gz
将/etc目录下的所有文件打包并压缩/tmp/part1/tar/etc02tar.bz2
查询:
tar –ztv –f [/路径/] filename.tar.gz
tar –jtv –f [/路径/] filename.tar.bz2
备份:
tar –zpcv –f [/路径/]filename.tar.gz 被备份文件或目录
tar –jpcv –f [/路径/]filename.tar.bz2 被备份文件或目录
解压到当前目录:
tar –jxv –f [/路径/] filename.tar.bz2
tar –zxv –f [/路径/] filename.tar.gz
解压到指定目录:
tar -jxv -f [/路径/] filename.tar.bz2 –C 指定目录
tar -zxv -f [/路径/] filename.tar.gz -C 指定目录
注意:filename前带路径表示该路径下的,反之表示当前目录下
将/etc压缩到/tmp/下etc01.tar.gz
方式一:filename.tar.gz前不带路径
[root@node1 ~]# cd /tmp/
[root@node1 tmp]# tar -zcvf etc01.tar.gz /etc/
方式二:filename.tar.gz前带路径
[root@node1 ~]# tar -zcvf /tmp/etc01.tar.gz /etc
将/tmp/下etc01.tar.gz解压到/tmp/目录下
[root@tedu ~]# cd /tmp/ #首先进入对应目录
[root@tedu tmp]# tar -zxvf etc01.tar.gz
将/tmp/下etc01.tar.gz解压到/usr/目录下
[root@tedu tmp]# tar -zxvf etc01.tar.gz -C /usr
或者
[root@tedu tmp]# tar -zxvC /usr -f etc01.tar.gz