目录
- 1. Linux 文件
- 2. Linux 中的 tmpfs 和 /dev/shm/
- 3. 如何使用 Linux sed 命令进行字符串替换
- 4. Linux 下在某行的前一行或后一行添加内容
- 5. 我用到的实例
- 6. 什么是 `sed`
- 7. 命令格式
- 8. 选项
- 9. 参数
- 10. sed 命令
- 11. `sed` 替换标记
- 12. `sed` 元字符集
- 13. sed 用法实例
- 13.1. 替换操作: `s` 命令
- 13.2. 全面替换标记 `g`
- 13.3. 定界符
- 13.4. 删除操作: `d` 命令
- 13.5. 已匹配字符串标记 `&`
- 13.6. 子串匹配标记 `\1`
- 13.7. 组合多个表达式
- 13.8. 引用
- 13.9. 选定行的范围: `,`(逗号)
- 13.10. 多点编辑: `e` 命令
- 13.11. 从文件读入: `r` 命令
- 13.12. 写入文件: `w` 命令
- 13.13. 追加 (行下): `a\` 命令
- 13.14. 插入 (行上): `i\` 命令
- 13.15. 下一个: `n` 命令
- 13.16. 变形: `y` 命令
- 13.17. 退出: `q` 命令
- 13.18. 保持和获取: `h` 命令和 `G` 命令
- 13.19. 保持和互换: `h` 命令和 `x` 命令
- 13.20. 脚本 `scriptfile`
- 13.21. 打印奇数行或偶数行
- 13.22. 打印匹配字符串的下一行
- 13.23. Disable PasswordAuthentication and Enable PubkeyAuthentication on Sakura VPS.
- 14. nano
- 15. Linux 安装 rz 和 sz
- 16. Linux 安装与配置 FTP、SFTP
- 17. Linux 文件权限详解
- 18. 文件命令
- 19. 文件夹命令
- 20. 文件与文件夹综合命令
- 21. Linux 下载文件
- 22. Linux 磁盘操作命令
- 23. Linux 系统的顶层目录结构
- 24. 文件怎么放
- 25. 用 tail 监视 crontab 执行的 log 文件
- 26. Linux 压缩与解压文件
- 27. Linux 下保护文件命令 chattr
1. Linux 文件
文件浏览工具nautilus
1.1. Linux 文件描述符
最近在复习 tcp/ip 知识, 其中有关的一个问题 “一台服务器做多支持多少个 TCP 链接” 和 Linux 下的文件描述符有关, 学习一下。
Linux 中, 一切设备都是文件, 对文件的操作都是通过文件描述符来进行的。
文件描述符的定义: 文件描述符在形式上是一个非负整数。实际上, 它是一个索引值, 指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时, 内核向进程返回一个文件描述符。在程序设计中, 一些涉及底层的程序编写往往会围绕着文件描述符展开。
1.1.1. Linux 中有 7 种文件类型
文件类型 | 描述 | 符号 |
---|---|---|
普通文件 | 最常使用的一类文件, 其特点是不包含有文件系统信息的结构信息。这种类型的文件是按照其内部结构又可分为纯文本文件 (ASCII)、二进制文件 (binary)、数据格式的文件 (data)、各种压缩文件。 | REG (-) |
目录文件 | 用于存放文件名以及其相关信息的文件, 是内核组织文件系统的基本节点。 | DIR (d) |
块设备 | 块设备文件 : 就是存储数据以供系统存取的接口设备, 简单而言就是硬盘。 | BLK (b) |
字符设备 | 字符设备文件: 即串行端口的接口设备, 例如键盘、鼠标等等。 | CHR © |
套接字 | 这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求, 客户端就可以通过套接字来进行数据通信。 | SOCK(s) |
管道 | 一种很特殊的文件, 主要用于不同进程的信息传递。 | FIFO § |
链接 | 一种特殊文件, 指向一个真实存在的文件链接, 类似于 Windows 下的快捷方式, 链接文件的不同, 又可分为硬链接和软链接。 | LNK (l) |
1.1.2. 最大文件描述符数量
用户级限制: ulimit -n
可以查看结果
[root@jay ~]# ulimit -n
65535
系统级限制: cat /proc/sys/fs/file-max
[root@jay ~]# cat /proc/sys/fs/file-max
363326
临时修改最大数量:
ulimit -n 20000 将最大值改为 20000
需要注意的是普通用户首次使用该命令修改最大数量后再次使用 ulimit -n 只能越改越小, 否则报错。假设用户还没使用 ulimit -n:
#第一次可以设不大于/etc/security/limits.conf 的任意大小
#如果/etc/security/limits.conf 没有限制该用户的大小那么第一次可以设置成任意数量
ulimit -n 2000
#报错 bash: ulimit: open files: cannot modify limit: Operation not permitted
ulimit -n 2000
#可以设为更小的
ulimit -n 1998
#设完更小的值之后也改不回 2000 了
ulimit -n 2000
#报错 bash: ulimit: open files: cannot modify limit: Operation not permitted
root 用户不受此限制, 可以改大或改小。且 root 每次修改都可以比 /etc/security/limits.conf
里的内容大。后面内容会讲到修改 /etc/security/limits.conf
里的值
此法修改大小仅对当前进程生效。重新登陆或另开进程就失效了。
永久修改文件描述符数量:
vi /etc/security/limits.conf
, 如果有下面两行就修改数值, 没有就添加下面两行:
root hard nofile 65536
root soft nofile 65536
上述语句其实只加了 root 的, 如果没有加用户的限制那么用户首次使用 ulimit 是可以打开任意数量的, 可以比 root 的限制还要大。假定用户是 user, 向该文件加如下内容:
user hard nofile 2048
user soft nofile 2048
此时 user 首次使用 ulimit 修改大小就不能比 2048 大了。可以理解为系统自动执行一次 ulimit -n 2048, 因此不能比上次修改的大。
1.1.3. /proc/sys/fs/file-max 系统级限制
虽然名字叫系统级限制, 但是它无法限制最大文件描述符设置的值。这个值只是系统根据内存等资源信息计算出的一个建议值。我们查看以下这个值, 我这边是 1603892, 如果在 /etc/security/limits.conf
里进行如下修改:
root hard nofile 2000000
root soft nofile 2000000
重新登陆会发现变成 200 万
常见误区:
综上常见误区有以下几点:
- 虽然普通用户 ulimit -n 设置只能越来越小, 但是 root 用户不受限。
- 普通用户如果没有在 limits.conf 配置最大值, 虽然默认是 1024, 但是首次使用 ulimit -n 可以设置任意值, 即便比 root 配置值还大。
- 设置完 limits.conf 不用重启, 重新登陆该用户就行。不过重启也可以。
/proc/sys/fs/file-max
只是一个建议值, 限制不了文件描述符最大数量
回到最上面的问题
TCP 四元组可以确定一个连接:
TCP 四元组: 源地址、源端口、目标地址、目标端口
其中源地址和源端口是确定的(服务器通常固定在某个本地端口上监听, 等待客户端的连接请求。)
所以连接数量的最大理论值计算公式即为:
最大 TCP 连接数 = 客户端的 IP 数 X 客户端的端口数
对 IPv4, 客户端的 IP 数最多为 2 的 32 次方, 客户端的端口数最多为 2 的 16 次方, 也就是服务端单机最大 TCP 连接数, 约为 2 的 48 次方。
会受到以下因素影响:
- 本文所说的文件描述符, 每个 tcp 连接本质上也是一个文件, 如果文件描述符别占满了, 会有 too many open files 的报错。
- 内存限制, 每个 tcp 连接都要占用一定的内存, 操作系统的内存是有限的, 如果内存资源占满后, 会发生 OOM。
2. Linux 中的 tmpfs 和 /dev/shm/
巧用 Linux 服务器的 /dev/shm/
, 如果合理使用, 可以避开磁盘 IO 不给力, 提高网站访问速度。
2.1. 什么是 tmpfs
tmpfs 是 Linux/Unix 系统上的一种基于内存的文件系统。tmpfs 可以使用您的内存或 swap 分区来存储文件。由此可见, tmpfs 主要存储暂存的文件。
2.2. 什么是 /dev/shm/
巧用 tmpfs 加速你的 Linux 服务器, 就是使用虚拟磁盘来存放 squid 的缓存文件和 php 的 seesion。速度快不少哦!
/dev/shm/
是 Linux 下一个非常有用的目录, 因为这个目录不在硬盘上, 而是在内存里。因此在 Linux 下, 就不需要大费周折去建 ramdisk, 直接使用 /dev/shm/
就可达到很好的优化效果。
/dev/shm/
需要注意的一个是容量问题, 在 Linux 下, 它默认最大为内存的一半大小, 使用 df -h
命令可以看到。但它并不会真正的占用这块内存, 如果 /dev/shm/
下没有任何文件, 它占用的内存实际上就是 0 字节; 如果它最大为 1G, 里头放有 100M 文件, 那剩余的 900M 仍然可为其它应用程序所使用, 但它所占用的 100M 内存, 是绝不会被系统回收重新划分的, 否则谁还敢往里头存文件呢?
默认的最大一半内存大小在某些场合可能不够用, 并且默认的 inode 数量很低一般都要调高些, 这时可以用 mount 命令来管理它。
mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
在 2G 的机器上, 将最大容量调到 1.5G, 并且 inode 数量调到 1000000, 这意味着大致可存入最多一百万个小文件。
默认系统就会加载 /dev/shm/
, 它就是所谓的 tmpfs, 有人说跟 ramdisk(虚拟磁盘), 但不一样。象虚拟磁盘一样, tmpfs 可以使用您的 RAM, 但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备, 并需要一个 mkfs
之类的命令才能真正地使用它, tmpfs 是一个文件系统, 而不是块设备; 您只是安装它, 它就可以使用了。
它有如下 2 个优势:
- 动态文件系统的大小。
- tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在内存 RAM 中, 读写几乎可以是瞬间的。同时它也有一个缺点 tmpfs 数据在重新启动之后不会保留, 因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载, 绑定的操作。
2.2.1. /dev/shm/
使用示例
我们先在 /dev/shm/
建一个 tmp 目前, 并与 /tmp
绑定。
## mkdir /dev/shm/tmp
## chmod 1777 /dev/shm/tmp // 注意权限
## mount --bind /dev/shm/tmp /tmp
## ls -ld /tmp
drwxrwxrwt 2 root root 40 May 29 21:46 /tmp
在使用 mount --bind olderdir newerdir
命令来挂载一个目录到另一个目录后, newerdir 的权限和所有者等所有信息会发生变化。挂载后的目录继承了被挂载目录的所有属性, 除了名称。
2.2.2. 与 swap 的区别
/dev/shm/
首先可以看出来 /dev/shm/
是一个设备文件, 可以把 /dev/shm/
看作是系统内存的入口, 可以把它看做是一块物理存储设备,
一个 tmp filesystem, 你可以通过这个设备向内存中读写文件, 以加快某些 I/O 高的操作, 比如对一个大型文件频繁的 open, write, read,
据说 oracle 就利用了 /dev/shm/
(shitou 没用过 oracle), 可以通过 mount 命令列出当前的 /dev/shm/
的挂载的文件系统,
你可以直接对 /dev/shm/
进行读写操作, 例如:
## touch /dev/shm/file1
既然是基于内存的文件系统, 系统重启后 /dev/shm/
下的文件就不存在了
Linux 默认 (CentOS)/dev/shm
分区的大小是系统物理内存的 50%, 虽说使用 /dev/shm/
对文件操作的效率会高很多,
但是目前各发行软件中却很少有使用它的 (除了前面提到的 Oracle), 可以通过 ls /dev/shm
查看下面是否有文件, 如果没有就说明当前系统并没有使用该设备。
swap
而 swap 是 Linux 的虚拟内存, 即在硬盘上开辟空间当内存不够时充当内存使用, 因此可以理解为当 /dev/shm/
空间不够时可以占用 swap 的空间。
当 /dev/shm/
空间不够时可以占用 swap 的空间, 所以不用担心存储空间不够用。想想看, 从磁盘 IO 操作到内存操作, php 读写 SESSION 的速度会快多少? 只是需要注意, 存储在 /dev/shm/
的数据, 在服务器重启后会全部丢失。
3. 如何使用 Linux sed 命令进行字符串替换
3.1. 基本的替换
命令格式 1:
sed 's / 原字符串 / 新字符串 /' 文件
命令格式 2:
sed 's / 原字符串 / 新字符串 / g' 文件
这两种命令格式的区别在于是否有个 “g”。没有 “g” 表示只替换第一个匹配到的字符串, 有 “g” 表示替换所有能匹配到的字符串, “g” 可以认为是 “global”(全局的) 的缩写, 没有 “全局的” 结尾就不要替换全部, 这样就好记啦。命令可以使用正则表达式来处理。如下图, 第一个命令只是将第一个 “b” 替换成了 “B”, 其他的都没有替换; 而第二个命令将全文中的数字都替换成了 “好的”。
3.2. 替换某行内容
命令格式 1:
sed '行号 c 新字符串' 文件
命令格式 2:
sed '起始行号, 终止行号 c 新字符串' 文件
第一个命令表示用新的字符串替换指定这一行的内容, 第二个命令表示用新字符串替换指定几行的内容。如下图, 第一个命令将第 2 行内容替换成了 “new test!”, 第二个命令将第 2 到 6 行替换成了 “new test!”。
3.3. 多条件替换
命令格式:
sed -e 命令 1 -e 命令 2 -e 命令 3
有些时候有多个替换条件, 那就可以使用 “-e” 参数将这些替换条件连接起来, 一次性完成所有的替换操作。例如, 可以将上述的两种命令连接起来: “sed -e’s / 原字符串 / 新字符串 /'‘行号 c 新字符串’ 文件 “。如下图, 不仅将小写"a"替换成了大写"A”, 还将第 2 行内容替换成了"new test!”。
3.4. 保存替换结果到文件中
命令格式:
sed -i 命令
上述这些命令都只是将替换结果打印到屏幕上, 如果想保存结果到文件中, 就需要加上 “-i” 参数。
注意, 在输入 Linux 命令前, 一定要将输入法切换成英文半角符号状态。从 Windows 电脑上复制命令到 Linux Terminal 中执行时, 也有可能遇到格式不正确造成的命令执行错误, 这时建议手动重新输入字符, 如果觉得输入麻烦, 可以只删除命令中的空格和最后一个字符后, 重新输入空格和最后一个字符。
4. Linux 下在某行的前一行或后一行添加内容
4.1. 在某行的前一行或后一行添加内容
具休操作如下:
#匹配行前加
sed -i '/allow 361way.com/iallow www.361way.com' the.conf.file
#匹配行前后
sed -i '/allow 361way.com/aallow www.361way.com' the.conf.file
而在书写的时候为便与区分, 往往会在 i 和 a 前面加一个反加一个反斜扛 。代码就变成了:
sed -i '/2222222222/a\3333333333' test.txt
sed -i '/2222222222/i\3333333333' test.txt
这就就可以很方便的看出要在某一行前或某一行后加入什么内容 。不过经常我记不住 a 、i 那个是前那个是后。我的记法是 a = after , i = in front 。这样就知道 i 是前, a 是后了。不过官方的 man 文件里不是这样解释的, man 文件里是这样解释的:
a
text Append text, which has each embedded newline preceded by a backslash.
i
text Insert text, which has each embedded newline preceded by a backslash.
而且其可以配合 find 查找的内容处理, 如下:
find . -name server.xml|xargs sed -i '/directory/i <!--'
find . -name server.xml|xargs sed -i '/pattern="%h/a -->'
4.2. 在某行(指具体行号)前或后加一行内容
sed -i 'N;4addpdf' a.txt
sed -i 'N;4ieepdf' a.txt
这里指定的行号是第四行 。
4.3. 删除指定行的上一行或下一行
删除指定文件的上一行
sed -i -e :a -e '$!N;s/.*n(.*directory)/1/;ta' -e 'P;D' server.xml
删除指定文件的下一行
sed -i '/pattern="%/{n;d}' server.xml
这个写起来有点长, 一般如果不是 shell 里的需要, 我更喜欢用 vim 去处理。另外需要注意的是, 在 vim 里如果替换的内容里 tab 这样的符号是需要在编辑模式下分别按 ctrl+v 和 crtl+I , 而不是不停的几个空格。
5. 我用到的实例
需要将 SSH 配置文件 sshd_config
中的 #PasswordAuthentication yes
修改成 PasswordAuthentication no
:
sed -i "s/.*PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
6. 什么是 sed
sed
是一种流编辑器, 它是文本处理中非常中的工具, 能够完美的配合正则表达式使用, 功能不同凡响。处理时, 把当前处理的行存储在临时缓冲区中, 称为 “模式空间”(pattern space), 接着用 sed
命令处理缓冲区中的内容, 处理完成后, 把缓冲区的内容送往屏幕。接着处理下一行, 这样不断重复, 直到文件末尾。文件内容并没有 改变, 除非你使用重定向存储输出。sed
主要用来自动编辑一个或多个文件; 简化对文件的反复操作; 编写转换程序等。
7. 命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
8. 选项
-e<script>
或--expression=<script>
: 以选项中的指定的 script 来处理输入的文本文件;-f<script 文件 >
或--file=<script 文件 >
: 以选项中指定的 script 文件来处理输入的文本文件;-h
或--help
: 显示帮助;-n
或--quiet
或--silent
: 仅显示 script 处理后的结果;-V
或--version:
显示版本信息。
9. 参数
文件: 指定待处理的文本文件列表。
10. sed 命令
a\
在当前行下面插入文本。i\
在当前行上面插入文本。c\
把选定的行改为新的文本。d
删除, 删除选择的行。D
删除模板块的第一行。s
替换指定字符h
拷贝模板块的内容到内存中的缓冲区。H
追加模板块的内容到内存中的缓冲区。g
获得内存缓冲区的内容, 并替代当前模板块中的文本。G
获得内存缓冲区的内容, 并追加到当前模板块文本的后面。l
列表不能打印字符的清单。n
读取下一个输入行, 用下一个命令处理新的行而不是用第一个命令。N
追加下一个输入行到模板块后面并在二者间嵌入一个新行, 改变当前行号码。p
打印模板块的行。P
(大写) 打印模板块的第一行。q
退出 Sed。b
lable 分支到脚本中带有标记的地方, 如果分支不存在则分支到脚本的末尾。r
file 从 file 中读行。t
label if 分支, 从最后一行开始, 条件一旦满足或者 T, t 命令, 将导致分支到带有标号的命令处, 或者到脚本的末尾。T
label 错误分支, 从最后一行开始, 一旦发生错误或者 T, t 命令, 将导致分支到带有标号的命令处, 或者到脚本的末尾。w
file 写并追加模板块到 file 末尾。W
file 写并追加模板块的第一行到 file 末尾。!
表示后面的命令对所有没有被选定的行发生作用。=
打印当前行号码。#
把注释扩展到下一个换行符以前。
11. sed
替换标记
g
表示行内全面替换。p
表示打印行。w
表示把行写入一个文件。x
表示互换模板块中的文本和缓冲区中的文本。y
表示把一个字符翻译为另外的字符 (但是不用于正则表达式)\1
子串匹配标记&
已匹配字符串标记
12. sed
元字符集
^
匹配行开始, 如:/^sed/
匹配所有以sed
开头的行。$
匹配行结束, 如:/sed$/
匹配所有以sed
结尾的行。.
匹配一个非换行符的任意字符, 如:/s.d/
匹配s
后接一个任意字符, 最后是d
。*
匹配 0 个或多个字符, 如:/*sed/
匹配所有模板是一个或多个空格后紧跟sed
的行。[]
匹配一个指定范围内的字符, 如/[ss]ed/
匹配sed
和Sed
。[^]
匹配一个不在指定范围内的字符, 如:/[^A-RT-Z]ed/
匹配不包含 A-R 和 T-Z 的一个字母开头, 紧跟ed
的行。\(..\)
匹配子串, 保存匹配的字符, 如s/\(love\)able/\1rs
,loveable
被替换成lovers
。&
保存搜索字符用来替换其他字符, 如s/love/**&**/
,love
这成**love**
。\<
匹配单词的开始, 如:/\<love/
匹配包含以love
开头的单词的行。\>
匹配单词的结束, 如/love\>
/ 匹配包含以love
结尾的单词的行。x\{m\}
重复字符x
,m
次, 如:/0\{5\}/
匹配包含 5 个 0 的行。x\{m,\}
重复字符x
, 至少m
次, 如:/0\{5,\}/
匹配至少有 5 个 0 的行。x\{m,n\}
重复字符x
, 至少m
次, 不多于n
次, 如:/0\{5,10\}/
匹配 5~10 个 0 的行。
13. sed 用法实例
13.1. 替换操作: s
命令
替换文本中的字符串:
sed 's/book/books/' file
-n 选项和 p 命令一起使用表示只打印那些发生替换的行:
sed -n 's/test/TEST/p' file
直接编辑文件选项 - i, 会匹配 file 文件中每一行的第一个 book 替换为 books:
sed -i 's/book/books/g' file
13.2. 全面替换标记 g
使用后缀 /g 标记会替换每一行中的所有匹配:
sed 's/book/books/g' file
当需要从第 N 处匹配开始替换时, 可以使用 /Ng:
echo sksksksksksk | sed 's/sk/SK/2g'
skSKSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/3g'
skskSKSKSKSK
echo sksksksksksk | sed 's/sk/SK/4g'
skskskSKSKSK
13.3. 定界符
以上命令中字符 / 在 sed 中作为定界符使用, 也可以使用任意的定界符:
sed 's:test:TEXT:g'
sed 's|test|TEXT|g'
定界符出现在样式内部时, 需要进行转义:
sed 's/\/bin/\/usr\/local\/bin/g'
13.4. 删除操作: d
命令
删除空白行:
sed '/^$/d' file
删除文件的第 2 行:
sed '2d' file
删除文件的第 2 行到末尾所有行:
sed '2,$d' file
删除文件最后一行:
sed '$d' file
删除文件中所有开头是 test 的行:
sed '/^test/'d file
13.5. 已匹配字符串标记 &
正则表达式 \w+ 匹配每一个单词, 使用 [&] 替换它, & 对应于之前所匹配到的单词:
echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]
所有以 192.168.0.1 开头的行都会被替换成它自已加 localhost:
sed 's/^192.168.0.1/&localhost/' file
192.168.0.1localhost
13.6. 子串匹配标记 \1
匹配给定样式的其中一部分:
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
this is 7 in a number
命令中 digit 7, 被替换成了 7。样式匹配到的子串是 7, (…) 用于匹配子串, 对于匹配到的第一个子串就标记为 \1, 依此类推匹配到的第二个结果就是 \2, 例如:
echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
BBB aaa
love 被标记为 1, 所有 loveable 会被替换成 lovers, 并打印出来:
sed -n 's/\(love\)able/\1rs/p' file
13.7. 组合多个表达式
sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式'
13.8. 引用
sed 表达式可以使用单引号来引用, 但是如果表达式内部包含变量字符串, 就需要使用双引号。
test=hello
echo hello WORLD | sed "s/$test/HELLO"
HELLO WORLD
13.9. 选定行的范围: ,
(逗号)
所有在模板 test 和 check 所确定的范围内的行都被打印:
sed -n '/test/,/check/p' file
打印从第 5 行开始到第一个包含以 test 开始的行之间的所有行:
sed -n '5,/^test/p' file
对于模板 test 和 west 之间的行, 每行的末尾用字符串 aaa bbb 替换:
sed '/test/,/west/s/$/aaa bbb/' file
13.10. 多点编辑: e
命令
-e 选项允许在同一行里执行多条命令:
sed -e '1,5d' -e 's/test/check/' file
上面 sed 表达式的第一条命令删除 1 至 5 行, 第二条命令用 check 替换 test。命令的执行顺序对结果有影响。如果两个命令都是替换命令, 那么第一个替换命令将影响第二个替换命令的结果。
和 -e 等价的命令是 --expression:
sed --expression='s/test/check/' --expression='/love/d' file
13.11. 从文件读入: r
命令
file 里的内容被读进来, 显示在与 test 匹配的行后面, 如果匹配多行, 则 file 的内容将显示在所有匹配行的下面:
sed '/test/r file' filename
13.12. 写入文件: w
命令
在 example 中所有包含 test 的行都被写入 file 里:
sed -n '/test/w file' example
13.13. 追加 (行下): a\
命令
将 this is a test line 追加到 以 test 开头的行后面:
sed '/^test/a\this is a test line' file
在 test.conf 文件第 2 行之后插入 this is a test line:
sed -i '2a\this is a test line' test.conf
13.14. 插入 (行上): i\
命令
将 this is a test line 追加到以 test 开头的行前面:
sed '/^test/i\this is a test line' file
在 test.conf 文件第 5 行之前插入 this is a test line:
sed -i '5i\this is a test line' test.conf
13.15. 下一个: n
命令
如果 test 被匹配, 则移动到匹配行的下一行, 替换这一行的 aa, 变为 bb, 并打印该行, 然后继续:
sed '/test/{ n; s/aa/bb/; }' file
13.16. 变形: y
命令
把 1~10 行内所有 abcde 转变为大写, 注意, 正则表达式元字符不能使用这个命令:
sed '1,10y/abcde/ABCDE/' file
13.17. 退出: q
命令
打印完第 10 行后, 退出 sed
sed '10q' file
13.18. 保持和获取: h
命令和 G
命令
在 sed 处理文件的时候, 每一行都被保存在一个叫模式空间的临时缓冲区中, 除非行被删除或者输出被取消, 否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空, 并存入新的一行等待处理。
sed -e '/test/h' -e '$G' file
在这个例子里, 匹配 test 的行被找到后, 将存入模式空间, h 命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是, 当到达最后一行后, G 命令取出保持缓冲区的行, 然后把它放回模式空间中, 且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说, 任何包含 test 的行都被复制并追加到该文件的末尾。
13.19. 保持和互换: h
命令和 x
命令
互换模式空间和保持缓冲区的内容。也就是把包含 test 与 check 的行互换:
sed -e '/test/h' -e '/check/x' file
13.20. 脚本 scriptfile
sed 脚本是一个 sed 的命令清单, 启动 Sed 时以 - f 选项引导脚本文件名。Sed 对于脚本中输入的命令非常挑剔, 在命令的末尾不能有任何空白或文本, 如果在一行中有多个命令, 要用分号分隔。以 #开头的行为注释行, 且不能跨行。
sed [options] -f scriptfile file(s)
13.21. 打印奇数行或偶数行
方法 1:
sed -n 'p;n' test.txt #奇数行
sed -n 'n;p' test.txt #偶数行
方法 2:
sed -n '1~2p' test.txt #奇数行
sed -n '2~2p' test.txt #偶数行
13.22. 打印匹配字符串的下一行
grep -A 1 SCC URFILE
sed -n '/SCC/{n;p}' URFILE
awk '/SCC/{getline; print}' URFILE
13.23. Disable PasswordAuthentication and Enable PubkeyAuthentication on Sakura VPS.
USER_NAME=marcy
sed -i "s/.*RSAAuthentication.*/RSAAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/.*PubkeyAuthentication.*/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i "s/.*PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
sed -i "s/.*AuthorizedKeysFile.*/AuthorizedKeysFile\t\.ssh\/authorized_keys/g" /etc/ssh/sshd_config
sed -i "s/.*PermitRootLogin.*/PermitRootLogin no/g" /etc/ssh/sshd_config
echo "${USER_NAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
service sshd restart
useradd -p "" $USER_NAME
passwd -fu $USER_NAME
sudo -u $USER_NAME mkdir /home/$USER_NAME/.ssh
sudo -u $USER_NAME chmod 700 /home/$USER_NAME/.ssh
sudo -u $USER_NAME ssh-keygen -t rsa -b 2048 -N "" -f /home/$USER_NAME/.ssh/id_rsa
cat /home/$USER_NAME/.ssh/id_rsa.pub > /home/$USER_NAME/.ssh/authorized_keys
chmod 600 /home/$USER_NAME/.ssh/authorized_keys
chown $USER_NAME:$USER_NAME /home/$USER_NAME/.ssh/authorized_keys
14. nano
14.1. 搜索特定文字
当你想搜索某特定文字时, 只要想成 “WhereIs” 而不是 “Search”, 事情就简单了。只要按下 Ctrl+W
, 键入你要搜索的字符串, 再按 Enter
就可以了。想再次搜索相同的字符串, 可以直接按 Alt+W
。
注意: 在 nano 帮助文档里, Ctrl-
键被表示为一个脱字符 (^
), 因此 Ctrl+W
被写成了 ^W
, 等等。Alt-
键被表示为一个 M
(从 Meta
而来), 因此 Alt+W
被写成了 M-W
。
15. Linux 安装 rz 和 sz
15.1. rz 和 sz 是什么
rz
和 sz
都是使用 Zmodem 文件传输协议, 所以就明白啦:
rz: Receive Zmodem
sz: Send Zmodem
man rz
可以看到。
即:
- sz: 下载。将选定的文件发送(send)到本地机器。
- rz: 上传。运行该命令会弹出一个文件选择窗口, 从本地选择文件上传到服务器(receive)。
15.2. 安装命令
Centos 下:
yum install lrzsz
Ubuntu 下:
sudo apt-get install lrzsz
16. Linux 安装与配置 FTP、SFTP
16.1. 前言
默认的 CentOS Minimal 没有安装 vsftpd
, 但是可以直接使用 SFTP 连接, 前提是使用 22
端口。为什么要使用 22
端口, 因为 Linux 的 SFTP 是基于 SSH2 协议的, 所以要使用 SSH 的端口。
由于 SFTP 这种传输方式使用了加密/解密技术, 所以传输效率比普通的 FTP 要低得多, 如果您对网络安全性要求更高时, 可以使用 SFTP 代替 FTP, 否则使用 FTP 就好了。FTP 的默认端口是 21
, 直接在浏览器里面输入类似 ftp://192.168.1.27
时若弹出用户名和密码输入端口说明服务器的 FTP 是搭建成功的(前提是服务器允许用户名和密码登录)。
16.2. 步骤 1. 检测是否已经安装 FTP/SFTP
rpm -qa | grep vsftpd
若没有任何输出, 则说明当前系统没有安装, 需要自行安装了。
16.3. 步骤 2. 安装 FTP/SFTP
若是需要配置 SFTP 的, 需要查看 SSH 版本, 版本必须大于 4.8p1, 低于的这个版本需要升级。下面这个版本是 5.3p1 的:
[root@localhost ~]# sshd -V
sshd: illegal option -- V
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
usage: sshd [-46DdeiqTt] [-b bits] [-C connection_spec] [-c host_cert_file]
[-f config_file] [-g login_grace_time] [-h host_key_file]
[-k key_gen_time] [-o option] [-p port] [-u len]
安装命令:
- CentOS:
yum install vsftpd
- Ubuntu:
sudo apt-get install vsftpd
注意: 安装完成后 vsftpd
服务并未启动。
16.4. 步骤 3. 设置 vsftpd 开机启动
chkconfig --level 35 vsftpd on
或者:
chkconfig vsftpd on
16.5. 步骤 4. 防火墙和 SELinux 的设置
由于防火墙和 SELinux 会对搭建 FTP 服务起干扰作用, 所以先将其关闭, 等到搭建完成后再将其还原打开。
关闭防火墙的命令: service iptables stop
查询防火墙的命令: service iptables status
关闭 SELinux 的命令(临时): setenforce 0
查看确认 SELinux 状态的命令: getenforce
, 状态是 Permissive
就可以。
16.6. 步骤 5. 尝试一波匿名登录
匿名登录只能从 FTP 上读取文件。
启动 FTP 服务: service vsftpd start
。
这个时候, FTP 匿名登录已经可以使用了, 如果需要特定用户的, 需要另外进行配置。
匿名登录后的文件夹在 /var/ftp/pub
下。
我是怎么发现这个文件夹的? 我匿名登录成功后, 发现里面有个 pub
的文件夹, 然后我用命令查找到它了: find / -name pub
。
16.6.1. 如何设置匿名用户可以修改
FTP 服务的匿名开放模式的帐号统一为 anonymous
, 密码为空。匿名模式登陆到 FTP 服务器后默认所在位置为 /var/ftp
目录, 咱们可以切换至里面的 pub
目录中。
要想使匿名用户具有写入权限必须经过 3 层"同意":
vsftpd.conf
- SELinux
chmod
下面依次解决这 3 个:
vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
listen=YES
先查询 SELinux 关于 FTP 的规则:
# getsebool -a | grep ftp
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off
设置 SELinux 的规则:
# setsebool -P allow_ftpd_full_access on
# setsebool -P ftp_home_dir on
# setsebool -P allow_ftpd_anon_write on
# setsebool -P tftp_anon_write on
# getsebool -a | grep ftp
chmod
chmod 777 pub
16.6.2. 关闭匿名访问
anonymous_enable=NO
16.7. 允许 root
用户登录 FTP
出于安全性的考虑, 默认情况下 root
被禁止登录 FTP, 但是经过配置可以修改。
键入命令: vi vsftpd.ftpusers
进入文件 vsftpd.ftpusers
, 在 root
前加 #
注释 root
同理, 键入命令: vi vsftpd.user_list
进入文件 vsftpd.user_list
, 在 root
前加 #
注释 root
16.8. 配置特定用户
先不写了, 参考:
《Linux 系统中 vsftpd 配置及如何添加 vsFTPd 用户和设置权限》
http://blog.sina.com.cn/s/blog_3edc5e2e0102vzv8.html, 百度关键词"vsftpd 配置用户权限"。
16.9. 配置防火墙
FTP 默认的端口为 21, 而 CentOS 默认是没有开启的, 所以要修改 iptables 文件:
# vi /etc/sysconfig/iptables
有个 22 的, yyp
复制这行, 将 22
换成 21
, 然后 :wq
保存, 重启 iptables: service iptables restart
。
16.10. 关于 FTP 的被动模式(Passive)
Passive 模式, 默认是不行的, 因为 FTP Passive 模式被 iptables 挡住了。
默认是开启的, 但是要指定一个端口范围, 打开 vsftpd.conf
文件, 在后面加上
pasv_min_port=30000
pasv_max_port=30999
表示端口范围为 30000~30999
, 这个可以随意改。改完重启一下 vsftpd
。
由于指定这段端口范围, iptables 也要相应的开启这个范围, 所以像上面那样打开 iptables 文件。
也是在 21
上下面另起一行, 更那行差不多, 只是把 21
改为 30000:30999
, 然后 :wq
保存, 重启下 iptables, 这样就搞定了。
17. Linux 文件权限详解
17.1. 文件的权限有哪些
- 可读
r
- 可写
w
- 可执行(脚本, 比如 shell 脚本)
x
- 特殊字符
-
表示没有任何权限
17.2. 权限的数字和方法
二进制数字之和的方式(2 的次方):
r | w | x |
---|---|---|
2^2 | 2^1 | 2^0 |
4 | 2 | 1 |
比如, rw-
表示的是 4 + 2 + 0 = 6
, -rw-rw-r--
用数字表示就是 664
。
17.3. 文件的归属
- 拥有者 owner u
- 属于组 group g
- 其他人 other o
17.4. 综合举例及引申
drwxrwxrwx
17.5. d: File type
d -> directory
- -> normal file
l -> link 链接
b -> block device
p -> pipe file
c -> character device
s -> socket file
17.6. First drw
==> User
File owner’s permissions.
r -> read
w -> write
x -> execute
17.7. Second drw
==> Group
File owner’s group’s permissions.
17.8. Last drw
==> Other
Other users’ permissions.
17.9. Change file permissions
$ sudo chmod [u/g/o/a] [+/-/=] [r/w/x] [FILENAME/DIRECTORY NAME]
u -> User
g -> Group
o -> Others
a -> all
+ -> add
- -> remove
= -> set
18. 文件命令
18.1. 查看文件
18.1.1. 查找命令位置
$ which python3
/usr/bin/python3
$ type -a python3
python3 is /usr/bin/python3
18.1.2. 查看单个文件
cat
查看整个文件, 适合查看内容比较少的more readme.txt
翻页查看, 适合大文件查看
head
命令: 查看文件的前几行
- 查看
/etc/profile
的前10
行内容:head -n 10 /etc/profile
tail
命令:
tail
: 看文件末尾内容, 通常与-f
参数连用, 适合于查看服务实时动态日志信息tail -f install.log
tail -200f yyy.log
查看最后 200 行- 查看
/etc/profile
的最后5
行内容:tail -n 5 /etc/profile
tail
命令:
head
: 类似于tail
, 查看开头文件, 文件格式, 内容的模板样式
计算文件 hash:
- 计算 SHA256:
sha256sum ubuntu-9.10-dvd-i386.iso
18.1.2.1. grep
的时候 Binary file matches **.log
怎么解决
原因: grep
认为 a.log
是二进制文件
解决方法: grep -a "xxx" a.log
可以看看 grep -a
参数的功能
$ grep --help | grep '/-a'
-a, --text equivalent to --binary-files=text
即, 让二进制文件等价于文本文件
注: zgrep
遇到同类问题时, 解决方法是一样的
18.1.3. 查看多个文件
ls
->list
ls -l
详细信息 简写为ll
ls -lt
按时间顺序排序ls -a
显示所有的目录。比ls
多了一些以.
开头的文件, 以.
开头的文件, 即隐藏文件。
ll
命令查出来的各个字段的意思:
文件属性 | 文件数 | 拥有者 | 所属的 Group | 文件大小 | 建档日期 | 文件名 |
---|---|---|---|---|---|---|
drwx------ | 2 | Guest | users | 1024 | Nov 21 21:05 | |
-rwx–x–x | 1 | root | root | 89080 | Nov 7 22:41 | tar* |
18.2. linux tail 命令显示最后 n 行
tail: 输出文件的最后几行。
用于 linux 查看日志的时候很方便, 假如日志文件为: Console.log
用法:
- 输出文件最后 10 行的内容
tail Console.log
- 输出文件最后 n 行的内容, 同时监视文件的改变, 只要文件有一变化就同步刷新并显示出来
tail -nf Console.log --n 为最后 n 行
- 输出文件最后 5 行的内容
tail -n 5 filename
- 输出最后 10 行内容, 同时监视文件的改变, 只要文件有一变化就显示出来。
tail -f filename
18.3. 创建文件
- 方法一:
touch filename
- 方法二:
vi filename
18.4. 修改文件
18.4.1. 修改文件权限
# chmod
-R
递归
需求: 对于同组用户来说, 仅仅可读, 对于其它用户来说, 既不可读也不可写。
字符形式:
chmod g-w 1.sql
chmod o-r 1.sql
数字形式:
chmod 664 1.sql
18.4.2. 改变文件拥有者和所属组
chown
改变文件拥有者, 如chown user 1.sql
chgrp
改变用户组
针对目录设置权限: chown -R user /opt/softwares
将 1.sql
的的拥有者和用户组设置为 senior
用户和 senior
组可以用一条命令完成操作: chown senior:senior /home/1.sql
18.4.3. 修改文件内容
$ vi
$ nano
$ gedit
18.4.4. 复制隐藏文件
如果没有加任何参数, cp
命令是不会复制隐藏文件的, 若要复制隐藏文件需要如下命令:
$ sudo cp -a [SOURCE]/. [DEST]
上述命令必须满足以下条件, 否则不能复制成功:
- 加
-a
参数, 表示 all 的意思 - [SOURCE] 后加
.
- 对 [DEST] 有写入权限。一般情况下
.git
文件夹下的部分内容是只有读取权限的, 所以务必加上sudo
强制
18.4.5. 清空文件
echo "'" > log.txt
echo > log.txt, 这种文件里会存在空格
cat /dev/null > log.txt
18.4.5.1. 通过重定向到 Null 来清空文件内容
> access.log
18.4.5.2. 使用 cat/cp/dd
实用工具及 /dev/null
设备来清空文件
cat /dev/null > access.log
cp /dev/null access.log
下面的命令中, if
代表输入文件, of
代表输出文件。
dd if=/dev/null of=access.log
18.4.5.3. 使用 true 命令重定向来清空文件
: > access.log
true > access.log
18.4.5.4. 使用 echo
命令清空文件
# echo "" > access.log
或者:
# echo > access.log
# echo -n "" > access.log
18.4.5.5. 使用 truncate
命令来清空文件内容
# truncate -s 0 access.log
18.4.6. 追加
对文件的内容进行追加: echo '00000999' >> 1.sql
18.4.7. 脚本重定向输出
所以注意在 crontab
脚本输出内容到日志, 或者 /dev/null 2>&1
, 避免产生大量不必要的文件。
18.5. 搜索文件
** 方法一 **:
character: fuzzy search
whereis [FILENAME]
** 方法二 **:
character: accurate, large resources consuming
find / -name [FILENAME]
find ~/ -name file
find ~/ -name readme.txt
find ~/ -name read\* 转义字符, 模糊匹配
** 方法三 **:
character: fastest, recommend
locate [FILENAME]
查找命令路径的命令: which
命令用于查找并显示给定命令的绝对路径, 环境变量 PATH 中保存了查找命令时需要遍历的目录。which
指令会在环境变量 $PATH
设置的目录里查找符合条件的文件。也就是说, 使用 which
命令, 就可以看到某个系统命令是否存在, 以及执行的到底是哪一个位置的命令。
[root@localhost etc]# which crontab
/usr/bin/crontab
18.5.1. 查找命令行
grep "my string of text" -R .
You’ll need to be (or get) familiar with grep
. Read man grep
for more info.
18.6. 对文件进行操作
18.6.1. 对日志文件进行操作
logrotate - rotates, compresses, and mails system logs
19. 文件夹命令
19.1. 查看查询命令
19.1.1. 显示当前用户所在的目录
pwd
19.1.2. 查看文件夹大小
du -sh [FILE]/[FOLDER]
du -sk [FILE]/[FOLDER]
du -sm [FILE]/[FOLDER]
sh -> nK/nM/nG eg. [4.0K xxx.log]
sk -> nK eg. [4.3K xxx.log]
sm -> nM eg. [7M xxx.log]
- 查看
/home
占用空间大小:du -sh /home
- 查看当前文件夹下每个文件 / 文件夹的大小:
du -sh *
和du -sh ./*
- 显示前十个占用空间最大的文件或目录:
du -s * | sort -nr | head
- 查找大文件和目录:
find . -type f -size +1000000k
19.2. 修改文件夹
- 拷贝目录:
cp -r dir1 dir2
- 删除空目录:
rmdir test-dir
- 删除非空目录 (递归、强制):
rmdir -rf test-dir
创建多级目录 (p -> parents): mkdir -p /home/user/com/world
19.2.1. 移动隐藏文件夹
如果没有加任何参数, mv [SOURCE]/* [DEST]/
命令是不会移动隐藏文件的, 若要移动隐藏文件需要如下命令:
$ sudo mv [SOURCE]/.[^.]* [DEST]
上述命令必须满足以下条件, 否则不能复制成功:
- [SOURCE] 后加
.[^.]*
- 对 [DEST] 有写入权限。一般情况下
.git
文件夹下的部分内容是只有读取权限的, 所以务必加上sudo
强制 - 隐藏文件使用
.[^.]*
匹配 - 匹配隐藏文件用
.[^.]*
, 为什么不用.*
,.*
会匹配目录.
和..
.[^.]*
的意思是: 以.
开头, 加不是.
的一个任意字符, 再加其他任意字符
19.3. 挂载文件夹
19.3.1. Mounting other Linux directory
$ sudo mkdir /mnt/wangfang-docs
$ sudo mount -t cifs -o username='niy',password='123456' //192.168.251.15/Documents /mnt/wangfang-docs
19.3.2. Mounting other Windows directory
$ mount -t nfs -o username='niy',password='123456' 192.168.20.204:/home/dir /home/dir
mount
查看挂载信息mount /dev/sdb1 /data01
挂载磁盘umount /dev/sdb1
卸载磁盘
20. 文件与文件夹综合命令
20.1. 软链接与硬链接
我们知道文件都有文件名与数据, 这在 Linux 上被分成两个部分: 用户数据 (user data) 与元数据 (metadata)。用户数据, 即文件数据块 (data block), 数据块是记录文件真实内容的地方; 而元数据则是文件的附加属性, 如文件大小、创建时间、所有者等信息。在 Linux 中, 元数据中的 inode 号 (inode 是文件元数据的一部分但其并不包含文件名, inode 号即索引节点号) 才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用, 系统或程序通过 inode 号寻找正确的文件数据块。下图展示了程序通过文件名获取文件内容的过程:
[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-PCvN3XgC-1670575806300)(http://p66wpe5qr.bkt.clouddn.com/linux-file-read.jpg)]
硬链接 (hard link) 的特性:
- 文件有相同的 inode 及 data block;
- 只能对已存在的文件进行创建;
- 不能交叉文件系统进行硬链接的创建;
- 不能对目录进行创建, 只可对文件创建;
- 删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接 (soft link, 也称符号链接) 的特性:
- 软链接有自己的文件属性及权限等;
- 可对不存在的文件或目录创建软链接;
- 软链接可交叉文件系统;
- 软链接可对文件或目录创建;
- 创建软链接时, 链接计数 i_nlink 不会增加;
- 删除软链接并不影响被指向的文件, 但若被指向的原文件被删除, 则相关软连接被称为死链接 (即 dangling link, 若被 - 指向路径文件被重新创建, 死链接可恢复为正常的软链接)。
软链接与硬链接的访问示意图:
[外链图片转存失败, 源站可能有防盗链机制, 建议将图片保存下来直接上传 (img-7PZWZRft-1670575806301)(http://p66wpe5qr.bkt.clouddn.com/linux-soft-link-access.jpg)]
-
创建软连接:
$ ln -s file/dir linkName
-
创建硬链接: 不加
s
是硬链接
硬链接就相当于拷贝一个文件了。 -
硬链接: 与普通文件没什么不同, inode 都指向同一个文件在硬盘中的区块
-
软链接: 保存了其代表的文件的绝对路径, 是另外一种文件, 在硬盘上有独立的区块, 访问时替换自身路径。
21. Linux 下载文件
21.1. wget
命令
wget https://www.baidu.com
21.2. curl
命令
curl http://man.linuxde.net/test.iso -o filename.iso --progress
-o
将下载数据写入到指定名称的文件中(curl 默认是将下载文件输出到 stdout, 将进度信息输出到 stderr)--progress
显示进度条--silent
不显示进度信息
21.2.1. curl 的断点续传
curl URL/File -C 偏移量
#偏移量是以字节为单位的整数, 如果让 curl 自动推断出正确的续传位置使用-C -:
curl -C -URL
22. Linux 磁盘操作命令
22.1. 查看查询命令
- 查看所有磁盘:
sudo df -h
- 系统各挂载硬盘空间大小:
sudo df -hl
23. Linux 系统的顶层目录结构
目录名 | 目录功能 |
---|---|
/ | 根目录 |
├── bin | 存放用户二进制文件 |
├── boot | 存放内核引导配置文件 |
├── dev | 存放设备文件 |
├── etc | 存放系统配置文件 |
├── home | 用户主目录 |
├── lib | 动态共享库 |
├── lost+found | 文件系统恢复时的恢复文件 |
├── media | 可卸载存储介质挂载点 |
├── mnt | 文件系统临时挂载点 |
├── opt | 附加的应用程序包 |
├── proc | 系统内存的映射目录, 提供内核与进程信息 |
├── root | root 用户主目录 |
├── sbin | 存放系统二进制文件 |
├── srv | 存放服务相关数据 |
├── sys | sys 虚拟文件系统挂载点 |
├── tmp | 存放临时文件 |
├── usr | 存放用户应用程序 |
└── var | 存放邮件、系统日志等变化文件 |
目录名 | 目录功能 |
---|---|
/bin | 存放所有用户皆可用的系统程序, 系统启动或者系统修复时可用(在没有挂载 /usr 目录时就可以使用) |
/sbin | 存放超级用户才能使用的系统程序 |
/usr/bin | 存放所有用户都可用的应用程序 |
/usr/sbin | 存放超级用户才能使用的应用程序 |
/usr/local/bin | 存放所有用户都可用的与本地机器无关的程序 |
/usr/local/sbin | 存放超级用户才能使用的与本地机器无关的程序 |
24. 文件怎么放
传统上的常规做法是:
- 系统级的组件放在
/bin
、/lib
- root 用户才能访问的放在
/sbin
- 系统 repository 提供的应用程序放在
/usr/bin
、/usr/lib
- 用户自己编译的放在
/usr/local/XXX
此外, 不同系统还会有很多的细微区别,
- 比如 Redhat 系喜欢把 32 位的库放在
/lib
、/usr/lib
, 64 位的库放在/lib64
、/usr/lib64
, - 而 Debian 系喜欢把平台相关的那层名字放在
/lib
、/usr/lib
的子目录里, 比如/usr/lib/x86_64-linux-gnu/
。然后, 各种配置文件的文件名、路径也会有区别, 比如 ssh 服务器的配置文件可能叫/etc/ssh/sshd.conf
, 也可能叫/etc/ssh/sshd_config
。
分成三块的最早的渊源, 据说是这样的:
- Unix 开发者的机器的硬盘不够了, 新加了一块, 挂在
/usr
上; - 又 TM 不够了, 再加一块, 挂在
/usr/local
上; - 不知怎么, 就变成规范了。
/usr
: 系统级的目录, 可以理解为C:/Windows/
,/usr/lib
理解为C:/Windows/System32
。/usr/local
: 用户级的程序目录, 可以理解为 C:/Progrem Files/`。用户自己编译的软件默认会安装到这个目录下。/opt
: 用户级的程序目录, 可以理解为D:/Software
,opt
有可选的意思, 这里可以用于放置第三方大型软件(或游戏), 当你不需要时, 直接rm -rf
掉即可。在硬盘容量不够时, 也可将/opt
单独挂载到其他磁盘上使用。
源码放哪里?
/usr/src
: 系统级的源码目录。/usr/local/src
: 用户级的源码目录。
Linux 有专门的指导文件系统的标准, 叫做: FHS (Filesystem Hierarchy Standard)
目前的 FHS 执行标准是 FHS 3.0 Filesystem Hierarchy Standard。
25. 用 tail 监视 crontab 执行的 log 文件
25.1. 需求
用 crontab
实现每隔 1 分钟往 /root/log.txt
写入时间。
25.2. 实现
# vi /etc/crontab
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
*/1 * * * * root /bin/date >> /root/log.txt
25.3. crontab
启动命令
修改配置文件了, 需要重新加载配置: service crond reload
25.4. 查看
tail
命令可以查看文件:tail /root/log.txt
tail -f
可以实时查看文件:tail -f /root/log.txt
25.5. 扩展
crond
服务
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
crontab -l 列出目前所有的定时任务
crontab -r 删除所有的定时任务
/etc/crontab
文件的写法:
- 每个月 1, 11, 21 的 2:30 执行:
30 2 1,11,21 * * user_name command
- 每 1 个小时执行一次:
30 2 1,11,21 * * user_name command
- 连续:
20-23
26. Linux 压缩与解压文件
26.1. Linux 压缩文件命令详细
c -> create
z -> gzip
v -> view files
f -> use archive file (or device)
## 压缩文件夹
tar -czvf html.tar.gz html/*
## 解压文件夹
tar -xzvf XXX.tar.gz
26.2. 安装与卸载软件命令
## 安装
sudo apt-get install unrar
sudo yum install -y
## 卸载
sudo apt-get remove unrar
sudo yum remove
26.3. Linux 下各压缩格式的压缩与解压命令
To extract a tar.xz
file, invoke the tar
command with the --extract (-x)
option and specify the archive file name after the -f
option:
tar -xf archive.tar.xz
tar auto-detects compression type and extracts the archive. The same command can be used to extract tar archives compressed with other algorithms, such as .tar.gz
or .tar.bz2
.
26.3.1. rar
格式
26.3.1.1. 解压
需要借助 unrar 软件:
## 安装
sudo apt-get install unrar
## 卸载
sudo apt-get remove unrar
示例:
unrar x ./FileName.rar -e ~/Document
26.3.2. tar
格式
## 压缩
tar -cvf *.tar
## 解压
tar -xvf *.tar
26.3.3. tar.bz2
格式
## 压缩
tar –cjf jpg.tar.bz2 *.jpg
## 解压
tar -xjvf file.tar.bz2
26.3.4. tar.gz
格式
## 压缩
tar -zcvf FileName.tar.gz DirName
## 解压
tar -zxvf *.tar.gz -C dir
26.3.5. tar.xz
格式
26.3.5.1. 格式解释
这是一个两层压缩, 外面是 xz 压缩方式, 里层是 tar 压缩。
26.3.5.2. 解压
因此可以分两步实现解压:
xz -d *.tar.xz
tar -xvf *.tar
或者直接使用如下命令来解压:
## 压缩
tar cvJf *.xz
## 解压
tar xvJf *.xz
26.3.6. xz
格式
压缩包 xz
格式的比 7z
要小, 但是压缩时间比较长。
## 压缩
xz -z *.xz
## 解压
xz -d *.xz
26.3.7. zip
格式
26.3.7.1. 压缩
压缩用 zip 软件
sudo apt-get install zip
sudo yum -y install zip
26.3.7.2. 解压
解压用 unzip 软件:
sudo apt-get install unzip
sudo yum -y install unzip
解压命令:
unzip test.zip -d /root/
27. Linux 下保护文件命令 chattr
在 Linux 命令行下, 使用 rm
命令删除的文件是不会放在 回收站
里面的, 而是直接删除, 为此我们需要一个保护重要文件不被删除的方法, 而命令 chattr
可以帮我们实现这样的功能。
chattr
命令用来改变文件属性。这项指令可改变存放在 ext2 文件系统上的文件或目录属性, 这些属性共有以下 8 种模式:
a
: 让文件或目录仅供附加用途;b
: 不更新文件或目录的最后存取时间;c
: 将文件或目录压缩后存放;d
: 将文件或目录排除在倾倒操作之外;i
: 不得任意更动文件或目录;s
: 保密性删除文件或目录;S
: 即时更新文件或目录;u
: 预防意外删除。
27.1. 语法
chattr [-pRVf] [-+=aAcCdDeijPsStTu] [-v version] files...
27.2. 选项
-R
: 递归处理, 将指令目录下的所有文件及子目录一并处理;-v<版本编号>
: 设置文件或目录版本;-V
: 显示指令执行过程;+<属性>
: 开启文件或目录的该项属性;-<属性>
: 关闭文件或目录的该项属性;=<属性>
: 指定文件或目录的该项属性。
27.3. 实例
用 chattr
命令防止系统中某个关键文件被修改:
chattr +i /etc/fstab
然后试一下 rm
、mv
、rename
等命令操作于该文件, 都是得到 Operation not permitted
的结果。
让某个文件只能往里面追加内容, 不能删除, 一些日志文件适用于这种操作:
chattr +a /data1/user_act.log