超有用的linux笔记

名词解释

根目录说明

tree -L 1

.
├── bin -> usr/bin # 英语binary的缩写,表示”二进制文件“,bin目录包含了会被所有用户使用的可执行程序
├── boot # 英语boot表示”启动“,boot目录包含与Linux启动密切相关的文件
├── dev # 英语device的缩写, 表示”设备“,包含外设,它里面的子目录,每一个对应一个外设
├── etc # etc目录包含系统的配置文件,按照原始Unix的说法,这下面都是一堆零零碎碎的东西,就叫etc好了,是历史遗留问题
├── home # 英语home表示”家“,用户的私人目录,在home目录中,我们放置私人的文件
├── lib -> usr/lib # 英语library的缩写,表示”库“,目录包含被程序所调用的库文件,以.so结尾的文件
├── lib64 -> usr/lib64
├── media # 英语media表示”媒体“,可移动的外设(USB盘,SD卡,DVD,光盘等)插入电脑时可以让我们通过media的子目录来访问这些外设的内容
├── mnt # mnt是英语mount的缩写,表示”挂载“,有点类似media目录,但一般用于临时挂载一些装置
├── opt # 英语 optional application software package的缩写,表示”可选的软件包“,用于安装多数第三方软件和插件
├── proc
├── root
├── run
├── sbin -> usr/sbin # 英语system binary的缩写, 表示”系统二进制文件“ ,包含系统级的重要可执行程序
├── srv # 英语service的缩写,表示”服务“,包含一些网络服务启动之后所需要取用的数据
├── sys
├── tmp # 英语temporary的缩写,表示”临时的“,普通用户和程序存放临时文件的地方
├── usr # 是英语Unix Software Resource的缩写,表示”Unix操作系统软件资源“,目录里安装了大部分用户需要调用的程序
└── var # 英语variable的缩写,表示”动态的,可变的“,var通常包含程序的数据,比如log(日志)文件,记录电脑了发生了什么事

挂载

所谓的挂载就是利用一个目录当成进入点,将磁盘分区的数据放置在该目录下;也就是说进入该目录就可以读取该分区的意思。这个操作我们称为挂载,那个进入点的目录我们称为挂载点

shell

当谈到命令时,我们实际上指的是shellshell是一个接收由键盘输入的命令,并将其传递给操作系统来执行的程序。几乎所有的Linux发行版都提供shell程序,该程序来自于称之为bash的GNU项目。bash是Bourne Again Shell的首字母缩写,Bourne Again Shell基于这样一个事实,即bash是sh的增强版本,而sh是最初的UNIX shell程序,由Steve Bourne编写。

终端

当使用图形用户界面时,需要另一种叫做终端仿真器(terminal emulator)的程序与shell进行交互。如果我们仔细查看桌面菜单,那么很可能会找到一个款终端仿真器。在KDE环境下使用的是konsole,而在GNOME环境下使用的是gonme-terminal,但在桌面菜单上很可能将它们简单地统称为终端。在Linux系统中,还有许多其他的终端仿真器可以使用,但是它们基本上都做同样的事情:让用户访问shell

硬件相关

修改主机名

查看当前主机名

hostname

临时修改主机名:

hostname new_name(新主机名)

上面的修改方式属于临时修改,系统重启后失效,如果想要永久性修改主机名,那么就需要修改配置文件

  • 在CentOS6中,需要修改 /etc/sysconfig/network文件
  • 在CentOS7中,需要修改 /etc/hostname文件

查看CentOS版本

cat /etc/redhat-release

查看CPU总核数

# 表示一颗CPU四核
grep processor /proc/cpuinfo |wc -l
grep -c processor /proc/cpuinfo

校正CentOS7时间

GPS系统中有两种时间区分,UTC就0时区的时间,CST为本地时间,如北京为早上八点(东八区),UTC时间比北京时晚八小时;
CST:Central Standard Time,UTC+8:00 中央标准时间
UTC:Universal Time Coordinated 世界协调时间

# 安装ntp软件包
sudo yum -y install ntp

# 设置ntp开机自启
systemctl enable ntpd.service

# 启动ntp服务
sudo service ntpd.service restart

如果需要配置CTS时间,需要创建如下软链接

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

如果需要配置UTC时间,需要创建如下软链接

ln -sf /usr/share/zoneinfo/Universal /etc/localtime

修改文件最大打开数

linux修改文件最大打开数量的方法,默认情况下是1024的。

我们可以使用 ulimit -n命令查看

如果我们想临时修改,可以使用 ulimit -n 数量来修改,不过系统重启后修改会丢失

如果想永久修改,需要修改/etc/security/limits.conf文件

修改系统端口最大监听队列的长度

在linux中,/proc/sys/net/core/somaxconn这个参数,定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128。

somaxconn限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

vim /etc/sysctl.conf
# 添加
net.core.somaxconn = 1024

然后执行sysctl -p使配置生效。

修改内核内存分配策略

overcommit_memory是一个内核对内存分配的一种策略。 具体可见/proc/sys/vm/overcommit_memory下的值

overcommit_memory取值又三种分别为0,1,2

  • overcommit_memory=0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
  • overcommit_memory=1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  • overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存。

当我们启动redis服务时,会报警告,翻译为【“警告超限”内存设置为0!在内存不足的情况下,后台保存可能会失败。若要解决此问题,请将“vm.overcommit_memory=1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使其生效。】

vim /etc/sysctl.conf
# 添加
vm.overcommit_memory = 1

然后执行sysctl -p使配置生效。

vim编辑器

基本上vi共分为3种模式,分别是一般命令模式、编辑模式与命令行模式

一般命令模式(command mode)

以vi打开一个文件就直接进入一般命令模式了(这是默认的模式,也成为一般模式)。在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理文件内容,也可以使用【复制、粘贴】来处理你的文件内容。

编辑模式(insert mode)

在一般命令模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容。要等到你按下【i、I、o、O、a、A、r、R】等任何一个字母之后才会进入编辑模式。注意了,通常在Linux中,按下这些按键时,在界面的左下方会出现【INSERT】或【REPLACE】的字样,此时才可以进行编辑,而如果要回到一般命令模式时,则必须要按下【Esc】这个按键即可退出编辑模式。

命令行模式(command-line mode)

在一般模式当中,输入【😕?】三个中的任何一个按钮,就可以将光标移动到最下面的一行。在这个模式当中,可以提供你【查找数据】的操作,而读取、保存、批量字符替换、退出vi、显示行号等的操作则是在此模式中完成。

一般命令模式可与编辑模式及命令行模式切换,但编辑模式与命令行模式之间不可互相切换。

常用vim命令:

插入命令:

命令 说明
i 当前位置插入
I 行首插入
a 当前位置后插入
A 行尾插入
o 下一新行插入
O 上一新行插入
s 删除光标所在的字符,当前位置插入
S 删除光标所在行,当前行插入

移动光标:

命令 说明
h 光标左移
j 光标下移
k 光标上移
l 光标右移
^ 光标移动到行首
$ 光标移动到行尾
gg 光标移动到文件首行
G 光标移动到文件尾行
ngg n为数字,移动到这个文件的第n行
nG n为数字,移动到这个文件的第n行

查找与替换:

命令 说明
/word 向光标之下寻找一个名称为word的字符串。例如要在文件内查找itbsl这个字符串,就输入/itbsl即可(常用)
?word 向光标之上寻找一个字符名称为word的字符串
n 这个n是英文按键,代表【重复前一个查找的操作】。举例来说,如果刚刚我们执行/itbsl去向下查找itbsl这个字符串,则按下n后,会向下继续查找下一个名称为itbsl的字符串,如果是执行?itbsl的话,那么按下n则会向上继续查找名称为itbsl的字符串
N 这个N是英文按键,与n刚好相反,为【反向】进行前一个查找操作,例如/itbsl后,按下N则表示【向上】查找itbsl
:n1,n2s/word1/word2/g n1与n2为数字,在第n1与n2行之间寻找word1这个字符串,并将该字符串替换为word2,举例来说,在100到200行之间查找itbsl并替换为ITBSL,则 :100,200s/itbsl/ITBSL/g(常用)
:1,$s/word1/word2/g 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2(常用)
:1,$s/word1/word2/gc 从第一行到最后一行寻找word1字符串,并将该字符串替换为word2,且在替换前显示提示字符给用户确认(confirm)是否需要替换(常用)

删除、复制与粘贴:

命令 说明
xX 在一行当中,x为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[Backspace]即退格键)(常用)
nx n为数字,连续向后删除n个字符。举例来说,我要连续删除10个字符,【10x】
dd 删除(剪切)光标所在的那一整行(常用)
ndd n为数字,删除(剪切)光标所在的向下n行,例如20dd则是删除(剪切)20行(常用)
d1G 删除(剪切)光标所在到第一行的所有数据
dG 删除(剪切)光标所在到最后一行的所有数据
d$ 删除(剪切)光标所在处,到该行的最后一个字符
d0 删除(剪切)光标所在处,到该行的最前面的一个字符
yy 复制光标所在的那一行(常用)
nyy n为数字,复制光标所在的向下n行,例如20yy则是复制20行(常用)
y1G 复制光标所在行到第一行的所有数据
yG 复制光标所在行到最后一样的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
yw 拷贝一个单词
nyw 拷贝n个单词(n表示数字)
p 后置粘贴
P 前置粘贴

