Linux 文件

目录

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 万

常见误区:
综上常见误区有以下几点:

  1. 虽然普通用户 ulimit -n 设置只能越来越小, 但是 root 用户不受限。
  2. 普通用户如果没有在 limits.conf 配置最大值, 虽然默认是 1024, 但是首次使用 ulimit -n 可以设置任意值, 即便比 root 配置值还大。
  3. 设置完 limits.conf 不用重启, 重新登陆该用户就行。不过重启也可以。
  4. /proc/sys/fs/file-max 只是一个建议值, 限制不了文件描述符最大数量

回到最上面的问题

TCP 四元组可以确定一个连接:

TCP 四元组: 源地址、源端口、目标地址、目标端口

其中源地址和源端口是确定的(服务器通常固定在某个本地端口上监听, 等待客户端的连接请求。)

所以连接数量的最大理论值计算公式即为:

最大 TCP 连接数 = 客户端的 IP 数 X 客户端的端口数

对 IPv4, 客户端的 IP 数最多为 2 的 32 次方, 客户端的端口数最多为 2 的 16 次方, 也就是服务端单机最大 TCP 连接数, 约为 2 的 48 次方。

会受到以下因素影响:

  1. 本文所说的文件描述符, 每个 tcp 连接本质上也是一个文件, 如果文件描述符别占满了, 会有 too many open files 的报错。
  2. 内存限制, 每个 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 个优势:

  1. 动态文件系统的大小。
  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/ 匹配 sedSed
  • [^] 匹配一个不在指定范围内的字符, 如: /[^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 是什么

rzsz 都是使用 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 的次方):

rwx
2^22^12^0
421

比如, 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------2Guestusers1024Nov 21 21:05Mail
-rwx–x–x1rootroot89080Nov 7 22:41tar*

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(8)

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系统内存的映射目录, 提供内核与进程信息
├── rootroot 用户主目录
├── sbin存放系统二进制文件
├── srv存放服务相关数据
├── syssys 虚拟文件系统挂载点
├── 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

分成三块的最早的渊源, 据说是这样的:

  1. Unix 开发者的机器的硬盘不够了, 新加了一块, 挂在 /usr 上;
  2. 又 TM 不够了, 再加一块, 挂在 /usr/local 上;
  3. 不知怎么, 就变成规范了。
  • /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

然后试一下 rmmvrename 等命令操作于该文件, 都是得到 Operation not permitted 的结果。

让某个文件只能往里面追加内容, 不能删除, 一些日志文件适用于这种操作:

chattr +a /data1/user_act.log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云满笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值