Linux sed

[TOC]

sed : Stream EDitor

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
sed  [option]... 'script' inputfile...
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印,默认在输出前会打印源内容
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i: 原处编辑
script:
'地址命令'= [地址定界] + 编辑命令 + [替换标记]
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行

编辑命令:
d: 删除模式空间匹配的行
p: 显示模式空间中的内容
a [\]text:在指定行后面追加文本,支持使用\n实现多行追加
i[\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###

替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

实例

例子来啦!没有例子呢,的确是很难懂的.那么下面就尽量给多一点例子,来详细分析上面的意思.

1
2
3
4
5
6
7
8
9
10
11
#cat base.repo
[development]
name=development
baseurl=ftp://172.16.10.10/centos7.2
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
baseurl=ftp://172.16.10.10/epel
gpgcheck=0

首先以上面这个 base.repo文件为例.

1.打印文件中的第二行

1
2
3
4
5
6
7
8
9
10
11
12
13
#sed '2p' base.repo 
[development]
name=development
name=development #这里是新打印的地方
baseurl=ftp://172.16.10.10/centos7.2
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
baseurl=ftp://172.16.10.10/epel
gpgcheck=0
#分析:首先sed默认会打印源内容,其次sed是行编辑器,所以会一行一行的处理,于是就有了到第二行打印,输出的第三行就是新打印的地方.在地址命令中:'2'对应的是'地址定界','p'呢就是'编辑命令'

2.只显示文件中第二行

1
2
3
#sed -n '2p' base.repo
name=development
# -n 选项就不用打印源文件了

3.只显示文件中第1-5行

1
2
3
4
5
6
7
#sed -n '1,5p' base.repo 
[development]
name=development
baseurl=ftp://172.16.10.10/centos7.2
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
# '1,5' '地址界定'中的'地址范围'

5.只显示文件中包含baseurl的行

1
2
3
4
#sed -n '/baseurl/p' base.repo 
baseurl=ftp://172.16.10.10/centos7.2
baseurl=ftp://172.16.10.10/epel
#这里就用到了'地址定界'中的模式匹配

6.从第5行开始显示到包含baseurl的行

1
2
3
4
5
6
7
8
#sed -n '5,/baseurl/p' base.repo 
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
baseurl=ftp://172.16.10.10/epel
#从指定行(5)开始显示,到第一次遇到baseurl停止
可以验证:sed -n '1,/baseurl/p' base.repo 看看效果

7.a显示空行行号,b显示空行并显示行号

1
2
3
4
5
#sed -n '/^$/=' base.repo 
6
#sed -n -e '/^$/p' -e '/^$/=' base.repo

6

8.在包含baseurl的行 a行前增加superman b行后增加superman c替换掉baseurl为superman

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
-------------------------------------
#sed '/baseurl/i\superman' base.repo
[development]
name=development
superman
baseurl=ftp://172.16.10.10/centos7.2
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
superman
baseurl=ftp://172.16.10.10/epel
gpgcheck=0
-------------------------------------
#sed '/baseurl/a\superman' base.repo
[development]
name=development
baseurl=ftp://172.16.10.10/centos7.2
superman
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
baseurl=ftp://172.16.10.10/epel
superman
gpgcheck=0
-------------------------------------
#sed '/baseurl/c\superman' base.repo
[development]
name=development
superman
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
superman
gpgcheck=0

9.将文件中的baseurl全部替换成BASEURL

1
2
3
4
5
6
7
8
9
10
11
12
#sed  's/baseurl/BASEURL/g' base.repo
[development]
name=development
BASEURL=ftp://172.16.10.10/centos7.2
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

[epel]
name=epel
BASEURL=ftp://172.16.10.10/epel
gpgcheck=0
#注意这里源文件并没有整的替换,只是把打印出来的替换掉了,如果真的要替换记得加一个 -i 参数

10.删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

1
2
#sed 's/^[ \t]\+//g' grub2.cfg
#这里空白包括制表符和空白,删除的话就直接替换成空就可以了

11.删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

1
sed 's/^# \+//g' fstab

其他练习:

1
2
3
4
5
6
7
在centos6系统/root/install.log每一行行首增加#号
在/etc/fstab文件中不以#开头的行的行首增加#号
处理/etc/fstab路径,使用sed命令取出其目录名和基名
利用sed 取出ifconfig命令中本机的IPv4地址
统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
将文本文件的n和n+1行合并为一行,n为奇数行

CentOS系统yum的配置

[TOC]

yum仓库使用起来特别方便,然而使用之前当然是要配置的啦。下面就介绍一下怎么从0 配置一个yum仓库。
首先要创建yum仓库,当然不能使只给一台服务器用,那要给多个服务器用的话,就需要网络服务。yum仓库支持的网络服务有两种,FTP和HTTP。用yum主要用到的是数据传输,因此FTP更适合创建yum仓库,下面就以FTP为例,说明一下yum仓库的配置。
第一步是要先在自己的服务器上提供FTP服务,而这个时候还没有yum仓库,所以只能使用rpm的方式安装vsftp,把FTP服务搭起来。这个包必须要提前有,或者从光盘中获取。
获取安装 FTP服务 并启用

1
2
3
mkdir /mnt/cdrom 
mount /dev/cdrom /mnt/cdrom
rpm -ivh /mnt/cdrom Packages/vsftpd-3.0.2-10.el7.x86_64.rpm

注意,在CentOS 6 和CentOS 7 上开启FTP服务的命令式不一样的。
iptables -F(在CentOS 7 上 也可以使用systemctl stop firewalld 来关闭防火墙)
CentOS-6 开启FTP服务
chkconfig vsftpd on === 立即打开FTP,但重启后失效
service vsftpd start === 开启FTP服务,但不会立即生效
CentOS-7 开启FTP服务
systemctl enable vsftpd === 立即打开FTP,但重启后失效
systemctl start vsftpd === 开启FTP服务,但不会立即生效

到此为止FTP服务就开启啦,在一个局域网内的电脑只需要在浏览器里面输入 ftp://ip 就可以访问这个服务器啦
但是里面说明内容的没有,顶多只有一个lost+found 和pub 的文件夹,这个目录就是本机的/var/ftp/ 共享文件要放到这个文件里面。
需要注意一点,共享的文件所有FTP客户端都可以访问,所以我们这里如果创建yum仓库的话是可以给众多使用yum的系统提供yum仓库的,只不过不同系统例如CentOS 5 、CentOS 6.7 CentOS6.8 CentOS 7 等不同版本的系统使用的程序安装包不同,所以只需要在这里分类创建文件夹,供各类系统使用即可。
实例:

1
2
3
http://server/centos/releasever/basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384

这样客户端只需要识别自己的系统版本$releasever和系统架构$basearch,就可以轻松访问FTP指定的文件夹,不需要手动修改选择进入 6 还是 7 文件夹。
分类创建好文件夹,并把rpm拷贝到指定目录下之后,执行:createrepo 这个directory 目录要指定到rpm包所在目录 或者上一级,执行完后该目录下会有一个名叫repodata的目录,该目录中记录了这个yum仓库所拥有的程序包。同时,在客户端配置yum的时候,输入yum源路径是要指定到directory这一级目录的。
如果你的电脑没有安装 createrepo-0.9.9-23.el7.noarch.rpm 包的话是不能执行 createrepo 的 ,需要安装。
而如果你想把光盘或者系统盘ISO文件中的rpm全部共享出去,只需要把光盘挂载到/var/ftp/pub/.. 目录下面就可以了,也不需要执行 createrepo 这个程序,光盘里面已经有了repodata这个文件夹。

1
eg:mount -o loop /root/CentOS-6.8-x86_64-bin-DVD1.iso  /var/ftp/pub/6.8/ 或者 mount /dev/cdrom  /mnt/cdrom

Linux查找命令find和locate

[TOC]

有些时候我们是想要在系统中查找某个具体的文件,却不知道路径在哪里,只是知道其中的某些特性,比如大小或者名字什么的。这时候就要用到查找工具啦。
在文件系统上查找符合条件的文件命令有两个,locate和find,其中locate是非实时查找即数据库查找。而find是实时查找

locate:
用法:locate [OPTION]… [PATTERN]…
[option]
-i 不区分大小写
-n # 只列举前N个匹配项目
-r 使用扩展正则表达式 查询
locate foo 搜索名称或路径中带有foo的文件
locate -r ‘.foo$’ 使用扩展正则表达式来搜索以 “.foo” 结尾的文件

查询系统上的文件索引数据库
    /var/lib/mlocate/mlocate.db 
依赖于实现构建的索引,
    索引的构建是在系统较为空闲时自动进行的(周期性任务),也可管理员手动更新数据库(updatedb)
索引构建过程需要遍历整个根文件系统,极消耗资源
工作特点:
    查找速度快(只查找数据库中有的数据)
    模糊查找
    非实时查找(在索引构建之后创建的文件时不能找到的)
    搜索的是文件的全路径,不仅仅是文件名
    可能只搜索用户具备读取和执行权限的目录

find:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path…] [expression]
即:find [option] [查找路径] [查找条件] [处理动作]
查找路径:指定具体目标路径,【默认为当前目录】
查找条件:指定的查找标准,可以文件名、大小、类型、权限等。默认找出指定路径下的所有文件
处理动作:对符合条件的文件做操作,默认输出至屏幕
【查找条件】
根据文件名和inode查找:
-name “文件名称”: 支持使用glob (文件名通配符) ,?,[],[^]
-iname “文件名称” : 不区分字母大小写
inum n 按inode号查找
-samefile name 相同inode号的文件
-links n 链接数为n的文件
-regex “PATTERN”:以pattern匹配整个文件路径字符串,而不仅仅是文件名称
根据属主属组查找:
-user username:
-group groupname:
-uid userid:
-gid groupid:
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type type: f,d,l,s,b,c,p
根据组合条件查找:
-a -o -not=!
根据文件大小来查找:
-size [+|-]#UNIT (k,M,G)
#UNIT (#-1,#] –> 如6k 即(5k,6k] 5k到6k 但不包括5k
-#UNIT:[0,#-1] –>如6k 即[0,5k]
+#UNIT:(#,∞) 大于# 但不包括#
根据时间戳查找:
以 【天】为单位
-atime[+|-]# : [0,#) [#,#+1) [#+1,∞]
-mtime[+|-]# :
-ctime[+|-]# :
以【分钟】为单位
-amin[+|-]# :
-mmin[+|-]# :
-cmin[+|-]# :
根据权限查找:
-perm [/|-] mode
mode : 精确匹配,不能多不能少
/mode 或+mode : 或关系 ugo中 只要有一个匹配即可
-mode : ugo必须至少拥有或比mode更多权限
【处理动作】
-print:默认处理动作
-ls:类似于对查找到的文件执行 ls -l
-delete:删除查找到的文件
-fls file:查找到的所有文件的长格式信息保存至指定文件中
-ok commond {} ; 对查找到的每个文件执行有commond指定的命令,每个文件执行前都要交互式确认
-exec commond {} ; 对查找到的每个文件执行有commond指定的命令
{}:用于引用查找到的文件名称自身
例:
find -name “
.conf” -exec cp {} {}.orig ;
•备份配置文件,添加.orig这个扩展名
find /tmp -ctime +3 -user joe -ok rm {} ;
•提示删除存在时间超过3天以上的joe的临时文件
find ~ -perm -002 -exec chmod o-w {} \ ;
•在你的主目录中寻找可被其它用户写入的文件
find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} ;
•在 /data 目录中 找出所有 以.sh 结尾没有执行全选的文件 增加执行权限
find /home -type d -ls
找出所有/home 目录下的 目录 列出详细信息