保存:

命令 说明
:w 直接保存
:w file 保存成新文件

退出:

命令 说明
:q 退出

强制执行:

命令 说明
:wq! 强制保存退出
:q! 强制退出

显示行号:

命令 说明
:set nu 显示行号

配置系统:

  • 全局配置
    /etc/virc
  • 用户级别
    ~/vimrc

vim搜索

命令 说明
/字符串 比如搜索user,输入/user

按下回车之后,可以看到vim已经把光标移动到该字符处和高亮了匹配的字符串
查看下一个匹配,按下n(小写n)
跳转到上一个匹配,按下N(大写N)
搜索后,我们打开别的文件,发现也被高亮了,怎么关闭高亮?
命令模式下,输入:nohlsearch 也可以:set nohlsearch; 当然,可以简写,noh或者 set noh

Linux文件操作

实用快捷键

Ctrl+L:清理终端的内容,就是清屏的作用。同clear命令

Ctrl+D:给终端传递EOF(End Of File,文件结束符)

Shift+PgUp:用于向上滚屏,与鼠标的滚轮向上滚屏是一个效果

Shift+PgDn:用于向下滚屏,与鼠标的滚轮向下滚屏是一个效果

Ctrl+A:光标跳到一行命令的开头。Home键有相同的效果

Ctr+E:光标跳到一行命令的结尾。End键具有相同的效果

Ctrl+U:删除所有光标左侧的命令字符

Ctrl+K:删除所有在光标右侧的命令字符

Ctrl+W:删除光标左侧的一个”单词“

Ctrl+Y:粘贴,用Ctrl+U,Ctrl+K

locate:快速查找

locate命令用于定位要查找的文件,而且此命令很快,”locate“是英语”定位“的意思

用法:

终端会列出所有包含了search_content的文件和目录

locate search_content

在使用locate命令查找文件时,大家可能会遇到这样的问题

我刚创建的文件,为什么用locate命令查找不到呢?

这正好是locate命令的缺陷,locate命令不会对你实际的整个硬盘进行查找,而是在文件的数据库里查找记录,locate命令的原理如下图所示

对于刚创建不就的文件,因为它们还没有被收录进文件数据库,因此locate命令就找不到其索引,自然就不会反悔任何结果

linux系统一般每天会更新一次文件数据库,因此,只要你隔24小时再用locate查找,应该就能找到你刚创建的文件了,但是,你可能不想等这么久,因此也提供了updatedb命令强制系统立即更新文件数据库,updatedb命令只能由root用户执行,这个命令执行需要一点时间,一旦执行成功,就可以使用locate命令查找刚刚创建的文件了,locate命令会列出所有在文件数据库中找到的内容,有时候结果太多了,太繁杂了,而且locate命令还不能找到一天之内创建的文件,所以系统提供了另一个查找的命令find

find:深入查找

find命令是查找文件的利器,find是英语”找到“的意思,而且它可以让我们对每个找到的文件做后续的操作,与locate命令不同,find命令不会在文件数据库中查找文件的记录,而是遍历你的实际硬盘

用法:

# 与locate命令不同的是,find命令只会查找完全符合名字的文件
find 查找目录(默认当前目录) -name "文件名"

# 不过也可以用通配符 *来匹配多个名称
# 在/var/log目录下查找以syslog开头的文件
find /var/log -name "syslog*"

# 根据文件大小查找
# 查找/var/log中大小超过10M的文件
# -size:size指定查找文件的大小(M兆,K千字节,G千兆字节)
find /var/log -size +10M

# 查找小于50M的
find /var/log -size -50M

# 查找等于20M的
find /var/log -size 20M

# 根据文件最近访问时间查找
# -atime参数:atime是access和time的缩写,表示访问时间
# -atime参数后面紧跟的-7表示7天之内,减号的作用表示小于
find /var/log -name "*.txt" -atime -7

# 仅查找目录或文件
# -type d:只查找目录类型。d是directory的首字母,表示”目录“
# -type f:只查找文件类型。f是file的首字母,表示“文件”
# 如果不用-type参数指定类型,那么find命令默认是查找目录和文件
find /var/log -name "file" -type d

# 删除查找到的文件
# -delete参数:
find /var/log -name "*.jpg" -delete

# 调用命令
# -exec参数:使用-exec参数,可以后接一个命令,对每个查找到的文件进行操作
# exec是execute的缩写,是英语“执行”的意思
# 假如要将/var/log目录下的所有查找到的txt文件的访问权限都改为600
find /var/log -name "*.txt" -exec chmod 600 {}\;
# 你可以将-exec参数换成-ok参数,用法一样,只不过-ok参数会对每一个查找到的文件都确认提示

ls:列出文件和目录

ls是list的缩写,是英语“列出”的意思,用于列出文件和目录

ls -a:列出所有的目录和文件,包括隐藏的,包含.和..

ls -A:列出所有的目录和文件,包括隐藏的,不包含.和..

ls -l:列出一个显示文件和目录的详细信息的列表

ls -lh:h是human readable的缩写,表示“适合人类阅读的”

ls -lt:t是time的缩写,表示时间,按文件最近一次修改时间排序

du:显示目录包含的文件大小

du是英语disk usage的缩写,表示“磁盘使用/占用”,du命令可以让我们知道文件和目录所占的空间大小

相比ls -l命令,du命令统计的才是真正的文件大小

du命令会深入遍历每个目录的子目录,统计所有文件的大小

du -h:以适合人类阅读的方式展示

默认情况下,du命令只显示目录的大小,如果加上-a参数,则会显示目录和文件的大小

du -s:只显示统计大小

du -sh:显示统计大小(以适合人类阅读的方式)

cat:显示文件内容

cat命令可以一次性在终端中显示文件的所有内容,cat是concatenate的缩写,表示“连接/串联”

cat -n:显示文件内容时带上行号

适合文件内容比较少的文件如果文件比较大,更适合用less命令

less:显示文件内容

和cat命令最大的区别:less会一页一页的显示文件内容,还有一个more命令,more是“更多”,less是“更少”

more命令和less命令功能类似,more没有less那么强大,比如more命令不能往后翻页,只能往前

less命令中最基本最常用的快捷键

空格键:文件内容读取下一个终端屏幕的行数,相当于前进一个屏幕(页),与键盘上的PageDown(下一页)效果一样

回车键:读取下一行文件内容,也就是前进一行

d键:前进半页(半个屏幕)

b键:后退一页。与键盘上的PageUp(上一页)效果一样

y键:后退一行。与键盘上的向上效果是一样的

u键:后退半页(半个屏幕)

q键:停止读取文件,终止less命令

=键:显示你在文件的什么位置,会显示当前页面的内容是文件中第几行到第几行,整个文件所含行数,所含字符数

h键:显示帮助文档。按q键退出帮助文档

/:进入搜索模式,在斜杠后面输入你要搜索的文件,按下回车键,就会把所有符合的结果都标识出来,要在搜索所得结果中跳转,可以按n键,跳到下一个符合项目,按N键跳到上一个符合项目

head:显示文件的开头

head在英语中是“头部”的意思,顾名思义,这个命令用于显示文件的开头,默认情况下,head会显示文件的头10行

head -n 数字:指定显示的行数

tail:显示文件的结尾

tail在英语中是“尾部”的意思,顾名思义,这个命令用于显示文件的结尾,默认情况下,tail会显示文件结尾的最后10行内容

tail -n 数字:指定显示的行数

tail命令还可以配合-f参数来实时追踪文件的更新,可以用快捷键Ctrl+c来终止tail -f命令

默认地,tail -f会每过1秒检查一下文件是否有新内容

可以指定间隔检查的秒数,用-s参数:tail -f -s 4 文件名

touch:创建一个空白文件

touch命令其实一开始的设计初衷是修改文件的时间戳,就是可以修改文件的创建时间或修改时间,让电脑以为文件是在那个时候被创建或修改的

如果touch命令后面跟着的文件名是不存在的文件,它会创建一个

mkdir:创建一个目录

mkdir命令就是用于创建一个目录的,mkdir是mk和dir的缩写。mk是make的缩写,表示创建

索要创建的目录的名字里有空格怎么办呢?加上引号

还可以用-p参数来递归创建目录结构:mkdir -p one/two/three

cp:拷贝文件或目录

cp是英语copy的缩写,表示“拷贝”,cp命令不仅可以拷贝单个文件,还可以拷贝多个文件,也可以拷贝目录

拷贝目录,只要在cp命令之后加上-r或者-R参数,r大写和小写作用是一样的,都表示recursive,也就是递归的,拷贝的时候,目录中的所有内容(子目录和文件)都会被拷贝

