码迷,mamicode.com
首页 > 系统相关 > 详细

Linux基础学习5

时间:2015-10-22 12:06:11      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:

程序管理与SELinux初探

process&program
 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体档案的型态存在;
 进程 (process): 程序被系统执行时,执行者的权限与属性、程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。
 
子进程与父进程
子进程可以取得父进程的环境变量
ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 8074 8072 2 76 0 - 1287 wait pts/1 00:00:00 bash
0 S 0 8102 8074 4 76 0 - 1287 wait pts/1 00:00:00 bash
4 R 0 8118 8102 0 78 0 - 1101 - pts/1 00:00:00 ps
PPID : parent pid ;
 
 
fork-and-exec
进程都会由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子程序再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程。
技术分享
 
job control
用在 bash 环境下,也就是说: 当我们登入系统取得 bash shell 后,在单一终端机接口下同时进行多个工作的行为管理;
举例来说,我们在登入 bash 后, 想要一边复制档案、一边进行资料搜寻、一边进行编译,还可以一边进行 vi 程序编写! 当然我们可以重复登入
那六个文字接口的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以啊!就是使用 job control 啦
 
job control 使用注意点:
 这些工作所觉发的程序必项来自与你 shell 的子程序(即管理自己的 bash);
 前景:你可以控制不下达指令的这个环境称为前景的工作 (foreground);
 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
 背景中『执行』的程序不能等待 terminal/shell 的输入(input)
 