1
2
3
4
5
6
7
8
9
10
find /var -u root -g mail 
find /var not \(-user root -o -user lp -o -user gdm \)
find /var -ctime -7 -not \( -user root -o -user postfix \)
find / -nouser -nogroup -atime -7
find /etc -size +1M -type f
find /etc -not \( -perm +222 \)
find /etc -not \( -perm -222 \)
find /etc/init.d -perm /113
find /etc -path '/etc/sane.d' -a -prune -o -name "*.conf" -print
find /etc -path '/etc/front*' -prune -o -path '/etc/hu*' -prune -o -path '/etc/lib*' -prune -o -path '/etc/se*' -prune -o -path '/etc/init' -prune -o -name "*.conf" -print

Linux安装命令yum的使用

[TOC]

YUM: yellowdog update modifier ,rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包。
yum repository:yum repo,存储了众多RPM包,以及包相关的元数据文件,放置于特定目录repodata下。
yum 访问的文件服务器主要有三种,ftp,http,file。

yum客户端配置文件:
【/etc/yum.conf】:为所有仓库提供公共配置,man /etc/yum.conf 有英文详解
[main]
cachedir=/var/cache/yum
//yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/cache/yum
keepcache=0
  //安装完成后是否保留软件包,0为不保留(默认为0),1为保留