使用通配符*:cp*.txt folder表示把当前目录下所有以.txt结尾的文件都拷贝到folder目录中,cp ha* folder表示把当前目录所有以ha开头的文件都拷贝到folder目录中

rm:删除文件和目录

rm是英语remove的缩写,表示“移除”,这个命令就是用来删除东西的

rm -i:向用户确认是否删除,保险起见,用rm命令删除文件时,可以加上-i参数,这样对于每个要删除的文件,终端都会询问我们是否确定删除

rm -f:慎用,不会询问是否删除,强制删除

rm -rf:递归删除,千万不要做 rm -rf /*或 rm -rf /

ln:创建链接

ln是link的缩写,在英语中表示“链接”,ln命令用于在文件之间创建链接(快捷方式)

在Linux下链接有两种类型:

  • Physical link:物理链接或硬链接
  • Symbolic link:符号链接或软链接

在linux中,文件在硬盘上的存储分两部分:文件名和文件内容,文件名的列表是存储在硬盘的其它地方的,和文件内容分开存放,方便linux管理

其实每个文件有三部分:文件名、权限和文件内容,我们这里简化地将文件分为两部分:文件名和文件内容

每个文件的文件内容被分配到一个标号号码,就是inode,因此每个文件名都绑定到它的文件内容(用inode标识)

硬链接

用法:

ln file1 file2

如果我们删除了file1,那么对file2没什么影响,删除file2对file1也没有什么影响,我们可以理解为用rm命令就是断开了文件名和文件内容之间的那根线,

对于硬链接来说,删除任意一方的文件,共同指向的文件内容并不会从硬盘上被删除

硬链接原理:使链接的两个文件共享同样文件内容,就是同样的inode,一旦两个文件之间有了硬链接,那么修改其中一个文件,修改的是相同的一块内容,只不过我们可以用两个文件名来获取到文件内容

硬链接缺陷:只能创建指向文件的硬链接,不能创建指向目录的(通过一些参数的修改,也可以创建指向目录的硬链接,但是比较复杂),软链接可以指向文件或目录,对于目录,一般都是用软链接

可以用ls -i命令查看一下(-i参数可以显示文件的inode)

软连接

软链接才真正像我们在windows下的快捷方式,原理很相似

用法:

ln -s file1 file2

创建硬链接时ln不带任何参数,创建软连接需要加上-s参数

软链接的特点:如果我们删除了file2,没什么大不了的,file1不会受到影响,如果删除file1,file2会变成“死链接”,因为指向的文件不见了

grep:筛选数据

grep是Globally search a Regular Expression and Print的缩写,意思是“全局搜索一个正则表达式,并且打印”,grep的功能简单说是在文件中查找关键字,并显示关键字所在的行

用法:

grep 搜索内容 要被搜索的文件

# -i参数:忽略大小写,默认情况下,grep命令是区分大小写的,i是英语ignore的缩写,表示“忽略”
grep -i

# -n参数:显示行号,-n参数的作用很简单,就是显示搜索到的文本所在的行,n是英语number的缩写,表示“数字,编号”
grep -n
# 示例
grep -n search_content /etc/profile

# -v参数:只显示文本不在的行,v是invert的缩写,表示“颠倒,倒置”
grep -v
# 示例
grep -v search_content /etc/profile

# -r参数:在所有子目录和子文件中查找
grep -r
# 示例
grep -r "hello world" /folder

# 正则查找
# ^匹配行首 
grep -E ^path /etc/profle

# 包含Path和path的会被搜索到
grep -E [Pp]ath /etc/profile

# 包含a-zA-Z之间任意字母的都可以被搜索到
grep -E [a-zA-Z] /etc/profile
# 在CentOS中,不加-E也是可以的

wc:文件统计

wc是word count的缩写,不仅可以用来统计单词数目,还可以用来统计行数、字符数、字节数等

用法:

# wc命令显示的三个数字分别是 行数 单词数 字节数 文件名
wc 文件名
# -l参数:统计行数,l是英语“line”的缩写,表示“行”
wc -l test.txt

# -w参数:统计单词数,w是“word”的缩写,表示“单词”
wc -w test.txt

# -c参数:统计字节数,c是“character”的缩写,表示“字符”
wc -c text.txt

示例:

uniq:删除文件中的重复内容

uniq是英语unique的缩写,表示“独一无二的”,unique命令有点“呆”,只能将连续的重复行变为一行

用法:

uniq 文件名
# -c参数:统计重复的行数,c是统计count的缩写,表示“统计,计数”
uniq -c test.txt

# -d参数:只显示重复的行的值,d是duplicated的缩写,表示“重复的”
uniq -d test

示例:

scp:网间拷贝

scp是Secure Copy的缩写,表示”安全拷贝“,scp可以使我们通过网络,把文件从一台电脑拷贝到另一台电脑

scp是基于SSH(Secure Shell)的原理来运作的,SSH会在两台通过网络连接的电脑之间创建一条安全通信的通道,scp就利用这条管道安全地拷贝文件

用法:

# source_file表示源文件,destination_file就是目标文件
# 这两个文件都可以用如下方式来表示 user@ip:file_name
# []以及括号内的内容可以省略,默认是22端口,和SSH一样
scp [-P 端口号] source_file destination_file

rsync:同步备份

rsync是remote synchronize的缩写,remote表示”远程“,synchronize表示”同步“

因此rsync命令主要用于”远程同步文件“,如果系统没有rsync命令,可以安装

sudo yum install rsync

rsync可以使我们同步两个目录,不管这两个目录位于同一台电脑还是不同的电脑(用网络连接)

rsync应该是最change用于”增量备份“的命令了,增量备份(incremental backup)是备份的一种类型,指在一次全备份或上一次增量备份后

用法:

# 将images目录下的所有文件备份到backups目录下
rsync -arv images/ backups/

# -a:保留文件的所有信息,包括权限、修改日期等
# -r:递归调用。表示子目录下的所有文件都包括
# -v:冗余模式。输出详细操作信息,v是verbose的缩写,是”冗余“的意思
# 默认地,rsync在同步时并不会删除目标目录的文件
# 例如,你的源目录(被同步目录)中删除了一个文件,但是rsync同步时,它不会删除同步目录中的相同文件
rsync -arv --delete images/ [email protected]:backups/

你可以自己配置rsync,使得它从指定目录(可以是多个目录)备份到指定IP地址的目录下,而且可以指定哪些类型文件是要备份的,哪些类型不要备份,然后把这一长串命令同意用shell脚本来写成一个文件(例如取名叫backup),使之可执行(用chmod + x命令),再把这个文件的路径添加到PATH环境变量中

用户群组系统

sudo -i:切换到root身份

sudo 是英语Substitute User DO的缩写,substitute是”替换,代替、替身“的意思,user是”用户“的意思,do是”做“的意思,连在一起就是”替换用户来执行…“的意思

终端会提示你输入密码,至少第一次会要求输入密码,此密码是你个人的密码。

useradd:添加新用户

user是英语”用户“的意思,add是英语”添加“的意思

useradd用于添加用户。用法:命令后接要创建的用户名

用法:

useradd joey

passwd:设置/修改密码

passwd是password这个英语单词的缩写,表示”密码“

用法:

passwd joey

userdel:删除用户

单单用userdel命令,不加参数的话,只会删除用户,但是不会删除在/home目录中的用户家目录

如果想要连次用户的家目录页一并删除的话,可以加上-r或-remove这个参数

用法:

userdel -r joey
userdel -remove joey

groupadd:创建群组

groupadd是group和add的缩写,group是英语”群组“的意思,add是英语”添加“的意思

groupadd命令用于添加一个新的群组

用法:

groupadd 组名
# 示例:
groupadd friends

usermod:修改用户

usermod是user和modify的缩写,user是用于”用户“的意思,modify是”修改“的意思

usermod命令用于修改用户的账户

用法:

usermod
# -l参数:对用户重命名,/home中的家目录名不改变,需要手动修改
# -g参数:修改用户所在群组
# 将joey的所属于组改为friends
usermod -g friends joey

# -G参数:将一个用户添加到多个群组,群组名之间用逗号分隔,而且没有空格
usermod -G group1,group2,group3

# -a参数:追加,如果想不离开原先的群组,又想加入新的群组,可以在-G的基础上加上-a参数
usermod -aG group4,group5

groups:查看用户所属组

用groups(”群组“)命令可以获知一个用户属于哪个(些)群组

groups joey

groupdel:删除群组

groupdel是group和delete的缩写,group是英语”群组“的意思,delete是英语”删除“的意思

groupdel命令用于删除一个已存在的群组

groupdel group1

chown:改变文件的所有者

chown命令用于改变文件的所有者,需要root身份才能运行。chown是change和owner的缩写。

用法:

chown 用户 文件
# chown也可以改变文件的群组
chown 用户:组 文件
# -R参数:递归修改文件所有者,只能是大写,小写不起作用,使得被修改的目录的所有子目录和文件都改变所有者
chown -R 用户 目录

chgrp:改变文件的群组

chgrp是change和group的缩写,用户改变文件的群组

用法:

chgrp 群组名 文件名

chomod:修改访问权限

linux系统里,每个文件和目录都有一列权限树形,访问权限知名了谁有读/写/执行的权利,chmod命令不需要是root用户才能运行,只要你是此文件所有者,就可以使用chmod来修改文件的访问权限

chmod是change和mode的缩写,change是英语”改变“的意思,mode是”模式“的意思

chmod命令用于修改文件的各种访问权限

linux系统对每种权限(r,w和x)分配了对应的数字

权限 数字
r 4
w 2
x 1

要合并这些权限,就需要做简单的加法了。

访问权限有三组(所有者的权限,群组的权限,其它用户的权限)

用法:

# text.txt的所属用户有读写权限,所属组和其它用户没有任何权限
chmod 600 text.txt

# -R参数:递归地修改访问权限
# chmod 配合 -R参数可以递归地修改文件访问权限
chmod -R 700 /home/joey

除了用户,可以用另一种方式来分配文件的访问权限:用字母

u:user的缩写,表示所有者

g:group的缩写,表示群组用户

o:other的缩写,表示其它用户

a:all的缩写,表示所有用户

+:加号,表示添加权限

:减号,表示减去权限

:等号,表示分配权限

示例:

chmod u+rx file 文件file的所有者增加读和运行的权限
chmod g+r file  文件file的群组用户增加读的权限
chmod o-r file  文件file的其它用户移除读的权限
chmod g+r o-r file 文件file的群组用户增加读的权限,其它用户移除读的权限
chmod u=rwx,g=r,o=- file 文件file的所有者分配读、写、执行的权限,群组分配读的权限,其它用户没有任何权限

软件管理

软件仓库

在Red Hat一族里,软件包的后缀是.rpm,rpm是Red Hat Package Manager的缩写,表示”红帽软件包管理器“,CentOS作为Red Hat一族的一员,也是用的.rpm的软件包

用默认的官方版本是最好的,但是会比较卡,所以我们要学习如何切换软件仓库,CentOS系统使用的软件仓库的列表是记录在一个文件中,要编辑的那个包含软件仓库的列表的文件是/etc/yum.repos.d/CentOS-Base.repo,这个文件时系统文件,只能被root用户修改

修改CentOS7默认yum源为mirros.aliyun.com

# 1.备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

# 2.下载新的CentOS-Base.repo 到 /etc/yum.repos.d/
wget -O /etc/yum.repos.d/CentOS-Base.repo //mirrors.aliyun.com/repo/Centos-7.repo

# 3.运行 yum makecache 生成缓存
yum makecache

wget:下载文件

wget可以使我们直接从终端控制台下载文件,只需要给出文件的HTTP或FTP地址

用法:

wget addr
# -c参数:继续一个中断的下载,c是英语continue的缩写,表示”继续“
wget -c //www.php.net/distributions/php-7.4.14.tar.gz
# -O参数:重命名(大写字母O)
wget -c //www.php.net/distributions/php-7.4.14.tar.gz -O php.tar.gz
# -o参数:保存输出日志(小写字母o)
wget -c //www.php.net/distributions/php-7.4.14.tar.gz -O php.tar.gz -o wget.log

yum:包管理工具

yum是CentOS中的默认包管理工具

# 搜索软件包
sudo yum search

# 安装软件包
sudo yum install

# 删除软件包
sudo yum remove

# 本地的.rpm软件包,可以用rpm命令来安装
sudo rpm -ivh xxx.rpm  # 用于安装
sudo rpm -e 包名        # 用于卸载

# 本地的.rpm软件包,也可以用yum命令来安装
sudo yum localinstall xxx.rpm  # 用于安装
sudo yum remove 包名            # 用于卸载

进程和系统监测

w:都有谁,在做什么?

user:当前登录的用户

From:登录IP

load average:负载,后面的三个数表示1分钟、5分钟、15分钟之内的平均负载

ps:进程的静态列表

ps是Process Status的缩写,process是英语“进程”的意思,status是“状态”的意思

ps命令用户显示当前系统中的进程,ps命令显示的进程列表不会随着时间而更新,是静态的

用法:

# 列出所有的进程
ps -ef

# 以乔木装列出所有进程
ps -efH

# 列出某个用户运行的进程
ps -u 用户名

# 通过CPU和内存使用来过滤进程
ps -aux | less

# 根据CPU使用率来降序排序
ps -aux --sort -pcpu | less

# 根据内存使用率来降序排序
ps -aux --sort -pmem | less

# 以树形结构显示进程,和pstree效果类似
ps -axjf

top:进程的动态列表

q:退出top
h:显示帮助文档,也就是哪些按键可以使用,按下任意键返回,按q回到top命令的主界面
B:大写的B,加粗某些信息
f/F:在进程列表中添加或删除某些列
u:依照用户来过滤显示
k:结束某个进程
s:改变刷新页面的时间,默认地,页面每隔3秒刷新一次

netstat:网络统计

netstat命令很好记,它由两部分组成:net和stat,net是network的缩写,表示”网络“,stat是statistics的缩写,表示”统计“

# 查看命令执行的二进制文件在哪儿
which netstat
# 查看这个二进制属于哪个rpm包
rpm -qf /usr/bin/netstat

netstat -i:列出电脑的所有网络接口的一些统计信息

RX是receive(表示”接收“)的缩写

TX是transmit(表示”发送“)的缩写

  • MTU:Maximum Transmission Unit的缩写,表示”最大传输单元“,指一种通信协议的某一层上能通过的最大数据包大小(单位是字节)
  • RX-OK:在此接口接收的包中正确的包数,”OK“表示”没问题的,好的“
  • RX-ERR:在此接口接收的包中错误的包数,”ERR“是error的缩写,表示”错误“
  • RX-DRP:在此接口接收的包中丢弃的包数,”DRP“是drop的缩写,表示”丢弃“
  • RX-OVR:在此接口接收的包中,由于过速而丢失的包数,”OVR“是over的缩写, 表示”结束“
  • 类似的,TX-OK、TX-ERR、TX-DRP、TX-OVR表示在此接口发送的包中对应的包数
# 列出所有开启的连接
netstat -uta

# -u:显示UDP连接
# -t:显示TCP连接
# -a:不论连接状态如何,都显示

# 列出状态是LISTEN的统计信息
netstat -lt

# 列出总结性的统计信息
netstat -s
#-s:s是summary的缩写,表示”总结“

kill:杀死进程

有时候,系统会突然卡住。这在Linux中也是会发生的,在Linux中停止进程有几种方法

kill是英语“杀死”的意思,有点“小暴力”

kill命令后接需要结束的进程号,也就是之前我们看到的PID,可以通过ps命令或top命令来获知进程的PID

用法:

kill PID
# 杀死一个进程
kill 1024
# 杀死多个进程 进程号之间用空格隔开
kill 1024 2048
# kill -9 表示立即强制结束进程
kill -9 1024

注:Ctrl+C:停止终端中正在运行的进程,Ctrl+C可以比较有好地中止终端中正在运行的程序(进程)

&:在后台运行进程

让一个进程在厚爱运行有几种方法

很简单的一种:在你要运行的命令最后加上&这个符号

示例:

cp file.txt file-copy.txt &
sudo find / -name "*log" &
sudo find / -name "*log" > output_find &
sudo find / -name "*log" > output_find 2>&1 &

nohup:使进程与终端分离

&符号虽然常用,但却有一个不可忽视的缺点,就是后台进程与终端相关联,一旦终端关闭或者用户登出,进程就自动结束,想让进程在以上情况下继续在后台运行

需要用到nohup命名,当用户注销(logout)或者网络断开时,终端会收到HUP(hangup的缩写,”挂断“的意思)信号从而关闭所有子进程,终端被关闭时也会关闭其子进程,可以使用nohup命令使命令不受HUP信号影响

man nohup
nohup cp file.txt file-copy.txt

场景:我现在需要跑脚本批量处理一些数据,但是我又不想盯着控制台看这个脚本的输出结果,想把这些输出结果记录到一个日志文件里面

方案:可以使用 Linux 的 nohup 命令,把进程挂起,后台执行

用法:

nohup XXXXXX.sh >> /runtime/deletedata.log &

运行结果(这个数字是进程号):

[1] 13120

有时候可能会报一个提示:

nohup: ignoring input and redirecting stderr to stdout

这个影响不大,不用紧张,也可以加多一个 2>&1 就不会出现这个问题

用法:

nohup XXXXXX.sh >> /runtime/deletedata.log 2>&1 &

TIPS:命令最后面的 & 符号是切换到后台去跑,退出终端也不会退出任务进程

运行这个命令之后呢,会输出一个进程号,类似上面的输出,可以使用 top 命令查看运行中的进程,也可以用 ps -aux 查看进程

想要终止这个进程的话只能杀死这个进程,使用 kill 指令处理

kill -9 进程号

TIPS:如果进程挂不起来,可能是端口被占用了,自行排查处理便可

killall:结束多个进程

同一个程序运行时可能启动多个进程,一个更快捷的命令是:killall,all是英语“全部”的意思

killall命令就是用于结束全部要结束的进程,不同于kill命令,killall命令后接程序名,而不是PID

host:查看域名对应IP

用法:

host www.baidu.com

whois:了解有关域名的信息

sudo yum install whois
whois www.baidu.com

halt:关机

需要以root身份才能关闭系统

sudo halt

reboot:重启系统

需要以root身份才能重启系统

sudo reboot

poweroff:关机

poweroff命令也可以用于关机,直接运行即可关机,不需要root身份:poweroff

iproute2对决net-tools

原文地址:iproute2 对决 net-tools

如今很多系统管理员依然通过组合使用诸如ifconfig、route、arp和netstat等命令行工具(统称为net-tools)来配置网络功能,解决网络故障。net-tools起源于BSD的TCP/IP工具箱,后来成为老版本Linux内核中配置网络功能的工具。但自2001年起,Linux社区已经对其停止维护。同时,一些Linux发行版比如Arch Linux和CentOS/RHEL 7则已经完全抛弃了net-tools,只支持iproute2。

作为网络配置工具的一份子,iproute2的出现旨在从功能上取代net-tools。net-tools通过procfs(/proc)和ioctl系统调用去访问和改变内核网络配置,而iproute2则通过netlink套接字接口与内核通讯。抛开性能而言,iproute2的用户接口比net-tools显得更加直观。比如,各种网络资源(如link、IP地址、路由和隧道等)均使用合适的对象抽象去定义,使得用户可使用一致的语法去管理不同的对象。更重要的是,到目前为止,iproute2仍处在持续开发中。

如果你仍在使用net-tools,而且尤其需要跟上新版Linux内核中的最新最重要的网络特性的话,那么是时候转到iproute2的阵营了。原因就在于使用iproute2可以做很多net-tools无法做到的事情。

对于那些想要转到使用iproute2的用户,有必要了解下面有关net-tools和iproute2的众多对比。

显示所有已连接的网络接口

使用net-tools:

ifconfig -a

使用iproute2:

ip link show

激活或停用网络接口

使用这些命令来激活或停用某个指定的网络接口。

使用net-tools:

sudo ifconfig eth1 up
sudo ifocnfig eth1 down

使用iproute2:

sudo ip link set down eth1
sudo ip link set up   eth1

为网络接口分配IPv4地址

使用这些命令配置网络接口的IPv4地址。

使用net-tools:

sudo ifconfig eth1 10.0.0.1/24 

使用iproute2:

sudo ip addr add 10.0.0.1/24 dev eth1

值得注意的是,可以使用iproute2给同一个接口分配多个IP地址,ifconfig则无法这么做。使用ifconfig的变通方案是使用IP别名

sudo ip addr add 10.0.0.1/24 broadcast 10.0.0.255 dev eth1
sudo ip addr add 10.0.0.2/24 broadcast 10.0.0.255 dev eth1
sudo ip addr add 10.0.0.3/24 broadcast 10.0.0.255 dev eth1

移除网络接口的IPv4地址

就IP地址的移除而言,除了给接口分配全0地址外,net-tools没有提供任何合适的方法来移除网络接口的IPv4地址。相反,iproute2则能很好地完全。

使用net-tools:

sudo ifconfig eth1 0 

使用iproute2:

sudo ip addr del 10.0.0.1/24 dev eth1 

显示网络接口的IPv4地址

按照如下操作可查看某个指定网络接口的IPv4地址。

使用net-tools:

ifconfig eth1

使用iproute2:

ip addr show dev eth1

同样,如果接口分配了多个IP地址,iproute2会显示出所有地址,而net-tools只能显示一个IP地址。

为网络接口分配IPv6地址

使用这些命令为网络接口添加IPv6地址。net-tools和iproute2都允许用户为一个接口添加多个IPv6地址。

使用net-tools:

sudo ifconfig eth1 inet6 add 2002:0db5:0:f102::1/64
sudo ifconfig eth1 inet6 add 2003:0db5:0:f102::1/64

使用iproute2:

sudo ip -6 addr add 2002:0db5:0:f102::1/64 dev eth1
sudo ip -6 addr add 2003:0db5:0:f102::1/64 dev eth1

显示网络接口的IPv6地址

按照如下操作可显示某个指定网络接口的IPv6地址。net-tools和iproute2都可以显示出所有已分配的IPv6地址。

使用net-tools:

ifconfig eth1

使用iproute2:

ip -6 addr show dev eth1

移除网络设备的IPv6地址

使用这些命令可移除接口中不必要的IPv6地址。

使用net-tools:

sudo ifconfig eth1 inet6 del 2002:0db5:0:f102::1/64

使用iproute2:

sudo ip -6 addr del 2002:0db5:0:f102::1/64 dev eth1

改变网络接口的MAC地址

使用下面的命令可篡改网络接口的MAC地址,请注意在更改MAC地址前,需要停用接口。

使用net-tools:

sudo ifconfig eth1 hw ether 08:00:27:75:2a:66

使用iproute2:

sudo ip link set dev eth1 address 08:00:27:75:2a:67

查看IP路由表

net-tools中有两个选择来显示内核的IP路由表:route和netstat。在iproute2中,使用命令ip route。

使用net-tools:

route -n
netstat -rn

使用iproute2:

ip route show

添加和修改默认路由

这里的命令用来添加或修改内核IP路由表中的默认路由规则。请注意在net-tools中可通过添加新的默认路由、删除旧的默认路由来实现修改默认路由。在iproute2使用ip route命令来代替。

使用net-tools:

sudo route add default gw 192.168.1.2 eth0
sudo route del default gw 192.168.1.1 eth0

使用iproute2:

sudo ip route add default via 192.168.1.2 dev eth0
sudo ip route replace default via 192.168.1.2 dev eth0

添加和移除静态路由

使用下面命令添加或移除一个静态路由。

使用net-tools:

sudo route add -net 172.16.32.0/24 gw 192.168.1.1 dev eth0
sudo route del -net 172.16.32.0/24

使用iproute2:

sudo ip route add 172.16.32.0/24 via 192.168.1.1 dev eth0
sudo ip route del 172.16.32.0/24

查看套接字统计信息

这里的命令用来查看套接字统计信息(比如活跃或监听状态的TCP/UDP套接字)。

使用net-tools:

netstat
netstat -l

使用iproute2:

ss
ss -l

查看ARP表

使用这些命令显示内核的ARP表。

使用net-tools:

arp -an

使用iproute2:

ip neigh

添加或删除静态ARP项

按照如下操作在本地ARP表中添加或删除一个静态ARP项

使用net-tools:

sudo arp -s 192.168.1.100 00:0c:29:c0:5a:ef
sudo arp -d 192.168.1.100

使用iproute2:

sudo ip neigh add 192.168.1.100 lladdr 00:0c:29:c0:5a:ef dev eth0
sudo ip neigh del 192.168.1.100 dev eth0

添加、删除或查看多播地址

使用下面的命令配置或查看网络接口上的多播地址。

使用net-tools:

sudo ipmaddr add 33:44:00:00:00:01 dev eth0
sudo ipmaddr del 33:44:00:00:00:01 dev eth0
ipmaddr show dev eth0
netstat -g

使用iproute2:

sudo ip maddr add 33:44:00:00:00:01 dev eth0
sudo ip maddr del 33:44:00:00:00:01 dev eth0
ip maddr list dev eth0 

计划任务(crontab)

在我们使用CentOS系统的过程中,我们会发现系统常常会主动的执行一些任务,这些任务到底是谁在设置工作的呢?如果你想要让自己设计的备份程序可以自动地在系统下面执行,而不需要手动地启动它,又该如何设置?这些计划型的任务可能又分为【单一】任务与【循环】任务,在系统内有时哪些服务在负责?还有还有,如果你想要每年在老婆的生日前一天就发出一封邮件提醒自己不要忘记,可以办得到嘛?嘿嘿!这些种种要如何处理,接来下我们就来了解了解。

什么是计划任务

每个人或多或少都有一些约会或是工作,有的工作是例行性的,例如每年一次的加薪、每个月一次的工作报告、每周一次的午餐汇报、每天需要的打卡等。有的工作则是临时发生的,例如刚好总公司有高管来访,需要你准备演讲器材等。在生活上也有此类例行或临时发生的事,例如每年爱人的生日、每天起床的时间等,要有突发性的电子产品大降价(真希望天天都有)等。

那么Linux的例行性工作是如何实现的呢?咱们的Linux计划任务是通过crontabat这两个东西完成的。这两个工具有啥异同?就让我们先来看看。

Linux计划任务的种类: at、cron

从上面的说明当中,我们可以很清楚地发现两种计划任务的方式。

  • 一种是例行性的,就是每隔一定的周期要来办的事项。
  • 一种是突发性的,就是这次做完以后就没有的那一种。

那么在Linux下面如何处理这两个功能?那就得使用atcrontab这两个好东西。

  • at: at是个可以支持处理仅执行一次就结束的命令,不过要执行at时,必须要有atd这个服务的支持才行。在某些新版的Linux发行版中,atd可能默认并没有启动,那么at这个命令就会失效,不过我们的CentOS默认是启动的。
  • crontab: crontab这个命令所设置的任务将会循环地一直执行下去,可循环的时间为分钟、小时、每周、每月或每年等。crontab除了可以使用命令执行外,亦可编辑/etc/crontab来支持,至于让crontab可以生效的服务则是crond。

下面我们来谈一谈Linux的系统到底在做什么事情,怎么有若干计划任务在执行呢?然后再回来谈一谈at与crontab这两个好东西。

仅执行一次的计划任务

首先,我们先来谈一谈单一计划任务的运行,那就是at这个命令的运行。

atd的启动方式

要使用单一计划任务时,我们的Linux系统上班必须要有负责这类计划任务的服务,那就是atd这个服务。不过并非所有的Linux发行版都默认启动,所以,某些时刻我们必须要手动将它启动才行。启动的方法很简单,就是这样:

systemctl restart atd # 重新启动atd这个服务
systemctl enable atd  # 让这个服务开机就自动启动
systemctl status atd  # 查看一下atd目前的状态

at的运行方式

既然是计划任务,那么应该会有产生任务的方式,并且将这些任务排进计划列表中。OK!那么产生任务的方式是怎么执行的呢?事实上,我们使用at这个命令来产生所要运行的任务,并将这个任务一文本文件的方式写入/var/spool/at/目录内,该任务便能等待atd这个服务的使用与执行了,就这么简单。

不过,并不是所有的人都可以执行at计划任务。为什么?因为安全的原因,很多主机被所谓的【劫持】后,最常发现的就是它们的系统当中多了很多的骇客(Cracker)程序,这些程序非常可能使用计划任务来执行或搜集系统信息,并定时地返回给骇客团体。所以,除非是你认可的账号。否则先不要让它们使用at目录。那怎么实现对at的管控呢?

我么可以利用/etc/at.allow/etc/at.deny这两个文件来实现对at的使用限制。加上这两个文件后,at的工作情况其实是这样的:

  1. 先寻找/etc/at.allow这个文件,写在这个文件中的用户才能使用at,没有在这个文件中的用户则不能使用at(即使没有写在at.deny当中)。
  2. 如果/etc/at.allow不存在,就查找/etc/at.deny这个文件,写在这个at.deny中的用户则不能使用at,而没有写在这个at.deny文件中的用户,就可以使用at
  3. 如果两个文件都不存在,那么只有root可以使用at这个命令。

通过这个说明,我们知道/etc/at.allow是管理较为严格的方式,而/etc/at.deny则较为松散(因为账号没有在该文件中,就能够执行at了)。在一般的Linux发行版当中,由于假设系统上的所有用户都是可信任的,因此系统通常会保留一个空的/etc/at.deny文件,允许所有人使用at命令(您可以自行检查一下该文件)。不过,万一你不希望某些用户使用at的话,将那个用户的账号写入/etc/at.deny即可,一个账号写一行。

循环执行的计划任务

相对于at是仅执行一次的任务,循环执行的计划任务则是由cron(crond)这个系统服务来控制的。刚刚谈过Linux系统上面原本就有非常多的例行性计划任务,因此这个系统服务默认启动的。另外,由于用户自己也可可以执行计划任务,所以,Linux也提供用户控制计划任务的命令(crontab)。下面我们分别来聊一聊。

用户的设置

用户想要建立循环型计划任务时,使用的是crontab这个命令。不过,为了避免安全性的问题,与at同样的,我们可以限制使用crontab的用户账号。可以使用的配置文件有:

  • /etc/cron.allow
    将可以使用crontab的账号写入其中,不在这个文件内的用户则不可使用crontab。
  • /etc/cron.deny
    将不可以使用的crontab的账号写入其中,未记录到这个文件当中的用户,就可以使用crontab。

与at很像。同样的,以优先级来说,/etc/cron.allow比/etc/cron.deny要优先。而判断上面,这两个文件只选择一个来限制而已。因此,建议你只要保留一个即可,免得影响自己在设置上面的判断。一般来说,系统默认保留/etc/cron.deny,你可以将不想让它执行crontab的那个用户写入/etc/cron.deny当中,一个账号一行。

当用户使用crontab这个命令来建立计划任务之后,该项任务就会被记录到/var/spool/cron中,而且是以账号来作为根据判断。举例来说,kevin使用crontab后,它的任务会被记录到/var/spool/cron/kevin中。但请注意,不要使用vi直接编辑该文件,因为可能由于输入语法错误,会导致无法执行cron。另外,cron执行的每一项任务都会被记录到/var/log/cron这个日志文件中,所以,如果你的Linux不知道是否被植入了木马时,也可以查找一下/var/log/cron这个日志文件。

好了,那么我们就来聊一聊crontab的语法。

crontab [-u username] [-l|-e|-r]
选项与参数:
-u : 只有root才能执行这个任务,亦即帮其他使用者建立/删除crontab计划任务。
-e : 编辑crontab的任务内容
-l : 查看crontab的任务内容
-r : 删除所有的crontab的任务内容,若仅要删除一项,请用-e去编辑。
范例一:用kevin的身份在每天的12:00发信给自己。
crontab -e
# 此时会进入vi的编辑器界面让您编辑任务,注意到,每项任务都是一行。
 0  12  *  *  * mail -s "at 12:00" kevin # /home/kevin/.bashrc
#分  时  日 月 周 【命令串】

默认情况下,任何用户只要不被列入/etc/cron.deny当中,那么它就可以直接执行【crontab -e】去编辑自己的例行性命令。整个过程就如同上面提到的,会进入vi的编辑器界面,然后以一个任务一行来编辑,编辑完毕之后输入【:wq】并存储后退出vi即可。而每项任务(每行)的格式都具有六个字段,这六个字段的意义为:

代表意义 分钟 小时 日期 月份 命令
数字范围 0~59 0~23 1~31 1~12 0~7 需要执行的命令

比较有趣的是那个【周】,周的数字为0或7时,都代表【星期天】的意思。另外,还有下面这些特殊字符:

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思。举例来说,范例一内那个日、月、周都是*,就代表着【不论何月、何日的星期几的12:00都执行后续命令】的意思
,(逗号) 代表分隔时段的意思。举例来说,如果要执行的任务是3:00与6:00时,就会是:
0 3,6 * * * command
时间参数还是有五栏,不过第二栏是3,6,代表3与6都适合
-(减号) 代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都执行一项任务:
20 8-12 * * * command
仔细看到第二栏变成8-12,代表8、9、10、11、12都适用的意思
/n(斜线) 那个n代表数字,亦即【每隔n单位间隔】的意思,例如没5分钟执行一次,则:
/5 * * * * command
很简单吧!用
/5来搭配,也可以写成0-59/5,相同意思

我们就来搭配几个例子练习看看。

1.假如你的女朋友生日是5月2日,你想要在5月1日的23:59发一封信给她,这封信的内容已经写在/home/kevin/lover.txt内了,该如何执行?

答:直接执行crontab -e之后,编辑成为:

59 23 1 5 * mail kiki < /home/kevin/lover.txt

那样的话,每年kiki都会受到你的这封信。(当然,信的内容就要每年变一变。)

2.假如每五分钟需要执行/home/kevin/test.sh一次,又该如何?

答:同样使用crontab -e进入编辑:

*/5 * * * * /home/kevin/test.sh