&
直接将指令丢到背景中执行
[root@www ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 8400 <== [job number] PID
[root@www ~]# tar: Removing leading `/ from member names
# 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
# 后续的8400 则是这个工作在系统中的 PID。至于后续出现的数据是 tar 执行数据流,
# 由与我们没有加上数据流重导向,所以会影响画面!不过不会影响前景的操作

 

当然指令有stdout 及stderr时,他的数据依旧是输出到屏幕上面的,这样虽然前景可以工作,但是被这些输出搞的乱乱的 也没有办法工作了,所以最好的办法就是使用数据流重定向;
[root@www ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 8429
[root@www ~]#

 

[ctrl]-z
将『目前』的工作丢到背景中『暂停』
[root@www ~]# vi ~/.bashrc
# 在 vi 的一般模式下,按下 [ctrl]-z 这两个按键
[1]+ Stopped vim ~/.bashrc
[root@www ~]# <==顺利取得了前景的操控权!
[root@www ~]# find / -print
....(输出省略)....
# 此时屏幕会非常的忙碌!因为屏幕上会显示所有的文件名。请按下 [ctrl]-z 暂停
[2]+ Stopped find / -print

 

jobs
观察目前的背景工作状态
[root@www ~]# jobs [-lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
范例一:观察目前的 bash 当中,所有的工作,与对应的PID
[root@www ~]# jobs -l
[1]- 10314 Stopped vim ~/.bashrc
[2]+ 10833 Stopped find / -print
 + 代表预设的取用工作。 所以说:『 目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那举那个 [2] 会被拿到前景当中来处理』其实 + 代表最近被放到背景的工作号码, - 代表最近第二个被放置到背景中的工作号码
 
 
fg
将背景工作拿到前景来处理
[root@www ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!
范例一:先以 jobs 观察工作,再将工作取出:
[root@www ~]# jobs
[1]- 10314 Stopped vim ~/.bashrc
[2]+ 10833 Stopped find / -print
[root@www ~]# fg <==预设取出那个 + 的工作,即 [2]。立即按下[ctrl]-z
[root@www ~]# fg %1 <==直接规定取出的那个工作号码!再按下[ctrl]-z
[root@www ~]# jobs
[1]+ Stopped vim ~/.bashrc
[2]- Stopped find / -print

看到区别了吗,现在+号对应的就是此刻最新放入背景当中的工作噢;

 

bg
让工作在背景下的状态变成运作中(running)
范例一:一执行 find / -perm +7000 > /tmp/text.txt 后,立刻丢到背景去暂停!
[root@www ~]# find / -perm +7000 > /tmp/text.txt
# 此时,请立刻按下 [ctrl]-z 暂停!
[3]+ Stopped find / -perm +7000 > /tmp/text.txt
范例二:让该工作在背景下进行,并且观察他!!
[root@www ~]# jobs ; bg %3 ; jobs
[1]- Stopped vim ~/.bashrc
[2] Stopped find / -print
[3]+ Stopped find / -perm +7000 > /tmp/text.txt
[3]+ find / -perm +7000 > /tmp/text.txt & <==用 bg%3 的情况!
[1]+ Stopped vim ~/.bashrc
[2] Stopped find / -print
[3]- Running find / -perm +7000 > /tmp/text.txt &

 

 
kill
管理背景当中的工作
[root@www ~]# kill -signal %jobnumber
[root@www ~]# kill -l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示用 man 7 signal 可知:
-1 :重新读取一次参数的配置文件 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
 
kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字 了, 这点与前面不必要加%不一样,因此还是推荐在使用job control 是使用% 养成良好习惯;
 
nohup
在脱机或注销系统之后,还能继续工作;
[root@www ~]# nohup [指令与参数] <==在终端机前景中工作
[root@www ~]# nohup [指令与参数] & <==在终端机背景中工作
例子:
# 1. 先编辑一支会『 睡着 500 秒』的程序:
[root@www ~]# vim sleep500.sh
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."
# 2. 丢到背景中去执行,并立刻注销系统:
[root@www ~]# chmod a+x sleep500.sh
[root@www ~]# nohup ./sleep500.sh &
[1] 5074
[root@www ~]# nohup: appending output to ‘nohup.out’ <==会告知这个讯息!
[root@www ~]# exit
程序观察:
PS:
[root@www ~]# ps aux <==观察系统所有的程序数据
[root@www ~]# ps -lA <==也是能够观察所有系统的数据
[root@www ~]# ps axjf <==连同部分程序树状态
选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
-x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
-l :较长、较详细的将该 PID 的信息列出;
-j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
 
一般两种常用:ps -l  查阅自己bash 程序的 
                         ps aux  查询系统所有运行的程序
 
[root@www ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 13639 13637 0 75 0 - 1287 wait pts/1 00:00:00 bash
4 R 0 13700 13639 0 77 0 - 1101 - pts/1 00:00:00 ps
F:代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号码有:
   若为 4 表示此程序的权限为 root ;
   若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。
S:代表这个程序的状态 (STAT),主要的状态有:
   R (Running):该程序正在运作中;
   S (Sleep):开程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
   D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O的情况(ex>打印)
   T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
   Z (Zombie):僵尸状态,程序已经终止但却无法被移除至内存外。
UID/PID/PPID:代表『此程序被该 UID 所拥有/程序的 PID 号码/此程序的父程序 PID 号码』
C:代表 CPU 使用率,单位为百分比;
PRI/NI:Priority/Nice 的缩写,代表此程序被 CPU 所执行的优先级,数值越小代表该程序越先 执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该程序在内存的哪个部分,如果是个 running 的程序,一般就会显示『- 』 / SZ 代表此程序用掉多少内存 / WCHAN表示目前程序是否运作中,同样的, 若为 - 表示正在运作中。
TTY:登入者的终端机位置,若为进程登录则使用动态终端接口 (pts/n);
TIME:使用掉的 CPU 时间,注意,是此程序实际花费 CPU 运作的时间,而不是系统时间;
CMD:就是 command 的缩写,造成此程序运行的指令为何。
 
注意:状态中:Z(Zombie):僵尸状态,需要注意一下,因为此时程序已经终止但却无法被移除到内存外了;
 
top
动态观察程序的变化
[root@www ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d :后面可以接秒数,就是整个程序画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top !通常会搭配数据流重导向来将批次的结果输出成为档案。
-n :与 -b 搭配,意思是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。
 
nice与priority有关,也是越小越早被执行
 
pstree
[root@www ~]# pstree [-A|U] [-up]
选项与参数:
-A :各程序树之间的连接以 ASCII 字符来连接;
-U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。
 
signal
常见型号:
代号   名称                                  内容
1       SIGHUP      启动被终止的程序,重新读取配置文件,类似重启
2       SIGINT       类似 [ctrl]-c 来中断一个程序的进行
9       SIGKILL      强制中断程序的进行,如果该程序进行到一半, 那么尚未完成的                       部分可能会有『半产品』产生,类似 vim 会有 .filename.swp 保留下来。
15     SIGTERM    以正常的结束程序来终止该程序。不过,如果该程序已经发生问题,就是无法使用正常的终止时, 输入这个 signal 也是没有用的。
17     SIGSTOP      相当于用键盘输入 [ctrl]-z 来暂停一个程序的进行
 
信号传递:
kill -signal PID
 
killall 
直接给某个程序一个signal
[root@www ~]# killall [-iIe] [command name]
选项与参数:
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
-e :exact 的意忠,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
 
PRI
值越小CPU执行的优先级越高
PRI=PRI+nice     动态调整
 
nice
nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整自己或他人程序的Nice 值,且范围为 -20 ~ 19 ;
一般用户仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避面一般用户抢占系统资源);
 
调整nice
 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
调整某个已经存在的 PID 的 nice 值:用 renice 指令。
 
[root@www ~]# nice [-n 数字] command
选项与参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。
[root@www ~]# renice [number] PID
选项与参数:
PID :某个程序的ID 啊!

 

系统资源的观察
free
观察内存使用情况
[root@www ~]# free [-b|-k|-m|-g] [-t]
选项与参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes),
m(Mbytey)k(Kbytes), 及 g(Gbytes) 来显示单位喔!
-t :在输出的最终结果,显示物理内存与 swap 的总量。
 
uname
查阅系统与核心相关信息
[root@www ~]# uname [-asrmpi]
选项与参数:
-a :所有系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 戒 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件癿平台 (ix86)
 
uptime
观察系统启动时间与工作负载
 
netstat
网络监控
[root@www ~]# netstat -[atunlp]
选项与参数:
-a :将目前系统上所有的联机、监听、 Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不已程序的服务名称,以串口号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的程序 PID
 
dmesg
系统在开机的时候,核心会去侦测系统的硬件,你的某些硬件到底有没有被捉到,那就不这个时候的侦测有关。 但是这些侦测的过程要不是没有显示在屏幕上,就是飞快的在屏幕上一闪而逝!能不能把核心侦测的讯息捉出来瞧瞧? 可以的,那就使用 dmesg 吧!
 
vmstat
侦测系统资源变化
 
 
SELinux(security enhance Linux)
其实 SELinux 是在进行程序、档案等权限设定的依据核心模块
 
自主式访问控制 (Discretionary Access Control, DAC)基本上就是依据程序拥有者与档案资源的rwx权限来决定由无存取能力,那么困扰来了:
1.root 具有最高的权限:如果不小心某支程序被有心人士取得, 且该程序属于 root 的权限,那么这支程序就可以在系统上进行任何资源的存取!
2.如果你不小心将某个目录的权限色定为 777 ,由与对任何人的权限会变成 rwx ,因此该目录就会被任何人所任意存取!
 
委任式访问控制 (Mandatory Access Control, MAC)
以政策规则订定特定程序度取特定档案
 
SELinux的运作模式:
SELinux 是透过 MAC 的方式来控管程序,他控制的主体是程序, 而目标是该程序能否度取的『档案资源』
 
主体 (Subject)
目标 (Object)
政策 (Policy):
o targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
o strict:完整的 SELinux 限制,限制方面较为严格。
安全性本文 (security context):
主体能不能存取目标除了政策指定之外,主体与目标的安全性本文必项一致才能够顺利存取
 
程序的安全性文本可以直接写入,而文档的安全性文本在档案的inode内;
ls -Z 
[root@www ~]# ls -Z  #查看安全性文本
drwxr-xr-x root root root:object_r:user_home_t  Desktop
-rw-r--r-- root root root:object_r:user_home_t   install.log
-rw-r--r-- root root root:object_r:user_home_t   install.log.syslog
# 上述特殊字体的部分,就是安全性本文的内容!
文本三个字段的意义为:
Identify:role:type
身份识别:角色:类型
身份识别 (Identify):
相当于账号方面的身份识别!主要的身份识别则有底下三种常见的类型:
root:表示 root 的 账号身份,如同上面的表格显示的是 root 家目录下的数据啊!
system_u:表示系统程序方面的识别,通常就是程序啰;
user_u:代表的是一般使用者账号相关的身份。
 
角色 (Role):
透过角色字段,我们可以知道这个数据是属与程序、档案资源还是代表使用者。一般的角色有:
object_r:代表的是档案或目录等档案资源,这应该是最常见的;
system_r:代表的就是程序啦!不过,一般使用者也会被指定成为 system_r 
 
类型 (Type) :(最重要!)
在预设的targeted 政策中, Identify 与 Role 字段基本上是不重要的!重要的在与这个类型(type) 字段! 基本上,一个主体程序能不能读取到这个档案资源,与类型字段有关!而类型字段在档案与程序的定义不太相同,分别是:
o type:在档案资源 (Object) 上面称为类型 (Type);
o domain:在主体程序 (Subject) 则称为领域 (domain) ,domain 需要与type 搭配,则该程序才能够顺利的读取档案资源啦!
 
domain与type如何搭配用以下例子:httpd程序与/var/www/html目录来说明
 
[root@www ~]# ll -Zd /usr/sbin/httpd /var/www/html
-rwxr-xr-x  root  root    system_u:object_r:httpd_exec_t              /usr/sbin/httpd
drwxr-xr-x  root  root   system_u:object_r:httpd_sys_content_t   /var/www/html
# 两者的角色字段都是 object_r ,代表都是档案!而 httpd 属于 httpd_exec_t类型,
# /var/www/html 则属于 httpd_sys_content_t 这个类型!
在targeted这个规则中,httpd_sys_content_t 这个(type)类型,是可以被httpd_exec_t这个(domain)类型读取的,因此httpd可以读取 /vat/www/html
当然最终能不能读到正确的资料还要看rwx是否符合Linux权限的规范;
 
政策内需要制订详细的domain/type 相关性;若档案的type 设定错误, 那么即使权限设定为 rwx 全开的 777 ,该主体程序也无法读取目标档案资源;
 
 
SELinux 的启动、关闭与观察
三种模式:
enforcing:强制模式,代表 SELinux 运作中,且已经正确的开始限制 domain/type 
permissive:宽容模式:代表 SELinux 运作中,不过仅会有警告讯息并不会实际限制domain/type 的存取。这种模式可以运来作为 SELinux 的 debug 之用;
disabled:关闭,SELinux 并没有实际运作。
 
getenforce
获取SELinux的模式
[root@www ~]# getenforce
Enforcing <==就显示出目前的模式为 Enforcing !
 
sestatus
获取SELinux政策
[root@www ~]# sestatus [-vb]
选项与参数:
-v :检查列于 /etc/sestatus.conf 内的档案与程序的安全性本文内容;
-b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 
  
/etc/selinux/config
SELinux配置文件
[root@www ~]# vi /etc/selinux/config
SELINUX=enforcing <==调整 enforcing|disabled|permissive
SELINUXTYPE=targeted <==目前仅有 targeted 与 strict
 
让/etc/selinux/config失效
在核心启动过程中忽略seLinux
/boot/grub/menu.lst
增加 selinux=0 让核心自动忽略/etc/selinux/config的设定
 
setenforce
模式切换
[root@www ~]# setenforce [0|1]
选项于参数:
0 :转成 permissive 宽容模式
1 :转成 Enforcing 强制模式
 
 
网络服务的启动与观察
一般服务启动的脚本会在/etc/init.d底下
 
# 1. 先启动这个网络服务吧!
[root@www ~]# /etc/init.d/httpd start
正在激活 httpd: [ 确定 ]
# 2. 观察有无此程序,并且观察此程序的SELinux 安全性本文数据
[root@www ~]# pstree | grep httpd
|-httpd---8*[httpd] <==httpd 会产生多子程序来负责网络服务
# 3. 观察此程序的SELinux 安全性本文数据
[root@www ~]# ps aux -Z | grep http
root:system_r:httpd_t root 24089 0.2 1.2 22896 9256 ? Ss 16:06 0:00 /usr/sbin/httpd
root:system_r:httpd_t apache 24092 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd
root:system_r:httpd_t apache 24093 0.0 0.6 22896 4752 ? S 16:06 0:00 /usr/sbin/httpd

 

chcon
重设 SELinux 安全性文本
[root@www ~]# chcon [-R] [-t type] [-u user] [-r role] 档案
[root@www ~]# chcon [-R] --reference=范例文件 档案
选项与参数:
-R :连同该目录下的次目录也同时修改;
-t :后面接安全性文本的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u;
-r :后面接角色,例如 system_r;
--reference=范例文件:拿某个档案当范例来修改后续接的档案的类型!
 
restorecon
还原到预设的安全性文本
[root@www ~]# restorecon [-Rv] 档案或目录
选项与参数:
-R :连同次目录一起修改;
-v :将过程显示到屏幕上
 
seinfo
政策整体查阅
 
sesearch
查询详细规则
 
semanage
默认目录的安全性文本的查询与修改
 
 

Linux基础学习5

标签:

原文地址:http://www.cnblogs.com/Aiapple/p/4900361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!