debuglevel=2
  //Debug 信息输出等级,范围为0-10,缺省为2
logfile=/var/log/yum.log
  //yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。
pkgpolicy=newest
//包的策略。一共有两个选项,newest 和last,这个作用是如果你设置了多个repository,而同一软件在不同的repository 中同时存在,yum 应该安装哪一个,如果是newest,则yum 会安装最新的那个版本。如果是last,则yum 会将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装。一般都是选newest。
distroverpkg=centos-release
  //指定一个软件包,yum 会根据这个包判断你的发行版本,默认是 centos-release,也可以是安装的任何针对自己发行版的rpm 包。
tolerant=1
//有1和0两个选项,表示yum 是否容忍命令行发生与软件包有关的错误,比如你要安装1,2,3三个包,而其中3此前已经安装了,如果你设为1,则yum 不会出现错误信息。默认是0。
exactarch=1
  //有1和0两个选项,设置为1,则yum 只会安装和系统架构匹配的软件包,例如,yum 不会将i686的软件包安装在适合i386的系统中。默认为1。
retries=6
  //网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6.
obsoletes=1
  //这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。
plugins=1
//是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。官方yum源的速度实在让人不敢恭维,而非官方的yum源又五花八门,让人难以取舍。幸运的是,yum-fastestmirror插件弥补了这一缺陷:自动选择最快的yum源。安装之后,生成配置文件/etc/yum/pluginconf.d/fastestmirror.conf。配置文件中的hostfilepath字段,用于定义yum源的配置文件(通常是/var/cache/yum/x86/7/timedhosts.txt),然后我们就可以将所知道的yum源统统写入这个txt文件
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum

    metadata_expire=1h
    installonly_limit = 5