3.假如你每星期六都与朋友有约,那么想要每个星期五下午4:30告诉你朋友不要忘记星期六的约会,则:

答:还是crontab -e。

30 16 * * 5 [email protected] < /home/kevin/friend.txt

真的很简单吧!呵呵!那么,该如何查询用户目前的crontab内容呢?我们可以这样来看看:

crontab -l
# 注意,若仅要删除一项任务的话,必须用crontab -e去编辑,如果删除全部任务,才使用crontab -r。

看到了吗?如果使用crontab -r,那么再用crontab -l查看时发现【整个内容会不见了】,所以请注意,【如果只是要删除某个crontab的任务选项,那么请使用crontab -e来重新编辑即可】,如果使用-r的参数,是会将所有的crontab数据内容都删除掉的,千万注意了。

压缩与解压缩

在Linux下面有相当多的压缩命令可以运行,这些压缩命令可以让我们更方便地从网络上面下载容量较大的文件。此外,我们知道在Linux下面,扩展名没有什么特殊的意义。 不过,针对这些压缩命令所产生的压缩文件,为了方便记忆,还是会有一些特殊的命名方式,就让我们来看看吧!

文件压缩

什么是文件压缩呢?我们稍微谈一谈它的原理,目前我们使用的计算机系统中都是使用所谓的字节单位来计量。不过,事实上,计算机最小的计量单位应该是bit才对,此外,我们也知道 1字节=8比特(1Byte=8bit),但是如果今天我们只是记录一个数字,即1这个数字,它会如何记录?假设一个字节可以看成下面的模样:

