@xxliixin1993
2016-04-20T09:32:00.000000Z
字数 17850
阅读 2340
linux
字符集合表示方式:
表达式 | 说明 |
---|---|
[[:lower:]] | 所有的小写字母 |
[[:upper:]] | 所有的大写字母 |
[[:alpha:]] | 所有的字母 |
[[:digit:]] | 所有数字 |
[[:alnum:]] | 所有的字母和数字 |
[[:punct:]] | 所有的标点符号 |
[[:space:]] | 所有的空白字符 |
[^[:lower:]] | 除了小写字母 |
^[[:lower:]] | 以小写字母开头 |
^[[:space:]]+ | 多个空白字符开头 |
^[^t] | 不以字母t开头 |
字符匹配:
. :匹配任意单个字符
[] : 匹配指定单个字符
[^] : 匹配指定范围外的单个字符,有特殊含义的符号表示自己是要加转译符\
次数匹配:
* : 匹配其前面的字符任意次,可以0次
\? : 匹配其前面的字符1次或0次
\{m,n\}:匹配其前面的字符最少m次,最多n次
例如\{2\}匹配其前面的字符最少2次,最多无上限,无上限时n可省略
\{0,2\}匹配其前面的字符最少0次,最多2次,m不可省略
.* : 任意长度的任意字符
锚定:
^:其后面的字符锚定行首
$:其后面的字符锚定行尾
使用基本正则表达式定义的模式来过滤文本的命令,贪婪模式(尽可能长的去匹配),部分匹配,显示整行
-i:忽略大小写
-o : 只显示被匹配的字符串
--color:把匹配到的高亮
可用 alias grep='grep --color' 设置grep别名
-v:显示没有匹配到的行
-v '^$'不显示空白行
-n:在显示匹配文本的那一列之前标示出该列的是多少列
-E:使用扩展表达式
-A :后面加数字,表示列出该行外,还列出后续的n行
-B :后面加数字,表示列出该行外,还列出前面的n行
Tips:
^PATTERN$ 用模式匹配整行
例 ^ab.*c$ 以ab开头中间有任意并以c结尾的行
^$ 匹配空白行
^[[:space:]]$ Tab键也算space 匹配完全空白行
\<:其后面的字符锚定单词首部 [ \b.*\b ==\<.*>\ 但 \> 不等于 \b ]
\>:其后面的字符锚定单词尾部
字符匹配:(与grep一致)
. : 匹配任意单个字符
[] : 匹配指定单个字符
[^] : 匹配指定范围外的单个字符
次数匹配:
* : 匹配其前面的字符任意次,可以0次
? : 匹配其前面的字符1次或0次(相比grep不用加)
+ : 匹配其前面的字符至少1次(?+
= grep的*)
{m,n} :匹配其前面的字符最少m次,最多n次(相比grep不用加)
锚定:
^:其后面的字符锚定行首
$:其后面的字符锚定行尾
\< :其后面的字符锚定单词首部
> :其前面的字符锚定单词尾部
(): 分组, 用于反向引用 子表达式 \1,\2,\3....
|:或者,例 a|b 表示 a或者b
C|cat 表示 C或者cat
(C|c)at 表示 Cat或者cat
(cat|Cat)表示cat或Cat
* 匹配任意长度的任意字符
? 匹配任意单个字符;
[] 字符范围,匹配指定字符集合中的任意单个字符;
[a-z]不区分大小写, [0-9], [a-z0-9]
[^]
字符范围,匹配指定字符集合中的任意单个字符;
[^0-9]:除了0-9
字符集合表示方式:
[:lower:] 所有的小写字母;
[:upper:] 所有的大写字母;
[:alpha:] 所有的字母;
[:digit:]
所有数字;
[:alnum:] 所有的字母和数字;
[:punct:] 所有的标点符号;
[:space:] 所有的空白字符;
[^[:lower:]]: 除了小写字母
$0 进程的执行名字[basename $0 执行脚本的路径]
$数字 进程的第n个参数值,n=1..9[即位置变量],例$1,$2.....
$* 进程的所有参数,此选项参数可超过9个。
$@ 跟$*类似,但是可以当作数组用
$# 进程的参数个数
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$$ 进程的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$- 显示shell使用的当前选项,与set命令功能相同
dd命令:
dd if= of= bs= count=
if: 源文件,用于指定数据流来源
of: 目标文件,用于指定数据流存储目标
bs: block size,一次io的数据量
count: 复制多少个bs指定的block
两个设备文件:
/dev/null: bit bucket
/dev/zero:泡泡机,吐零设备
应用1:创建本地回环设备文件:
dd if=/dev/zero of=/PATH/TO/SOMEFILE bs= count=
应用2:备份MBR
dd if=/dev/sda of=/backup/mbr.backup bs=512 count=1
应用3:破坏其MBR
dd if=/dev/zero of=/dev/sda bs=512 count=1
文本比较、补丁制作及打补丁工具:
diff, patch
diff [-u] FILE.old FILE.new > FILE.patch
patch FILE.old < FILE.patch
保存的条数:HISTSIZE=1000 [用printenv查看环境变量]
持久保存的位置:HISTFILE=~/.bash_history
history 10 显示最近的10个命令
-c 清空命令历史中的命令
-d 135 删除第135位置的命令
-a /PATH/TO/SOMEFILE 保存当前命令历史缓冲区中的命令至指定文件中
-w 保存命令历史到历史文件中[即/root/.bash_history]、
!数字 是执行history输出的第几条命令
查看命令手册,命令手册:通常是由程序作者提供的,按照一定格式组织成文本文
件,并压缩后存放在系统上的某位置;/usr/share/man/
许多应用程序都自带文档:/usr/share/doc/下的每个应用程序基本都有
ChangLog[更新日志],INSTALL[安装说明],README[程序说明信息]
命令手册有章节之分:[用whatis可以查看]
1:用户命令
2:系统调用,system call
3:库调用:library call
4: 设备文件:
5: 配置文件:
6:游戏:
7:杂项:
8:管理命令
关键字搜索:
/KEYWORD: 搜索指定关键字,从文件首部向尾部搜索;
?KEYWORD: 搜索指定关键字,从文件尾部向首部搜索;
n: 与搜索方向相同;
N:与搜索方向相反;
手册段落:
NAME:命令的名称及简要说明;
DESCRIPTION:命令功能的详细描述;
OPTIONS:所有选项的相关说明;
SYSNOPSIS:使用格式;
EXAMPLES: 使用示例
FILES:相关的配置文件
SEE ALSO:相关参考
shutdown [OPTION]... TIME [MESSAGE]
-r: 重启
-h: 关机
-c: 取消关机或重启的操作
TIME:
now 立即
+m: m分钟之后进行,+0
hh:mm: 下个hh:mm关机或重启
poweroff: shutdown -h +0
reboot: shutdown -r +0
正确的关机方法:
1.查看系统的使用状态
先看目前有谁在线,用who命令,再看网络的联机状态,可以执行netstat -a
这个命令,最后看后台的执行程序用ps -aux这个命令
2.将数据同步写入到硬盘中
用sync这个命令[root用户使用时是同步整个系统的程序,而一般用户只同步
自己的程序,最好在关机或重启前多执行几次]
3.通知在线用户关机的时刻
用shutdown命令加选项-h
例: shutdown -h now 立刻关机
shutdown -h 20:25 在今天的20:25会关机
shutdown -h +10 十分钟后关机
shutdown -r +30 'the system will reboot' 30分钟后关机,并向所有用
户显示后面的消息
shutdown -k now 'the system will reboot' 仅发出警告信息,系统并不
会关机
Linux系统上可使用两套时间:硬件时钟和软件时钟
date [MMDDhhmm[[CC]YY][.ss]] 软件时钟
+%F: YYYY-MM-DD
+%Y:显示年
+%m:显示月
+%d:显示日
例
root@ubuntu:~# date +%F
2016-04-07
hwclock:硬件时钟[cpu上的电池进行的时钟]
-s : hwclock to system 用硬件时钟改写系统时钟
-w : system to hwclock 用系统时钟改写硬件时钟
echo [OPTIONS] [STRING]...
-n: 关闭自动换行功能
-e: 启用转义符
\t: tab键
\n: new line
\033[ ##;##;##mSTRING\033[0m 如不加后面的参数直接用m结束;隔开第一位
第一个数字:
3:字体前景色
4:背景色
第二个数字:
颜色:0-7
例:
3#:31前景色为红
4#:41背景色为红
例如:
root@ubuntu:~# echo -e "\033[31;1;42mhello\033[0m";
watch [-n #] 'COMMAND'
交互式查看,周期性地执行指定的COMMAND;
-n # : 指明间隔时长;
ls: list,显示指定目录下的文件及子目录列表;
ls [OPTION]... [FILE]...
Ls 是ls --color的别名
ll是ls -l --color的别名
常用选项:
-l: 长格式显示文件的详细属性信息;
drwxr-xr-x. 2 root root 4096 Mar 25 03:43 account
左起第一位: 文件类型
文件类型:
-:普通文件
d: directory, 目录文件
l: link, 符号链接文件
b: block, 块设备文件,随机访问设备
c: character, 字符设备文件,线性设备
p: pipe,管道
s: socket, 套接字文件
后面的9位:文件访问权限
r: 读
w: 写
x: 执行
数字:当前文件被硬链接的次数;
属主:当前文件的所有者
属组:当前文件所属的用户组
数字:文件大小,单位为字节
日期时间:当前文件最近一次被修改的时间
-a: 显示所有文件,包括隐藏文件;
-r: 逆序显示;
-R:递归显示;
-d:用于显示目录自身属性
文件内容的类型查看:
file /PATH/TO/FILE
stat: 查看文件的状态数据信息
[root@localhost ~]# stat /etc/fstab
File: `/etc/fstab'
Size: 921
Blocks: 8
IO Block: 4096 regular file
Device: fd00h/64768d
Inode: 1179655
Links: 1
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
Access: 2015-03-26 11:08:52.440287424 +0800
Modify: 2015-03-26 10:45:34.039999979 +0800
Change: 2015-03-26 11:08:08.156999044 +0800
时间戳:
Access: 最近一次被访问的时间;
Modify: 最近一次被修改的时间,即文件内容被改变;
Change: 最近一次被改变的时间,即文件属性发生了改变;[不会被人工修改]
TIps:
touch可以改变时间戳
touch [OPTION]... FILE...
-a: 仅改变访问时间
-m: 仅改变修改时间
-t STAMP: 修改指定时间而非当前时间,[[CC]YY]MMDDhhmm[.ss]
-at -mt:
例如
root@ubuntu:~# touch -at 201511011212 bak.sql
root@ubuntu:~# stat bak.sql
文件:"bak.sql"
大小:2630 块:8 IO 块:4096 普通文件
设备:808h/2056d Inode:9441049 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2015-11-01 12:12:00.000000000 +0800
最近更改:2016-03-17 13:22:26.995060183 +0800
最近改动:2016-04-07 15:20:56.599333445 +0800
创建时间:-
wc [OPTION]... [FILE]...
-l, --lines: 仅统计行数
-w, --words: 仅统计单词数
-c, --bytes:仅统计字节数
root@ubuntu:~# wc hePc.sh
2 3 32 hePc.sh
2行 3个单词 32字节
cut:
cut OPTION... [FILE]...
-d: 指明分隔符
-d' ': 表示以空格为分隔符;
-f#: 指明要保留的字段;
单个:#
离散的多个:#,#,#
连续的多个:#-#
sort: 排序
sort可以直接指定文件
sort [OPTION]... [FILE]...
-r: 逆序;
-f: 忽略字符的大小写;
-t: 指定字段分隔符
-k: 指明分隔以后的字段
-n: 按数值大小排序
分区 Linux基础 的第 18 页-n: 按数值大小排序
sort -t: -f3 -n /etc/passwd
-u: 排序后去重
uniq:相邻重复行才为重复行
-i: 忽略大小写;
-d: 仅显示重复了的行;
-u: 仅显示不曾重复的行;
-c: 去重后显示每行出现了的次数;
标准输入(stdin):0,键盘
标准输出(stdout):1,监视器
错误输出(stderr):2,监视器
正常输出和错误输出是两个不同的数据流;
错误输出重定向:2>, 2>>
COMMAND 2> ERR_OUTPUT覆盖文件中的内容
COMMAND 2>> ERR_OUTPUT追加在文件数据后
同时定向两种输出数据流:
方法一:
COMMAND > OUT_FILE 2>&1
COMMAND >> OUT_FILE 2>&1
方法二:
COMMAND &> OUT_FILE
COMMAND &>> OUT_FILE
tr命令:
tr [OPTION]... SET1 [SET2]
把输出数据中的,在SET1中的每个字符对应地替换为SET2的每个字符;
-d: 删除在输入的数据流中出现的属于SET1的每个对应的字符;
root@ubuntu:~# echo 'redhat'|tr 'a-z' 'A-Z'
REDHAT
COMMAND << EOF[EOF表示End Of File]
把从输入重定向的内容输出重定向到abc.txt文件中,EOF可以用任意STRING代替,区分大小写
root@ubuntu:~# cat <<EOF
> i am lx
> EOF
i am lx
root@ubuntu:~# cat >abc.txt <<EOF
> abc.txt
> i am lx
> EOF
root@ubuntu:~# cat abc.txt
abc.txt
i am lx
在任何时候,用户操作计算机无非就是发起进程,因此,进程是用户操作计算机的代理,所以进程在运行时,一定是以发起它的用户的身份在运行,那么进程所能访问的权限就决定于发起它的用户的权限和要访问文件的权限。
权限:
文件:
r: 可使用查看工具查看其内容;
w: 可编辑其内容;[若仅有w,且目录无w,则不能删除文件]
x: 可将此文件向内核提请启动为进程;
目录:
r: 可以使用ls命令列出其内部所有文件或子目录的相关信息;
w: 在此目录内创建或删除文件;
x: 可以cd进此目录;
用户有两类:
1:管理员:root,UID为0
2:普通用户:UID为1-65535[2^16]
系统用户:1-499
仅用于运行某些服务类进程而存在;一般不用于登录系统;
普通用户:500+
交互式登录
组有两类:
管理员组:root,GID为0
普通组:GID为1-65535
系统组:1-499
普通组:500+
组的类别:
一个用户可同时属于多个组;当一个用户有多属组时,且他去访问一个文件需要看文件的属组的权限时,用户的多个属组中只要有一个属组不匹配,则无法访问文件,即拒绝优先
私有组:创建用户是如果没有为其指定其所属组,系统会自动为其穿件一个与用户名相同的组
基本组:用户的默认组
附加组、额外组:默认组之外的其他组
useradd -r -s /sbin/nologin 用户名
添加系统用户xx且不允许登陆
一次用户创建经历的过程:
1、在/etc/group文件中添加一行信息
group:x:gid:user_list
2、在/etc/passwd文件中添加一行信息
account:x:uid:gid:comment:home:shell
3、创建家目录/home/USERNAME
复制/etc/skel目录中的隐藏文件至用户的家目录中
并修改其属主、属组及权限
4、在/etc/shadow创建用户密码及相关属性信息
全手动创建用户
1、并编辑/etc/group文件,添加组abc;
# vim /etc/group 在最后加 abc:x:522:
2、手动编辑/etc/passwd文件新增一行,添加用户abc,其基本组ID为abc组的id号;其家目录为/home/abc;
#vim /etc/passwd 在最后加 abc:x:522:522::/home/abc:/bin/bash
测试:su切换至此用户
3、手动编辑/etc/shadow文件
先手动用openssl命令生成MD5的密码,-salt是加杂质
root@ubuntu:~# openssl passwd -1 -salt 12345678
Password:
$1$12345678$j9vX8TpKTDxbX4gACw.5l1
然后编辑/etc/shadow
abc:$1$12345678$j9vX8TpKTDxbX4gACw.5l1:16520:0:99999:7:::
4、复制/etc/skel目录为/home/abc,要求修改abc目录的属组和其它用户没有任何访问权限;
5、修改/home/abc目录及其内部所有文件的属主为abc,属组为abc;
测试:su切换至此用户
id命令
可以用来测试用户是否存在,例id lx 若lx存在则$?=0
id [OPTION]... [USERNAME]
-u: 仅显示UID
-g: 仅显示GID
-G: 显示groups
-n: 显示名字而非ID
passwd修改密码:
用法:
passwd:不加任何选项时表示修改自己的密码;
passwd USERNAME: 修改指定用户的密码;只有管理员root有此权限;
你是普通用户的话,修改自己的密码,直接用passwd就可以了,会让你先输入自己的旧密码,再输入两遍新密码
-d 删除密码。本参数仅有系统管理者才能使用。
-f 强制执行。
-k 设置只有在密码过期失效后,方能更新。
-l 锁住密码。
-s 列出密码的相关信息。本参数仅有系统管理者才能使用。
-u 解开已上锁的帐号。
--stdin password需要从标准输入通过管道设置new password
echo 'lixin'|password --stdin userlx
usermod:修改用户属性
-c 'COMMENT':修改用户的注释信息
-d /PATH/TO/SOMEDIR: 修改用户的家目录;
-m :修改家目录后一同把用户的原有文件复制至新位置;
-g GID:修改用户的基本组;
-G GID1,GID2,...:修改用户的附加组;
-a: 与-G一同使用,表示将用户添加至新指定的附加组,且保留原来的;
-l NEW_NAME: 修改用户的登录名;
-s /PATH/TO/NEW_SHELL: 修改用户的默认shell;
-L:锁定用户
-U:解锁用户
userdel:删除用户
userdel [-r] LOGIN
-r: 删除用户的同时,删除其家目录;不用-r时不会删除家目录
注意 : 一个用户被删除,那个用户的文件属主属组都显示为那个用户之前的ID号,UID,GID
groupadd: 添加组
groupadd [options] group
不指定GID时,为/etc/group中的最后一个GID加1
-g GID: 指明要使用的GID;
-r :添加系统组
gpasswd:为组添加密码
组密码在/etc/gshadow这个文件中当用户切换其基本组[用newgrp命令]为此组时,如果其本就以此组为附加组,则直接切换;否则 ,则需要提供组密码;
例:admin是u1的附加组,当用u1切换至admin组为起基本组时,不用密码;但admin不是lx的附加组,所以当lx切换时就要输入密码
newgrp:切换用户的基本组;用exit退出
newgrp GROUP_NAME
groupdel:删除组
groupmod: 修改组属性
-g GID:修改GID
-n NEW_NAME: 修改组名;
chsh命令:
chsh [OPTION]... [USERNAME]
-l: 列表当前系统上可用shell;
-s /PATH/TO/SHELL:修改为指定SHELL
chfn命令:修改注释信息;
chage: 修改用户账号密码的过期信息
chage -l USERNAME:查看用户的过期信息
su: switch user
su [OPTION]... [-] [USER [ARG]...]
[USER] 省略时,表示为root;
su USERNAME: 非登录切换,意味着仍然使用原用户的环境设定;
su - USERNAME: 登录式切换,意味着将使用目标用户的环境设定,原用户失效;
su -l USERNAME: 登录式切换;
su - USERNAME -c 'COMMAND':以目标用户身份执行一次命令后退出;不作真正切换;
注意:返回原用户,使用exit命令;root用户su至任何用户都不需要密码;
drwx------ 34 root root 4096 4月 8 10:15 ./
drwxr-xr-x 24 root root 4096 3月 25 17:24 ../
-rw-r--r-- 1 root root 16 4月 8 10:15 abc.txt
-rw-r--r-- 1 root root 2630 3月 17 13:22 bak.sql
-rw------- 1 root root 40545 4月 8 10:54 .bash_history
-rw-r--r-- 1 root root 3106 2月 20 2014 .bashrc
<div class="md-section-divider"></div>
三类账号:
属主:owner, u
属组: group, g
其它: other, o
所有:all, a
方法一:
八进制
0 | 000 | |
---|---|---|
1 | 001 | --x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r-- |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
方法二:
r | 4 |
---|---|
w | 2 |
x | 1 |
rwx | r-x | r-- |
---|---|---|
4+2+1 | 4+0+1 | 4+0+0 |
7 | 5 | 4 |
- chmod命令:
操作三类用户的权限:使用八进制数字也可以使用方法二
修改三类用户的权限:chmod 数字[例755] 文件名f
--renference=/某文件的路径 文件A名 :把文件A的权限改为和某文件一样权限
-R: 递归修改
操作指定类别用户的权限:=
u=, g=, o=
ug=, a=
例 chmod u=rwx /home/lx/a.txt
操作某类用户的某位或某些位权限:+|-
u+, g+, o+
u-, g-, o-
例 chmod o+x /home/lx/a.sh
chown命令
chown的用法技巧:
chown [-R] [--reference=] [USER][:GROUP] FILE...
USER 只改属主
USER:GROUP 同时改属主和属组
:GROUP 只改属组
例 #chown centos:centos /home/centos/a.txt
把/home/centos/a.txt的属主属组改为centos和centos
chown [-R] [--reference=] [USER][.GROUP] FILE...
umask 权限遮罩码
文件默认为无x权限的,所以若计算结果有x,则减1;
例(rw-rw-rw-)-(--------wx)=(rw-rw-r--)
root的umask默认为0022
一般用户的umask默认为0002
文件: 666-umask
注意:如果减得的结果中存在执行权限,则让对应用户类别的八进制权限数字加1;
目录: 777-umask
显示当前 umask: 就用umask不叫任何参数和选项
设定umask:
umask [MODE]
例 umask 0022
注意:此设置仅对当前shell进程有效;
php5:x:996:996::/home/php5:
php7:x:995:995::/home/php7:
php5.30:x:994:994::/home/php5.30:
<div class="md-section-divider"></div>
对应:
php5 | x | 996 | 996 | /home/php5 | |
---|---|---|---|---|---|
登录名 | 密码 | UID | GID | 注释 | 家目录用户默认shell[用户必须有一个合法的可用shell,否则将无法登录系统;合法可用shell:/etc/shells文件中列出] |
注意:创建用户时如果没有指定基本组,则useradd会自动为其添加一个与当前用户同名的组;且其GID一
般同UID
lixin:$6$yCLv.usg$G/y.0s/ijx1fJERObsC2Q01jKt7.eDBubEbEC1nTI80M8oT/vV.jjSfYiFPY3kh//IpwdO5rJ2Ne33nfegZXE0:16759:0:99999:7:::
<div class="md-section-divider"></div>
lixin | ... | 16759 | 0 | 99999 | 7 | -- | -- | -- |
---|---|---|---|---|---|---|---|---|
登录名 | 加密的密码 | 上次修改密码到1970.1.1的天数 | 密码的最小使用期限,0表示不限制 | 密码的最长使用期限,99999表示不限制 | 距密码使用期限多久的时候警告一次,0表示不警告 | 密码非活动期限[到达使用期限后,只能改密码,反之超出这个时间就会锁定];超出非活动期限后,账号将被锁定; | 密码有效期至1970.01.01 | 预留字段 |
加密方法:
1 对称加密:明文用密钥加密,用相同密钥解密,密钥分发很困难
2 公钥加密/非对称加密:密钥配对,数据用公钥加密,私钥解密[公钥是公开的]加密速度很慢,公钥产生于私钥中很少用于数据加密
3 单项加密:只能从明文产生密文,并不能解密的,常用于验证数据完整性 linux下用md5sum这个命令使用MD5加密
md5:128bit输出[CentOS 5]
sha1:160bit输出
sha256:256bit
sha512:512bit[CentOS 6] [CentOS 7]
<div class="md-section-divider"></div>
特征:
1定长输出
2初始条件的微小改变会带来最终结果的重大改变
3不可逆性
4加密前会在你要加密的明文中加随机数/etc/shadow中的密码格式:8位随机字符$加密后的密码
php5:x:996:
php7:x:995:
php5.30:x:994:
<div class="md-section-divider"></div>
php5 | x | 996 | -- |
---|---|---|---|
组名 | 密码 | GID | 以这个为附加组的用户表 用,隔开 |
安全上下文:
特殊权限:SUID SetUID [4]
展示于文件属主的执行权限位:如果属主本来有执行权限[x],则展示为s;否则,展示为S;
功用:对于一个可执行文件来讲,任何用户运行此程序为进程时,进程的属主不再是发起者本
人,而可执行程序文件自己的属主;【仅对二进制程序有效,不能用在shell脚本上,不能用在
目录上;执行者对于该程序需要具有x权限;SUID仅在执行过程中有效;执行者将具有该程序
所有者的权限】
修改文件SUID权限的方法:
chmod u+|-s FILE...
例 chmod u+s ./a.txt
chmod 4755 ./a.txt
演示过程:
普通用户centos 是没有权限cat /etc/shadow的,但是若/bin/cat文件有SUID则不同;为了避免修改源文件,cp /bin/ cat /var/tmp下,这时用centos用户是不能cat /etc/shadow的,我们用root用户chmod u+s /var/tmp/cat,再用centos用户cat访问/etc/shadow时即可,这时因为centos在执行/var/tmp/cat时,不在用centos自己的身份执行,而是用/var/tmp/cat的所有者root的身份去执行。
特殊权限:SGID SetGID [2]
展示于文件属组的执行权限位:如果属组本来有执行权限[x],则展示为s;否则,展示为S;
功用:当目录属组有写权限,且有sgid权限时,那么所有属于此目录的属组,且以属组身份在此目录新建文件或目录时,新文件或目录的属组不是创建者所属的基本组,而是目录自己的属组;【可以针对目录或文件设置;仅对二进制文件有效;执行者对于该程序需要具有x权限;执行者在执行过程中将会获得其用户组的支持;】
修改目录SGID权限的方法:
chmod g+|-s FILE...
例 chmod g+s ./A/
chmod 2755 ./A/
设置SGID后:
用户若对此目录有r和x时,该用户可以进入该目录;
用户在此目录的有效用户组将会变成该目录的用户组;
用户若对此目录有w时,则用户所创建的目录、文件与此目录的用户组相同;
特殊权限:Sticky Bit[1]
展示于目录其它用户的执行权限位:如果其它用户本来有执行权限[x],则展示为t;否则,展示为T;
功用:对于全局可写,或某组全局可写目录,所有用户都于此目录创建文件或删除自己为属主的那些文件,但不能删除非自己为属主文件或目录;【仅对目录有效,不能用在文件上;当用户对于此目录有w,x权限时,即具有写入权限;当用户在该目录下创建文件或目录时,仅自己和root可以删除文件】
修改目录Sticky权限的方法:
chmod o+|-t DIR...
例 chmod o+t ./A/
chmod 1755 ./A/
bash是解释型:
bash变量类型:
命令行启动会继承当前shell的环境变量,系统自动执行的脚本即crontab任务不会继承变量
环境变量:对当前shell解释器进程及其子shell有效;对其它shell无效;
export Var_Name=VALUE
用以下的命令可以查看生效的环境变量:
本地变量:只对当前shell解释器进程有效;对其它shell进程无效,包括当前shell的子进程;不同的shell可以使用同一
个变量名;当前shell进程终止,其会被自动销毁;
VARNAME=VALUE
用set可以查看本地变量+环境变量
局部变量:变量仅对某代码片断(通常指函数作用域)有效;
local Var_Name=VALUE
位置参数变量:在脚本代码中,用于实时调用传递给脚本执行时的参数;按其位置进行编号;
2, ...
特殊变量:bash内置的用于保存特殊数据的变量:
$?:用于保存当前shell进程中最近一次执行的命令成功与否的状态,用数字来表示,
0:成功
1-255:失败
撤销变量 :unset VARNAME
注意:
变量名不能使用解释器保留字、只读类型的变量[例UID]
设置变量为“只读”模式:readonly Var_Name,其值不能被修改,且变量不能被销毁;仅能随shell进程终止而结束;
初始化变量
bash是弱类型的编程语言,即一切皆字符串;
但bash也可用declare来声明变量类型:
declare [OPTION] Var_Name=[VALUE]
-i: 整型
-x: 环境变量
-r:只读变量
-a: 数组
-A:关联数组
给PATH:/home/centos
profile类:为交互式登录shell提供
bashrc类:为非交互式shell提供
profile类:
全局有效:对所有用户均有效
/etc/profile
/etc/profile.d/*.sh
个人有效:仅对某特定用户有效
~/.bash_profile
功用:
1、设定环境变量;
2、运行命令或脚本;
3、开机打印一段话等;
root@ubuntu:/api/cron/statistics# vim /etc/profile.d/start.sh
root@ubuntu:/api/cron/statistics# cat /etc/profile.d/start.sh
echo "hello"
<div class="md-section-divider"></div>
bashrc类型:
全局有效:对所有用户均有效;
/etc/bashrc
个人有效:仅对某特定用户有效;
~/.bashrc
功用:
1、定义本地变量
2、用来定义命令别名
3、定义用户默认的umask
注意:
交互式登录的shell读取配置文件的次序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录的shell读取配置文件及次序:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
注意:
1.在Linux系统上,所有的文件系统必须通过根文件系统的某个分支来访问;
2.单一文件系统不应该被重复挂载在不同的挂载点(目录)中
3.单一目录不应重复挂载多个文件系统
4.作为挂载点的目录理论上应该都是空白目录,不然原来目录下的文件会被隐藏
根文件系统:根是一切文件系统的访问入口,根关联到的分区,有一定的要求:FHS除了根,其余所有的其它文件系统如果想要被访问,都只能够通过“关联”至根文件系统上的某个目录来实现;这种操作即所谓的“挂载”,也即mount;相反动作,即卸载,命令为umount
mount 设备 挂载点
挂载点
1、事先存在;
2、应该使用别的进程未使用的目录;
3、挂载点下原有的文件将被隐藏;
mount [OPTION]... [-t FSTYPE] [-o OPTION] [DEVICE] MOUNT_POINT
命令选项:
-r: 只读挂载
-w: read and write,读写挂载
-t FSTYPE: 被挂载的设备上的文件系统类型;可省略,此时mount会自动使用blkid命令来判断之;
-L LABEL: 以卷标的方式指定要挂载的设备,因此,此时DEVICE必须省;
-U UUID:以UUID的方式指定要挂载的设备,因此,此时DEVICE必须省;
-a: 自动挂载所有的支持自动挂载的设备(/etc/fstab文件中定义的支持自动挂载的设备);
-n: 默认情况下,设备挂载与否的改变结果会被保存于/etc/mtab中一份;-n选项用于变动时不更新此文件
示例:
mount -U dea669ee-e769-46d9-86a8-88925a10278b /data/mydata
-o OPTION,挂载选项[多个时用,隔开 例: -o noatime,exce,acl]:
async:异步写入
sync:同步写入,即使用同步I/O;
atime/noatime:文件或目录在被访问时是否更新其访问时间戳;
diratime/nodiratime:目录在文中时是否更新其访问时间戳;
auto/noauto:设备是否支持mount命令使用-a选项时自动挂载;
dev/nodev:此设备上是否创建设备文件;
exec/noexec:是否允许执行此文件系统上的程序文件;
suid/nosuid:是否支持此设备上的文件上使用suid权限;
remount: 重新挂载;
acl: 支持使用facl;
# mount -o acl
# tune2fs -o acl /dev/DEVICE: 打开acl为默认挂载选项;
ro: 只读
rw: 读写
user/nouser: 是否允许普通挂载此文件系统
所有挂载选项均未指明时,其默认为:
defaults
Use default options: rw, suid, dev, exec, auto, nouser, async, and relatime.
mount -a命令 会自动读取/etc/fstab文件,并自动挂载
#
# /etc/fstab
# Created by anaconda on Fri Feb 27 11:22:36 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=97c76325-051c-41ad-81d1-f03cc6704be9 / ext4 defaults 1 1
UUID=9c67eccb-7689-412f-83ee-6abb1e59db71 /boot ext4 defaults 1 2
UUID=e827c34a-992a-440f-a9d4-4a4c035974e4 /usr ext4 defaults 1 2
UUID=c7e34fce-f3e1-416e-a821-a2f5d3294af9 /var ext4 defaults 1 2
UUID=b4e8391c-2e0e-4159-a36e-ac52d6e9c448 /www ext4 defaults 1 2
UUID=30b1ffe4-ca9d-4615-940e-2cd7ddd5c2a0 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
说明:
定义开机可自动挂载的文件系统,每行一个:
6个字段:
(1) 挂载的设备:
设备文件
LABEL
UUID
伪文件系统:如sysfs, proc, tmpfs等
(2) 挂载点
swap的挂载点仍为swap
(3) 文件系统类型
(4) 挂载选项
defaults表示使用默认挂载选项;
多个挂载选项间使用逗号分隔;如defaults,acl,noatime
(5) 转储频率[多久备份一次],只有一下三种,一般不备份:
0:从不备份
1: 每天备份
2: 每隔一天备份
(6) 自检次序[大多不自检,可以开机手动自检,mount命令]
0:不自检
1:首先自检,通常只有根文件系统可首先自检
2:次级自检,
...
# mount
# cat /etc/mtab
# cat /proc/mounts
umount DEVICE
umount MOUNT_POINT
例:umount /dev/sda5
umount /data/mydata
注意:正在被某进程访问的设备是不可以被卸载的;查看被什么进程所占用:
# lsof MOUNT_POINT
# fuser -v MOUNT_POINT
# fuser -km MOUNT_POINT: 终止正访问挂载点的进程;
df [OPTION]... [FILE]...
-l: 仅显示本地文件系统的相关系统;
-h: 单位换算;
-i: 显示inode的使用情况而非磁盘块的;
-T:连同该分区文件系统的名称(例ext4)也列出
du 文件或目录名
-s: 统计整个目录及内部所有文件总体大小;
-h: human-readable
du -sh /* 查看/下目录的大小
查看接口:
ifconfig [Interface]
-a: 包括未激活状态的所有接口
启用或禁用:ifconfig IFNAME up|down
启用:ifup IFNAME
禁用:ifdown IFNAME
设定IP地址:
ifconfig IFNAME IP/Netmask [up]
注意:CIDR格式的掩码
-r: 显示路由表
-n: numeric,数字显示,不反解IP地址至主机名,不反解端口至服务名;
-t: tcp协议的相关连接
-u: udp协议的相关连接
-l: 显示处于监听状态(即等待别的进程连接访问)[不加l不显示监听的,只显示连接的];
-a: 显示所有连接,对于tcp而言即处于各种状态;
-p: 显示相关连接的关联到的进程的名字及PID;
常用组合:-rn, -tnl, -unl, -tunl, -tan, -tnlp
归档和压缩:
-z: gzip
后缀名: .tar.gz
归档并压缩:tar -zcf newfile.tar.gz a.txt b.txt ...
展开归档:tar -zxf newfile.tar.gz
-j: bzip2
后缀名: .tar.bz2
归档并压缩:tar -jcf newfile.tar.bz2 a.txt b.txt ...
展开归档: tar -jxf newfile.tar.bz2
-J: xz
后缀后: .tar.xz
归档并压缩: tar -Jcf newfile.tar.xz a.txt b.txt ...
展开归档: tar -Jxf newfile.tar.xz
注意:展开归档可以直接使用tar -xf,而无须为其指定对应的压缩工具选项;
向进程发信号:
kill [-SIGNAL] PID
默认的信号为SIGTERM;
信号表示方式:
(1) 完整名称,例如SIGINT
(2) 简写名称,例如INT
(3) 数据代称,例如2
常用信号:
SIGHUP | 1 | 通知进程重读其配置文件以让新的配置生效,但不用重新启动进程 |
---|---|---|
SIGINT | 2 | 打断正在运行中的进程,相当于键盘组合键Ctrl+c |
SIGKILL | 9 | 强行中止正在运行中的进程 |
SIGTERM | 15 | 安全中止正在运行中的进程 |
SIGSTOP19 | 暂停进程 | |
SIGCONT | 18 | 继续运行指定进程 |
例 kill -15 1521
kill -SIGTERM 1521
kill -TERM 1521
kill相似的一组进程:
killall [-SIGNAL] PROGRAM
例:killall -15 httpd