【/etc/yum.repo.d/*.repo】:为仓库的指向提供配置 主要配置 [repositoryID] baseurl  gpgcheck  三个即可使用仓库
    [repositoryID]  //仓库ID
    name=Some name for this repository//仓库名称
    baseurl=url://path/to/repository/ //仓库路径,路径必须给到 repodata文件夹所在的目录
            URL可以有一下三种,file,ftp,http
    enabled={1|0}       //使能
    gpgcheck={1|0}      //是否检查来源合法性
    gpgkey=URL          //gpg证书来源路径
    enablegroups={1|0
    failovermethod={roundrobin|priority}
    默认为:roundrobin,意为随机挑选;
    cost= 默认为1000
    
    yum的repo配置文件中可用的变量:
        $releasever: 当前OS的发行版的主版本号
        $arch: 平台,i386,i486,i586,x86_64等
        $basearch:基础平台;i386
        $YUM0-$YUM9:自定义变量
        实例:
        baseurl=http://server/centos/$releasever/$basearch/

yum命令的用法:yum [options] [command] [package …]
yum-config-manager –add-repo= http://172.16.0.1/cobbler/ks_mirror/CentOS-X-x86_64/ 快速非交互式创建yum仓库
yum-config-manager –disable “仓库名” 禁用仓库
yum-config-manager –enable “仓库名” 启用仓库
yum repolist [all|enabled|disabled] 显示仓库 所有的|可用的|禁用的
yum list [all | glob_exp1] [glob_exp2] […] 根据需求筛选需要的RPM包
yum list {available|installed|updates} [glob_exp1]
yum install package1 [package2] […]
yum reinstall package1 [package2] […] 重新安装
yum remove | erase package1 [package2] […] 卸载
yum provides | whatprovidesfeature1 [feature2] […]查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]清理本地缓存:
yum search string1 [string2] […] 以指定的关键字搜索程序包名及summary信息
yum history
yum history info 6
yum history undo 6
yum history redo 6
包组管理的相关命令:
yum groupinstall group1 [group2] […]
yum groupupdate group1 [group2] […]
yum grouplist [hidden] [groupwildcard] […]
yum groupremove group1 [group2] […]
yum groupinfo group1 […]
-y: 自动回答为“yes” 可实现非交互式
创建yum仓库:
createrepo[options]

常用命令:

​ yum install package.rpm

​ yum remove package

​ yum repolist

​ yum clean all

​ yum list |grep exrep

​ yum search exgrep

Linux用户资源配额

[TOC]

用户资源系统配额
在系统中,允许系统用户使用存储空间,但是不能限制的让用户随意使用存储空间,对用户存储空间的设定就是用户资源系统配额。
下面以/home 为例,通常如果系统中有一定的用户,会把用户的家目录作为一个单独的分区,从而实现更好的管理。下面具体讲解如何把用户家目录从根系统分区分离出来进行磁盘配额。

1.备份数据

拿出一个未使用的分区,把用户家目录的数据拷贝到新的分区

1
2
3
4
5
6
fdisk /dev/sdb  --> n(新建分区)-->  p(主分区)--> +10G--> w (保存)
mkfs.ext4 -L home_dir /dev/sdb1 格式化新建的分区,卷标名称:home_dir
(如果新建分区没有跟新到内存,partx -a /dev/sdb -->centos6 partprobe -->centos7|5)
mkdir /mnt/home
mount /mnt/home /dev/sdb1 将分区临时挂载到一个目录,备份home目录中数据
cp -a /home/* /mnt/home

这样就将home家目录中的历史数据备份到新的分区里面了,但要想将之后的数据也自动存储到新建分区的中必须重新挂载,如果直接将新的分区挂载到/home 目录下,存在以下问题。第一、挂载过程中存在用户正在使用家目录的情况,挂载到/home后原来/家目录中的数据时没有用的,而且会自动隐藏掉。所以,安全起见,必须实现通知所有用户,即将要迁移家目录,选一个时间停掉服务,在init 1 模式下实现重新挂载

2.单用户模式运行

1
2
3
rm -rf /home/*
vim /etc/fstab --> /dev/sdb1 /home ext4 defaults.usrquota,grpquota 0 0
mount -a 将分区重新挂载到家目录下

3、init 3 重新回到正常模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cd /home  -->   quotacheck -cug  /home  -->可以看到 aquota.group  aquota.user两个数据库
quotaon -p /home quotaon /home 查看和打开系统配额功能
(如果系统配额没有打开,有可能是selinux功能没有关闭 )
getenforce 查看selinux setenforce=0 关闭selinux功能

repquota -a 可以查看所有用户的磁盘配额情况,显示如下
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 4 0 0 1 0 0
huyu -- 56 10240 40960 19 0 0
superman -- 48 0 0 12 0 0
supergirl -- 48 0 0 12 0 0
user/group :用户或者组名
userd:用户或者组 已经使用的存储空间,以byte为单位
soft:存储空间使用过多警告提示
hard:空间使用极限,提示如下
sdb1: warning, user block quota exceeded.
sdb1: write failed, user block limit reached.
grace: 宽限期。在这个有效时间内,存储空间数据可以使用修改
后面的分别表示 inode节点的限制,内容和空间相同,只是数值表示限制节点个数

repquota -u /dir|/dev/sdb1 repquota -g /dir|/dev/sdb1 这两个可以看分区用户和组的配额

修改用户/组 de 存储空间配额
edquota -u/g huyu --> 进入修改
edquota -p huyu user2 配额复制,user2配额 如同 huyu
setquota username soft hard soft hard 直接命令配置,没有限制,则用0 代替

4、去掉磁盘配额

1
2
3
1、 quotaoff  /dir|/dev/sdb1
2、 rm -rf aquota.user|group
3、 vim /etc/fstab

Linux防火策略iptables

[TOC]

防火墙分类

按照硬件组成部分划分:
​ 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现;
​ 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙;
按照服务范围划分:
​ 主机防火墙:服务范围为当前主机;
​ 网络防火墙:服务范围为防火墙被的局域网;

netfilter

netfilter是位于内核空间的一个防火墙框架,通过iptables这样一个规则管理工具,向框架中添加规则,从而实现防火墙功能。

iptables

Firewall:防火墙的意思,只是一个隔离工具;Packets Filter Firewall,主要实现经过该网络的数据包的过滤功能;工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件;

1
2
netfilter:防火墙框架,framework;位于内核空间;
iptables:命令行工具程序,位于用户空间;规则管理工具;

传说中的四表五链

要处理这些数据包总要一种规则,然而这些表和链就组成了一个规则。来看一张完整图:

![](complete)

1
2
3
4
5
6
7
8
9
10
11
12
表:
filter表--过滤数据包
nat表--用于网络地址转换(IP、端口)
mangle表--修改数据包的服务类型、TTL、并且可以配置路由实现QOS
raw表--决定数据包是否被状态跟踪机制处理

链:
INPUT链--进来的数据包应用此规则链中的策略
OUTPUT链--外出的数据包应用此规则链中的策略
FORWARD链--转发数据包时应用此规则链中的策略
PREROUTING链--对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链--对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯最后都由这个链处理)

上图十分清晰的表明数据包的流向。

由于四表中我们常用的就只有filter和nat,所以再来一张鸟哥版精简图:

simple

iptables的命令组成

匹配条件:
​ 网络层首部:Source IP, Destination IP, …
​ 传输层首部:Source Port, Destination Port, TCP Flags(SYN,ACK,FIN,URG,RST,PSH), …
​ 扩展检查机制:
处理动作:target
​ ACCEPT,DROP,REJECT,…

iptables 语法

iptables 不是固定的一种使用格式,而是有好多种。来看看帮助文档的写法吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# man iptables
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
其中:
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

总结起来大概就是这样

1
2
3
4
iptables [-t TABLE] COMMAND CHAIN [num] 匹配条件 -j 处理动作
iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]]

-t table:指明要管理的表; 默认为filter;

命令参数

命令参数这么多,那我们就来详细分析下命令吧。命令选项有长有断,后面只列举短的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--append  -A chain		#增加链
--check -C chain #检查链规则
--delete -D chain #删除链规则
--delete -D chain rulenum #删除制定数链规则
--insert -I chain [rulenum] #插入指定链的规则到指定位置
--replace -R chain rulenum #替换链规则
--list -L [chain [rulenum]] #列出链规则
--list-rules -S [chain [rulenum]] #打印链规则
--flush -F [chain] #清空链规则
--zero -Z [chain [rulenum]] #清零链规则
--new -N chain #创建自定义链
--delete-chain -X [chain] #删除自定义链
--policy -P chain target #修改链策略
--rename-chain -E old-chain new-chain #重命名链

这些命令可分为三类:链管理,规则管理和查看。

链管理

1
2
3
4
5
6
-P:iptables [-t table] -P chain target,定义链的默认策略;其target一般可使用ACCEPT或DROP;
-N:iptables [-t table] -N chain,自定义规则链;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数;
-X:iptables [-t table] -X [chain],删除自定义的空的引用计数为0的链;
-F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的链,或删除指定链上的规则 ;
-E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定义的引用计数为0的链;
-Z:iptables [-t table] -Z [chain [rulenum]] [options...]

规则管理

1
2
3
4
-A:append, iptables [-t table] -A chain rule-specification,追加规则到指定的链尾部;
-I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入规则到指定的链中的指定位置,默认为链首;
-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,删除指定的链上的指定规则;
-R:replace,iptables [-t table] -R chain rulenum rule-specification,将指定的链上的指定规则替换为新的规则;

规则查看

1
2
3
4
5
6
-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
-n:数字格式;
-v:verbose,详细格式信息;
-vv, -vvv
--line-numbers:显示链上的规则的编号;
-x:exactly,显示计数器的精确值;

计数器

每条规则以及链的默认策略分别有各自的两个计数器:
(1) 匹配到的报文的个数:pkts
(2) 匹配到的所有报文的大小之积:bytes

counter

匹配条件

[-m matchname [per-match-options]]

匹配条件包括基本匹配条件和扩展匹配条件,扩展匹配条件又分显示和隐式

1
2
3
4
5
匹配条件:
基本匹配条件
扩展匹配条件
隐式扩展
显式扩展

基本匹配条件

1
2
3
4
5
6
7
8
9
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或地址范围;
[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
[!] -p, --protocol protocol:检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
[!] -i, --in-interface name:检查报文进入本机时的接口是否符合本处指定的接口;INPUT, FORWARD and PREROUTING ;
[!] -o, --out-interface name:检查报文即将离开本机时经由的接口是否符合本处指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, --match match:显式指明要使用的扩展模块;
-j, --jump target:跳转目标;

注:[!] :表示取反

扩展匹配条件

隐式扩展

隐式扩展:不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p, {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
-p tcp:可直接使用tcp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;
[!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;

mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST
comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;

--tcp-flags SYN,ACK,FIN,RST SYN

[!] --syn:相当于--tcp-flags SYN,ACK,FIN,RST SYN

-p udp:可直接使用udp协议对应的扩展选项;
[!] --source-port,--sport port[:port]:匹配报文中的传输层的源端口;可给出多个连接的端口;
[!] --destination-port,--dport port[:port]:匹配报文中的传输层的目标端口;可给出多个连接的端口;

-p icmp:可直接使用cimp协议对应的扩展选项;
[!] --icmp-type {type[/code]|typename}
--icmp-type 0/0:匹配对ping请求的响应报文
--icmp-type 8/0:匹配ping请求报文

显示扩展

显式扩展:必须使用-m选项给出matchname的扩展,而且有些扩展都还存在专用选项;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
1、multiport
以离散或连续的方式定义的多端口匹配条件; Up to 15 ports can be specified.

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:匹配此处指定的源或目标端口;

2、iprange
以连续的ip地址范围指明多地址匹配条件;

[!] --src-range from[-to]
[!] --dst-range from[-to]

3、string
对报文中的应用层数据做字符串匹配检测;

[!] --string pattern
[!] --hex-string pattern
--algo {bm|kmp}:字符串匹配检查算法;
--from offset
--to offset

4、time
根据报文到达的时间与指定的时间范围进行匹配度检测;

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss]
--timestop hh:mm[:ss]

[!] --monthdays day[,day...]
[!] --weekdays day[,day...]

5、connlimit
根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;

--connlimit-upto n:连接数小于等于阈值;
--connlimit-above n:连接数超出阈值;

~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

6、limit
基于收发报文的速率进行匹配;

--limit rate[/second|/minute|/hour|/day]
--limit-burst number

# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT

7、state
状态检测:连接追踪机制(conntrack)

NEW:新连接
ESTABLISHED:已建立的连接
RELATED:相关联的连接
INVALID:无法识别的连接
UNTRACKED:未被追踪连接;

相关的内核模块:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp 手动装载

追踪到的连接:/proc/net/nf_conntrack文件中;
能追踪的最大连接数量定义在:/proc/sys/net/nf_conntrack_max 建议调整至足够大;
不同的协议的连接追踪时长: /proc/sys/net/netfilter/

[!] --state state

如何开放被动模式的ftp服务:
(1) 装载追踪ftp协议的模块;
# modprobe nf_conntrack_ftp

(2) 放行入站命令连接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

(3) 放行入站数据连接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(4) 放行出站的ESTABLISHED连接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT

处理动作(跳转目标)

-j tagetname [per-target-options]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
简单target:
ACCEPT,DROP

扩展target:
REJECT:
--reject-with type
icmp-net-unreachable,
icmp-host-unreachable,
icmp-port-unreachable,
icmp-proto-unreach‐able,
icmp-net-prohibited,
icmp-host-prohibited,
icmp-admin-prohibited,
默认为:icmp-port-unreachable;
LOG:
Turn on kernel logging of matching packets.

--log-level level
--log-prefix prefix:日志信息的前导信息;

保存和载入规则

CentOS 7:

1
2
3
4
5
6
保存:iptables-save > /PATH/TO/SOME_RULE_FILE 
重载:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不予提交;

注意:重载文件中的规则,会清除已有规则;

CentOS 6:

1
2
3
4
5
6
7
保存:service  iptables  save
保存规则于/etc/sysconfig/iptables,保存操作会清除文件中原有的内容;
重载:server iptables restart
默认重载/etc/sysconfig/iptables文件中的规则

脚本配置文件:/etc/sysconfig/iptables-config
用于指明要装载的模块;

规则添加是考量原则

(1) 报文流经的位置:用于判断将规则添加至哪个链;
(2) 实现的功能:用于判断将规则添加至哪个表;
(3) 报文的方向:用于判断哪个为“源”,哪个为“目标”;
(4) 匹配条件:用于编写能够正确匹配目标报文的规则;

优化规则思路

(1) 优先放行双方向状态为ESTABLISHED的报文;
(2) 服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3) 服务于同一类别的功能的规则,匹配条件较为严格的放前面;
(4) 设置默认策略:白名单机制

​ (a) 可使用iptables -P设定默认策略;不建议
​ (b) 建议在规则链的最后定义规则做为默认策略;

看完了吗?试试吧!

1
2
3
4
练习:基于状态放行telnet, ftp, ssh, http, samba, icmp等服务;
(1) 对本机的ping请求每分钟不得超出20个;
(2) 每客户端对本机的ssh的并发连接数不得超过3个;
(3) 本机的telnet服务仅允许工作时间内访问;

网络防火墙

网络防火墙主要是在两个地方做:

(1) 网关;
(2) filter表的FORWARD链;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
要注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性;
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接报文;

NAT: Network Address Translation
请求报文:由管理员定义;
响应报文:由NAT的conntrack机制自动实现;

请求报文:
改源地址:SNAT
改目标地址:DNAT

iptables/netfilter:
NAT定义在nat表;
PREROUTING,INPUT,OUTPUT,POSTROUTING

SNAT:POSTROUTING
DNAT:PREROUTING
PAT:

target:
SNAT:
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.

--to-source [ipaddr[-ipaddr]]

DNAT:
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-destination [ipaddr[-ipaddr]][:port[-port]]

MASQUERADE
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;

REDIRECT
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

--to-ports port[-port]

Linux日志工具之rsyslog

[TOC]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
日志:历史事件;
历史事件:时间、地点、事件;

syslog:
klogd:kernel
syslogd:system(application)

事件记录格式:
日期时间 主机 进程[pid]: 事件内容;

C/S架构:通过TCP或UDP协议的服务完成日志记录传送;

rsyslog:
rsyslog的特性:
多线程;
UDP/TCP/SSL/TLS/RELP;
存储日志信息于MySQL, PGSQL, Oracle等RDBMS;
强大的过滤器,实现过滤日志信息中的任何部分的内容;
自定义的输出格式;
……

ELK:
E: elasticsearch, L: logstash, K: kibana

rsyslog日志收集器的基本术语:
facility:设施,收束日志数据流为有限几个;
auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security, user, uucp, syslog, local0-local7
proirity:优先级
debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)

程序包:rsyslog
程序环境:
配置文件:/etc/rsyslog.conf,/etc/rsyslog.d/*.conf
主程序:/usr/sbin/rsyslogd
CentOS 6:service rsyslogs {start|stop|restart|status}
CentOS 7:/usr/lib/systemd/system/rsyslog.service

配置文件格式:
由三部分组成:
MODULES:模块配置
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的配置

RULES:
配置格式:
facility.priority target

facility:
*: 所有的facility;
f1,f2,f3,...:指定的facility列表;

priority:
*: 所有级别;
none:没有级别;
PRIORITY:指定级别(含)以上的所有级别;
=PRIORITY:仅记录指定级别的日志信息;

target:
文件:将日志信息记录到指定的文件中;文件路径前的-表示异步写入;
用户:将日志事件通知给指定的用户;
日志服务器:@host,把日志通过网络送往指定的服务器记录,而非由本地记录;
管道: | COMMAND

配置rsyslog成为日志服务器:
#### MODULES ####
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

其它的日志文件:
/var/log/secure:系统安装日志,应该周期性分析;
/var/log/btmp:当前系统上,用户的失败尝试登录相关的日志信息,lastb命令进行查看;
/var/log/wtmp:当前系统上,用户正常 登录系统的相关日志信息,last命令可以查看;

lastlog命令:用于查看当前系统上每一个用户最近一次的登录信息;

/var/log/messages:系统日志信息;
/var/log/dmesg:系统引导过程中的日志信息;
文本查看工具查看;
也可以使用专用命令dmesg查看;

rsyslog将日志记录于MySQL中:
(1) 准备MySQL Server;
(2) 在mysql server上授权rsyslog能连接至当前服务器;
mysql> GRANT ALL ON Syslog.* TO 'USER'@'HOST' IDENTIFIED BY 'PASSWORD';
(3) 在rsyslog主机上安装mysql模块相关的程序包;
yum install rsyslog-mysql
(4) 为rsyslog创建数据库及表;
mysql -uUSERNAME -hHOST -pPASSWORD < /usr/share/doc/rsyslog-7.4.7/mysql-createDB.sql
(5) 配置rsyslog将日志保存到mysql中;
#### MODULES ####
$ModLoad ommysql

#### RULES ####
facility.priority :ommysql:DBHOST,DBNAME,DBUSER,DBUSERPASSWORD

(6) 重启rsyslog服务;

通过loganalyzer展示数据库中的日志:
(1) 准备amp或nmp组合;
# yum install httpd php php-mysql php-gd

(2) 安装LogAnalyzer:
# tar xf loganalyzer-3.6.5.tar.gz
# cp -a loganalyzer-3.6.5/src /var/www/html/loganalyzer
# cd /var/www/html/loganalyzer
# touch config.php
# chmod 666 config.php

(3) 配置loganalyzer:
systemctl start httpd.service

http://HOST/loganalyzer

MySQL Native, Syslog Fields, Monitorware

(4) 安全加强
# cd /var/www/html/loganalyzer
# chmod 644 config.php

Linux的inode软链接和硬链接

[TOC]

Linux系统中的链接有两种,软连接和硬链接。要充分了解他们最好先了解下inode.

inode

简单来说就是系统文件记录方式用的是inode,二文件名称只是inode的一个别名,就好像机房有100台主机,每台主机有自己的编号(inode),而有两个主机用来做管理,所以取名叫master1,master2(文件名).

为什么要这么做呢?文件系统是数据在硬盘上的一种排列组织方式,linux每个分区都可以格式化为不同的文件系统,所以可以说每个分区都是一个文件系统,都有自己的目录层次结构。而在目录之下,linux已经将所有的资源处理成为文件,不论是目录还是命令,之后linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构,实现对不同分区的数据进行访问。但是通过目录层次访问磁盘上的文件,只是表面现象。要知道数据在磁盘上以块(block)存储(一个block由8个扇区组成,每个扇区0.5K,扇区是硬盘存储数据的最小单位)数据的大小不一,造成了块的数量也不尽相同,增删改查都会影响数据块的排列方式,那么如何在众多的可能不连续的数据块中,如何精准的找到数据对应的那些块,必须依附在一张索引列表之上,这就是inode。当然,inode中不仅仅存储着指针,还存储着对应资源的权限、属主、属组和大小.

inode也是存储在block上的一段数据,所以其也是占用磁盘空间的,每个分区都有自己的inode上限,所以有时候如果显示磁盘空间已满,inode上限也需要作为一个原因,可使用df -i查看

1
2
3
4
5
6
7
8
9
10
11
12
[yhu@login ~]$df -i 
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 419430400 1008127 418422273 1% /
/dev/sda1 2097152 374 2096778 1% /boot
[yhu@login ~]$df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda2 400M 985K 400M 1% /
/dev/sda1 2.0M 374 2.0M 1% /boot
[yhu@login ~]$df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 400G 144G 257G 36% /
/dev/sda1 2.0G 169M 1.9G 9% /boot

查看文件的inode,使用ls -i

1
2
[yhu@login test_images]$ls -i 
30373532983 Tumor_084_Mask.tif 30373532982 tumor_084.tif

注意:

​ 同一个分区每一个inode都是唯一的,两个不同分区的文件inode可以相同.

inode的应用

​ 在实际生活中,我们删除数据的时候,只不过是删除掉了指向文件的inode路径,文件依然存在于磁盘之上,这时我们是可以通过一些手段恢复数据的,其本质也不过只是添加了指向文件数据的inode。如果未及时恢复,在原来的磁盘空间上重新写入了数据后,那么数据就很难恢复了。

硬链接

一个分区中文件inode唯一,但是可以共享,就是取多个别名,文件刚创建的时候就有一个别名了,创建硬链接就是再创建一个别名,inode一样.

命令ln SRC_FILE DES_FILE

1
2
3
4
5
6
[yhu@login test]$ls
inceptionV3.h5 inode output p.yaml
[yhu@login test]$ln -v inode inode_test
‘inode_test’ => ‘inode’
[yhu@login test]$ls -i
175021784 inceptionV3.h5 20576826 inode 20576826 inode_test 22456345464 output 17028267 p.yaml

这里发现创建的硬链接和原有文件使用的是相同的inode.

1
2
3
4
5
[yhu@login ~]$ll
drwxrwx--- 3 yhu mitosis_detection 4096 Dec 4 11:52 auto
drwxrwx--- 2 yhu mitosis_detection 137 Dec 4 13:31 bin
-rw-rw-r-- 1 yhu mitosis_detection 44 Jan 22 11:40 cc
#在第二列中 的 3 2 1 这个就是描述

注意:

​ 硬链接不可以跨分区创建.

​ 删除原来的文件,通过新的硬链接也同样可以访问到文件内容.

软链接

在硬链接之外,还存在一种情况,那就是虽然创建了a文件,但是通过b路径也可以访问到a的内容,尽管a和b的inode不同,但是此时b借助a的路径访问到了a的内容,b就叫做a的软链接。实际上b文件存的是a的路径,找到了a,再通过a访问内容.

命令ln -s SRC_FILE DES_FILE

1
2
3
4
5
6
[yhu@login test]$ln -sv inode test
‘test’ -> ‘inode’
[yhu@login test]$ls
inceptionV3.h5 inode inode_test output p.yaml test
[yhu@login test]$ll
lrwxrwxrwx 1 yhu mitosis_detection 5 Mar 18 15:32 test -> inode

下面看一个有意思的现象

1
2
3
4
5
6
7
8
[yhu@login ~]$pwd
/atlas/home/yhu
[yhu@login ~]$ln -sv cc /tmp/new
‘/tmp/new’ -> ‘cc’
[yhu@login ~]$ll /tmp/new
lrwxrwxrwx 1 yhu mitosis_detection 2 Mar 18 15:34 /tmp/new -> cc
[yhu@login ~]$cat /tmp/new
cat: /tmp/new: No such file or directory

在查看new的时候为什么会报错呢? 因为new这个软连接指向的是new这么目录下的cc,而/tmp/new这个目录下没有cc,因此报错.正确的做法如下:

1
2
3
4
5
6
7
[yhu@login ~]$cd /tmp/            crossbar-starter/ 
[yhu@login tmp]$ln -sv ../atlas/home/yhu/cc new2
‘new2’ -> ‘../atlas/home/yhu/cc’
[yhu@login tmp]$ll new2
lrwxrwxrwx 1 yhu mitosis_detection 20 Mar 18 15:35 new2 -> ../atlas/home/yhu/cc
[yhu@login ~]$cat /tmp/new2
ok

注意:

​ 软连接可以跨分区创建

​ 删除了源文件,软连接就会失效

​ 在实际生产生活中,尽量使用相对路径的软链接,来增强代码的可移植性

Linux终端类型

[TOC]

1.终端的概念

所谓终端就是在一个连接主机的端子上面接入鼠标、键盘、显示器等所组成的一个组合。终端用于用户与主机之间的交互。早期的时候,在大型主机上,想使用主机的用户很多,但是主机却只有一个,也不能实现人手一台。于是为了让一台主机给多个用户使用,便产生了多个终端和多个用户,这样每个用户只要有一个终端变可以与主机交互了。

2.终端的类型

终端的类型有四类:物理终端,虚拟终端,图形终端和伪终端。

物理终端:

将鼠标、键盘、显示器直接连接到主机的接口上。也称为物理控制台(console)–/dev/console。

虚拟终端:

附加在物理终端之上,用软件的方式实现虚拟终端。centos中有6个虚拟中断,通过Alt+Ctrl+(F1-F6)进行切换。

图形终端:

图形终端也是附加在物理终端之上,用软件的方式实现。但提供桌面环境,切换方式 Ctrl+Alt+F7.

伪终端:

在图形界面下打开的的命令行界面,或者基于ssh协议或Telnet协议等远程打开的命令行界面。例如用xshell或者secureCRT远程连接的命令行界面就是属于伪终端。

在这里我们要注意的是,实际操作中当我们的系统启动还没有完全运行起来的时候,在我们的设备上运行的终端是物理终端,在服务完全启动之后映射的就是虚拟终端或者图形终端啦。

Linux用户和组的权限

[TOC]

1、文件的权限分类

文件的权限对象分三类:属主(u)、属组(g)、其他(o),每个对象都有rwx,读写执行三类权限。
对于文件
    r:可查看文件内容
    w:可修改其类容
    x:可把此文件提请内核启动为一个进程
对于目录
    r:可使用ls查看此目录中文件列表
    w:可在此目录中创建和删除文件
    x:可使用ls查看目录中文件列表,可以cd进入此目录
    X:只给目录x权限,不给文件x权限
在访问文件之前,必须要先能够进入文件的父目录
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
    (a) 进程的发起者,同文件的属主:则应用文件属主权限
    (b) 进程的发起者,属于文件属组;则应用文件属组权限
    (c) 应用文件“其它”权限
root 没有了 x 执行权限不能执行,但是可以给自己加权限
root用户没有读和写权限也可以直接修改查看。

2、chmod 用法

a、chmod [option]... 八进制  file
    eg:chmod -R 755 /dir
b、chmod [option]... mode ... file 
    eg:chmod u=rwx,g=rx,u= file/dir
    或者 chmod a=rx file/dir 或者 chmod u+w file/dir
c、chmod [option] ... --reference = rfile file 
    参考rfile权限 复制到 file
    
chmod -R a=rwX dir
目录下的文件如果有x权限 则都有x权限
如果没有x权限 则 所有的文件都没有x权限 
但是所有的目录都有x权限

3、新建文件和目录的默认权限

新建FILE权限:666-umask如果所得结果某位存在执行(奇数)权限,则将其权限+1
新建DIR权限: 777-umask,非特权用户umask是002,root的umask是022
umask: 查看  umask#: 设定  #umask -S --> u=rwx,g=rx,o=rx #umask -p --> umask 0022

4、Linux文件系统上的特殊权限,SUID, SGID, Sticky

chmod 4755 file
chmod u+s /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
当用户使用passwd【具有suid权限的二进制程序文件】命令,用户权限临时切换成【passwd文件所有者】权限
启动为进程之后,其进程的属主为原程序文件的属主
/bin   文件夹下面有众多 红色背景的程序均是这样。

chmod 2755 
/usr/bin/passwd chmod g+s /usr/bin/passwd
-rwxr-sr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
当用户使用passwd【具有suid权限的二进制程序文件】命令,用户权限临时切换成【passwd文件所属组】权限    --黄色背景
启动为进程之后,其进程的属主为原程序文件的属组

chmod 1777 /dir
[root@localhost conf]#ll -d /tmp 
drwxrwxrwt. 18 root root 4096 Oct 16 02:52 /tmp
可以在目录中删除【自己的】文件,而不能删除别人的文件

chmod 2755 dir
chmod g+s /dir
-rwxr-sr-x. 1 root root 30768 Feb 22  2012 /dir 
当该目录【所属组用户】在该目录下创建文件的时候,创建的文件所属组均为目录的所属组

小坑一个: 用0777,并不能把sst等权限去掉
没有执行权限则该位置显示为【S、T】

5、设定文件特定属性(attr–attribute)

chattr +i 不能删除,改名,更改 +a 只能追加(>>)
lsattr 显示文件特定属性。

6、ACL

ACL:Access Control List,实现灵活的权限管理,除了u,g,o可以对更多的用户设置权限
ACL生效顺序:所有者(属主,属组),自定义用户,自定义组,其他人

setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
    -b,--remove-all:删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留。 
    -k,--remove-default:删除缺省的acl规则。如果没有缺省规则,将不提示。 
    -n,--no-mask:不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定。 
    --mask:重新计算有效权限,即使ACL mask被明确指定。 
    -d,--default:设定默认的acl规则。 
    --restore=file:从文件恢复备份的acl规则(这些文件可由getfacl-R产生)。通过这种机制可以恢复整个目录树的acl规则。
        此参数不能和除--test以外的任何参数一同执行。 
    --test:测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。 
    -R,--recursive:递归的对所有文件及目录进行操作。 
    -L,--logical:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。 
    -P,--physical:跳过所有符号链接,包括符号链接文件。 
    --version:输出setfacl的版本号并退出。 --help:输出帮助信息。 
    --:标识命令行参数结束,其后的所有参数都将被认为是文件名 
    -:如果文件名是-,则setfacl将从标准输入读取文件名。
    
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  -m, --modify=acl        modify the current ACL(s) of file(s)
  -M, --modify-file=file  read ACL entries to modify from file
  -x, --remove=acl        remove entries from the ACL(s) of file(s)
  -X, --remove-file=file  read ACL entries to remove from file

例子:
    mount -o acl /directory
    getfacl file|directory      --获取文件或者目录的acl
    setfacl -m u:wang:rwx file|directory    --增加文件或者目录的用户acl
    setfacl -Rm g:sales:rwX directory       --目录及其子目录以及文件增加用户acl,新增加文件或者目录不会自带acl
    setfacl -M file.acl file|directory      --参照file.acl 给目录或者文件增加acl
    setfacl -m g:salesgroup:rw file| directory  --增加文件或者目录的用户组acl
    setfacl -m d:u:wang:rx directory        --增加该目录的acl,新增文件或者目录的时候【自带acl】,目录下原有的文件或者目录acl不变
    setfacl -x u:wang file|directory        --删除文件或者目录中,对应用户的acl ,mask还在
    setfacl -X file.acl directory           --参照file.acl 删除目录中的acl ,mask还在
    setfacl -Rb directory                   --清空目录下的所有acl,包括mask
    setfacl-k dir                           --删除默认ACL权限

【注意】:
    默认拷贝不会拷贝文件或者目录的acl,用cp来复制文件的时候我们现在可以加上-p选项。对于不能拷贝的ACL属性将给出警告。
    mv命令将会默认地移动文件的ACL属性,同样如果操作不允许的情况下会给出警告。
    如果你的文件系统不支持ACL的话,你也许需要重新mount你的file system: mount -o remount, acl [mount point] 
    如果用chmod命令改变Linux file permission的时候相应的ACL值也会改变,反之改变ACL的值,相应的file permission也会改变。