由于 1Byte=8bit,所以每个字节当中会有8个空格,而每个空格只可以是0、1

由于我们记录的数字是1,考虑计算机所谓的二进制,如此一来,1会在最右边占据1个位,而其他的7个位将会自动地被填上0.如下图所示

你看看,其实在这样的例子中,那7个位应该是空的才对。不过,为了要满足目前我们的操作系统数据的读写,所以就会将该数据转为字节的形式来记录。而一些聪明的计算机工程师就利用一些复杂的计算方式,将这些没有使用到的空间【丢】出来,以让文件占用的空间变小,这就是压缩的技术。
另一种压缩技术也很有趣,它是将重复的数据进行统计记录。举例来说,如果你的数据为【111······】共有100个1时,那么压缩技术会记录为【100个1】而不是真的有100个1的位存在。这样也能够精简文件记录的容量,非常有趣吧!
简单地说,你可以将它想成,其实文件里面有相当多的空间存在,并不是完全填满的,而压缩技术就是将这些空间填满,以让整个文件占用的容量下降。不过,这些压缩过的文件并无法直接被我们的操作系统所使用,因此,若要使用这些被压缩过的文件数据,则必须将它还原回未压缩前的模样,那就是所谓的解压缩。而至于压缩后与压缩的文件所占用的磁盘空间大小,就可以被称为是压缩比
这个压缩与解压缩的操作有什么好处呢?
1.最大的好处就是压缩过的文件容量变小了,所以你的硬盘无形之中就可以容纳更多的数据。
2.此外,在一些网络数据的传输中,也会由于数据量的降低,好让网络带宽可以用来做更多的工作,而不是老卡在一些大型文件传输上面。

Linux系统常见压缩命令

在Linux的环境中,压缩文件的扩展名大多是: *.tar、*.tar.gz、*.gz、*.Z、*.bz2、*.xz。为什么会有这样的扩展名?不是说Linux的扩展名没有什么作用吗?
这是因为Linux支持的压缩命令非常多,且不同的命令所用的压缩技术并不相同,当然彼此之间可能就无法互通/解压缩文件。所以,当你下载到某个文件时,自然就需要知道该文件是由哪种压缩命令所制作出来的,好用来对照对照着解压缩,也就是说,虽然Linux文件的属性基本上是与文件名没有绝对关系的,但是为了帮助我们人类小小的脑袋,所以适当的扩展名还是必要的,下面我们就列出几个常见的压缩文件扩展名:

*.gz         gzip程序压缩的文件
*.bz2        bzip2程序压缩的文件
*.xz         xz程序压缩的文件
*.zip        zip程序压缩的文件
*.Z          compress程序压缩的文件
*.tar        tar程序打包的文件,并没有压缩过
*.tar.gz     tar程序打包的文件,并且经过gzip的压缩
*.tar.bz2    tar程序打包的文件,并且经过bzip2的压缩
*.tar.xz     tar程序打包的文件,并且经过xz的压缩

Linux常见的压缩命令就是gzip、bzip2以及最新的xz,至于compress已经不流行了。为了支持windows常见的zip,其实Linux也早就有zip命令了。gzip是由GNU计划所开发出来的压缩命令,该命令支持已经替换了compress。后台GNU又开发出了bzip2及xz这几个压缩比更好的压缩命令。不过,这些命令通常仅能针对一个文件来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆文件,岂不烦人?此时,这个所谓的【打包软件,tar】就显得很重要。
这个tar可以将很多文件打包成一个文件,甚至是目录也可以这么玩。不过,单纯的tar功能仅仅是打包而已,即将很多文件结合为一个文件,事实上,它并没有提供压缩的功能,后台,GNU计划中,将整个tar与压缩的功能结合在一起,如此一来,提供用户更方便且更强大的压缩与打包功能,下面我们就来谈一谈这些在Linux下面基本的压缩命令。

gzip

gzip可以说是应用最广的压缩命令了,目前gzip可以解开compress、zip和gzip等软件所压缩的文件,至于gzip所建立的压缩文件为*.gz,让我们来看看这个命令的语法:

gzip [-cdtvn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-t: 可以用来检验一个压缩文件的一致性,看看文件有无错误;
-v: 可以显示出原文件/压缩文件的压缩比等信息;
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6

示例1:压缩文件(gzip -v 文件名)

示例2:解压缩文件(gzip -d 文件名)

示例3:按照指定压缩比压缩(gzip -9 文件名)

示例4:查看压缩文件的内容(zcat 文件名)

示例5:压缩为指定文件名(gzip -c 文件名 > 指定文件名)

当你使用gzip进行压缩时,在默认的状态下原本的文件会被压缩成为.gz后缀的文件,源文件就不存在了,这点与一般习惯使用Windows做压缩的朋友所熟悉的情况不同,要注意。cat/more/less可以使用不同的方式来读取纯文本文件,那么zcat/zmore/zless则可以对应于cat/more/less的方式来读取纯文件文件被压缩后的压缩文件。

bzip2

若说gzip是为了替换compress并提供更好的压缩比而成立的,那么bzip2则是为了替换gzip并提供更加的压缩比而来。bzip2真是很不错的东西,这玩意的压缩比竟然比gzip还要好,至于bzip2的用法几乎与gzip相同,看看下面的用法吧!

bzip2 [-cdkzvn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-k: 保留原始文件,而不是删除原始文件;
-z: 压缩的参数(默认值,可以不加);
-v: 可以显示出原文件/压缩文件的压缩比等信息;
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6

示例:

bzip2 -v 待压缩文件名
bzip2 -d 压缩后的文件名
bzip2 -9 -c 待压缩的文件名 > 自定义压缩文件名

xz

虽然bzip2已经具有很棒的压缩比,不过显然某些自由软件开发者还不满足,因此后来还推出了xz这个压缩比更高的软件。这个软件的用法也跟gzip/bzip2几乎一模一样,那我们就来看一看。

xz [-cdtlkn] 文件名
选项与参数:
-c: 将压缩的数据输出到屏幕上,可通过数据流重定向来处理;
-d: 解压缩的参数;
-k: 保留原始文件,而不是删除原始文件;
-l: 列出压缩文件的相关信息;
-t: 测试压缩文件的完整性,看看有没有错误;
-z: 压缩的参数(默认值,可以不加);
-n: n为数字的意思,代表压缩等级,-1最快,但压缩比最差,-9最慢,但是压缩比最好,默认是-6

示例:

xz -v 待压缩的文件名
xz -l 压缩后的文件名
xz -d 压缩后的文件名
xz -k 待压缩的文件名

打包命令

前面谈到的命令大多仅能针对单一文件来进行压缩,虽然gzip、bzip2、xz也能够针对目录来进行压缩,不过,这几个命令对目录的压缩指的是将目录内的所有文件【分别】进行压缩的操作。而不像在Windows的系统,可以使用类似WinRAR这一类的压缩软件来将好多数据包成一个文件的样式。
这种将多个文件或目录包成一个大文件的命令功能,我们可以称它是一种打包命令,那Linux有没有这种打包命令?有,那就是大名鼎鼎的tar,tar可以将多个目录或文件打包成一个大文件,同时还可以通过gzip、bzip2、xz的支持,将该文件同时进行压缩。更有趣的是,由于tar的使用太广泛了,目前Windows的WinRAR也支持.tar.gz文件名的解压缩。

tar

tar的选项与参数特别多,我们只讲几个常用的选项,更多选项您可以自行man tar查询。

tar [-z|-j|-J] [cv] [-f 待建立的新文件名] filename... <== 打包与压缩。
tar [-z|-j|-J] [cv] [-f 既有的tar文件名]  <== 查看文件名
tar [-z|-j|-J] [xv] [-f 既有的tar文件名]  <== 解压缩
选项与参数:
-c: 建立打包文件,可搭配-v来查看过程中被打包的文件名(filename);
-t: 查看打包文件的内容含有那些文件名,重点在查看【文件名】;
-x: 解包或解压缩功能,可以搭配-C(大写)在特定目录解压,特别留意的是,-c、-t、-x不可同时出现在一串命令行中;
-z: 通过gzip的支持进行压缩/解压缩: 此时文件名最好为*.tar.gz;
-j: 通过bzip2的支持进行压缩/解压缩:此时文件名最好为*.tar.bz2;
-J: 通过xz的支持进行压缩/解压缩: 此时文件名最好为 *.tar.xz,特别留意,-z、-j、-J不可以同时出现在一串命令行中;
-v: 在压缩/解压缩的过程中,将正在处理的文件名显示出来;
-f filename: -f后面要立刻接要被处理的文件名,建议-f单独写一个选项(比较不会忘记)。
-C 目录: 这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项
-p(小写): 保留备份数据的原本权限与属性,常用于备份(-c)重要的配置文件;
-P(大写): 保留绝对路径,亦即允许备份数据中含有根目录存在之意

其实最简单的使用tar就只要记住下面的命令即可:

  • 压缩: tar -zcv -f filename.tar.gz 要被压缩的文件或目录名称;
  • 查询: tar -ztv -f filename.tar.gz
  • 解压缩: tar -zxv -f filename.tar.gz -C 欲解压缩的目录

示例:

tar -zcvf 文件名.tar.gz 文件名(目录)

tar -ztvf 文件名.tar.gz

tar -zxvf 文件名.tar.gz

源代码与Tarball

本文主要是为了让你了解如何将开发源代码的程序设计、加入库的原理、通过编译而成为可以执行的二进制程序,最后该执行文件可被我们使用的一连串过程。

  • 开放源代码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行;
  • 编译器: 将程序转译成为机器看得懂的语言,就类似翻译者的角色;
  • 可执行文件: 经过编译器变成的二进制程序,机器看得懂所以可以执行。

什么是make与configure

事实上,使用类似 gcc的编译器来进行编译的过程并不简单,因为一个软件并不会仅有一个程序文件,而是有一堆程序代码文件。所以除了每个主程序与子程序均需要写上一条编译过程的命令外,还需要写上最终的链接程序。程序代码短的时候还好,如果是类似WWW服务器软件(例如Apache),或是类似内核的源代码,动辄数百MB的数据量,编译命令会写到疯掉,这个时候,我们就可以使用make这个命令的相关功能来进行编译过程的简化。
当执行make时,make会在当前的目录查找Makefile(or makefile)这个文本文件,而Makefile里面则记录了源代码如何编译的详细信息。make会自动地判别源代码是否经过变动了,而自动更新执行文件,是软件工程师相当好用的一个辅助工具。

什么是Tarball的软件

所谓的Tarball文件,其实就是将软件的所有源代码文件先以tar打包,然后再以压缩技术来压缩,通常最常见的就是以gzip来压缩。因为利用了tar与gzip的功能,所以Tarball文件一般的扩展名就会写成*.tar.gz或是简写为*.tgz,不过,近来由于bzip2与xz的压缩率较佳,所以Tarball渐渐地以bzip2及xz的压缩技术来替换gzip,因此文件名也会变成*.tar.bz2、*.tar.xz之类的。所以说Tarball是一个软件包,你将它解压缩之后,里面的文件通常就会有:

  • 源代码文件;
  • 检测程序文件(可能是configure或config等文件);
  • 本软件的简易说明与安装说明(INSTALL或README)。

其中最重要的是那个 INSTALL 或是 README 这两个文件,通常你只要能够参考这两个文件,Tarball软件的安装是很简单的。

Tarball安装的基本步骤

以Tarball方式发布的软件是需要重新编译可执行的二进制程序。而Tarball是以tar这个命令来打包与压缩的文件,所以,当然就需要先将Tarball解压缩,然后到源代码所在的目录下进行makefile的建立,再以make来进行编译与安装的操作。所以整个安装的基础操作大多是这样的:

  1. 获取原始文件:将tarball文件在/usr/local/src目录下解压缩;
  2. 获取步骤流程:进入新建立的目录下面,去查看INSTALL与README等相关文件内容(很重要的步骤);
  3. 依赖属性软件安装:根据INSTALL/README的内容查看并安装好一些依赖的软件(非必要);
  4. 建立makefile:以自动检测程序(configure或config)检测操作环境,并建立Makefile这个文件;
  5. 编译:用make这个程序,并使用该目录下的Makefile作为它的参数配置文件,来进行make(编译或其它)的操作;
  6. 安装:以make这个程序,并以Makefile这个参数配置文件,根据install这个目录(target)的指定来安装到正确的路径。

注意到上面的第二个步骤,通常每个软件在发布的时候,都会附上名为INSTALL或是README的说明文件,这些说明文件请【确实详细地】阅读过一遍,通常这些文件会记录这个软件的安装要求、软件的工作项目与软件的安装参数设置及技巧等,只要仔细读完这些文件,基本上,要安装好Tarball的文件,都不会有什么大问题。

至于makefile在制作出来之后,里面会有相当多的目标(target),最常见的就是install与clean,通常【make clean】代表着将目标文件清除,【make】则是将源代码进行进行编译而已。注意,编译完成的可执行文件与相关的配置文件还在源代码所在的目录当中。因此,最后要进行【make install】来将编译完成的所有东西都安装到正确的路径中,这样就可以使用该软件。
ok,我们下面大概提一下大部分的Tarball软件安装的命令执行方式:

  1. ./configure
    这个步骤就是建立Makefile这个文件。通常程序开发者会写一个脚本来检查你的Linux系统、相关的软件属性等,这个步骤相当的重要,因为未来你的安装信息都是在这一步骤内完成的。另外,这个步骤的相关信息应该要参考一下该目录下的README或INSTALL相关的文件。
  2. make clean
    make会读取Makefile中关于clean的工作。这个步骤不一定会有,但是希望执行一下,因为它可以移除目标文件。因为谁也不确定源代码里面到底有没有包含上次编译过的目标文件(*.o)存在,所以当然还是清楚一下比较妥当,至少等一下新编译出来的执行文件我们可以确定是自己的机器所编译完成的嘛!
  3. make
    make会根据Makefile当中的默认设置进行编译的操作。编译的操作主要是使用gcc来将源代码编译成为可以被执行的目标文件,但是这些目标文件通常还需要链接一些函数库之类后,才能产生一个完整的执行文件。使用make就是要将源代码编译成为可以被执行的文件,而这个可执行文件会放置在目前所在的目录之下,尚未被安装到预定安装的目录中。
  4. make install
    通常这就是最后的安装步骤了,make会根据Makefile这个文件里面关于install的选项,将上一个步骤所编译完成的内容安装到预定的目录中,从而完成安装。

请注意,上面的步骤是一步一步来进行的,而其中只要一个步骤无法成功,那么后续的步骤就完全没有办法进行,因此,要确定每个步骤都是成功的才可以。举个例子来说,万一今天你在./configure就不成功了,那么就表示Makefile无法被建立起来,要知道,后面的步骤都是根据Makefile来进行的,既然无法建立Makefile,后的步骤当然无法成功。

另外,如果在make无法成功的话,那就表示源文件无法被编译成可执行文件,那么make install主要是将编译完成的文件放置到文件系统中,既然都没有可用的执行文件了,怎么进行安装?所以,要每一个步骤都正确无误才能往下继续做。此外,如果安装成功,并且是安装在独立的一个目录中,例如在/usr/local/packages这个目录中,那么你就必须手动将这个软件的man page写入到/etc/man_db.conf中。

Tarball安装建议

为什么Tarball要在/usr/local/src里面解压缩?,基本上,在默认的情况下,原本的Linux发行版发布安装的软件大多是在/usr里面,而用户自行安装的软件则建议放置在/usr/local里面,这是考虑到管理用户所安装软件的便利性。

为什么?我们知道几乎每个软件都会提供联机帮助的服务,那就是info与man的功能。在默认的情况下,man会去查找/usr/local/man里面的说明文件,因此,如果我们将软件安装在/usr/local下面的话,那么自然安装完成之后,该软件的说明文件就可以被找到了。所以,通常我们会建议大家将自己安装的软件放置在/usr/local下,至于源代码(Tarball)则建议防止在/usr/local/src(src为source的缩写)下面。

但是,如果将软件直接安装在/usr/local下,由于/usr/local原本就默认就有/etc、/bin、/lib、/man,所以安装其它软件产生的一些文件也会在上述几个目录里面,因此,如果你都安装在这个目录下的话,那么未来再想要升级或删除的时候,就会比较难以查找文件的来源。所以建议如果你的软件名是software,建议安装在/usr/local/softwsare目录下,这样单一软件的文件都在同一个目录下,那么删除该软件就简单的多了,只要将该目录删除即可视为该软件已经被删除

由于Tarball在升级与安装上面具有这些特色,亦即Tarball在反安装上面具有比较高的难度(如果你没有好好规划的话),所以,为了方便Tarball的管理,通常鸟哥会这样建议用户:

  1. 最好将Tarball的原始数据解压到/usr/local/src当中;
  2. 安装时,最好安装到/usr/local这个默认路径下;
  3. 考虑到未来的反安装步骤,最好可以将每个软件单独安装在/usr/local下面;
  4. 为安装到单独目录的软件的man page加入man path查找:
    如果你安装的软件放置到/usr/local/software/,那么在man page查找的设置中,可能就要在/etc/man_db.conf内的40~50行左右处,写入如下的一行:
    MANPATH_MAP /usr/local/software/bin /usr/local/software/man
    这样才可以使用man来查询该软件的在线文件。
Tags: