正则表达式:
特殊符号:
'' ---> 所见即所得,里面的内容都会被原封不动的输出出来
"" ---> 与单引号类似,但其中的特殊符号会被解析运行
`` ---> 相当于 $() ,先运行里面的命令,把结果留下 > ---> 重定向符号:先清空文件的内容,然后追加到文件的最后一行
>> ---> 追加重定向:把内容追加到文件的最后结尾
2> ---> 错误重定向:只有错误的信息(命令错误),才会通过这个漏斗进入文件中 (先清空再追加)
2>> ---> 错误追加重定向:只追加不会清空 ~ ---> 当前用户的家目录: root 用户:/root ; 普通用户(oldboy): /home/oldboy
! ---> 查找并运行历史命令:如 !awk 表示linux会找到包含awk的命令(最近的一条)运行; 这种用法比较危险
我们常用: history |grep awk ---> 这个命令只是把包含 awk 命令找出来了,但并没有运行
# ---> 1.注释 2. root用户的命令提示符
$ ---> 1.取出变量的内容:如 awk $ 取某一列的内容; 2. 普通用户的命令提示符
* ---> 所有、任何东西
\ ---> 撬棍、转义字符
&& ---> 前一个命令执行成功,然后执行后一个命令:如 ifdown eth0 && ifup eth0
|| ---> 前一个命令执行失败了再执行后面的命令 [root@NEO ~]# eco && echo ok
-bash: eco: command not found
[root@NEO ~]# eco || echo ok
-bash: eco: command not found
ok
[root@NEO ~]# history 命令:显示历史命令
通配符详解
# 通配符是用来查找文件的,如 .txt结尾的文件 *.txt # 常用的通配符有两个:
1. * ---> 表示 所有 任意
# 找出文件名包含 oldboy 的文件
# 创建环境:
mkdir -p /oldboy
cd /oldboy
touch oldboy.txt oldboyfile oldboy.awk eduoldboy
[root@NEO /]# cd /oldboy
[root@NEO oldboy]# touch oldboy.txt oldboyfile oldboy.awk eduoldboy
[root@NEO oldboy]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 27 06:32 eduoldboy
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.awk
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboyfile
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.txt
[root@NEO oldboy]# find /oldboy/ -type f -name "*oldboy"
/oldboy/eduoldboy
[root@NEO oldboy]# find /oldboy/ -type f -name "*oldboy*"
/oldboy/oldboyfile
/oldboy/oldboy.txt
/oldboy/oldboy.awk
/oldboy/eduoldboy
[root@NEO oldboy]# 2. {} ---> 生成序列
[root@NEO oldboy]# echo 1 2 3 4 5 6
1 2 3 4 5 6
[root@NEO oldboy]# echo {1..6}
1 2 3 4 5 6
[root@NEO oldboy]# echo {10..1}
10 9 8 7 6 5 4 3 2 1
[root@NEO oldboy]# echo {01..100}
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100
[root@NEO oldboy]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@NEO oldboy]# echo stu{01..10}
stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
[root@NEO oldboy]# echo 20{01..10}
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
[root@NEO oldboy]# echo {1,6,9}
1 6 9
[root@NEO oldboy]# echo A{B,C}
AB AC
[root@NEO oldboy]# echo A{,C}
A AC
[root@NEO oldboy]# echo oldboy.txt{,.bak}
oldboy.txt oldboy.txt.bak
[root@NEO oldboy]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 27 06:32 eduoldboy
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.awk
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboyfile
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.txt
[root@NEO oldboy]# cp oldboy.txt{,.bak} ### {} 的应用:备份一个文件时使用
[root@NEO oldboy]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 27 06:32 eduoldboy
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.awk
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboyfile
-rw-r--r-- 1 root root 0 Mar 27 06:32 oldboy.txt
-rw-r--r-- 1 root root 0 Mar 27 07:28 oldboy.txt.bak
[root@NEO oldboy]#
正则表达式简介
# 正则:用符号表示内容 # id.txt 文件中的内容如下,找出身份证号
110000198810098735
110000199007021063
11000019781119429X
110000199103081090
110000198aa0300201
110000197907030484
110ddd197902181654
110000198510204911
110000197908083836
11000019860ddd9605
110000199410252806
110000199003296713
110000197510314892
110000198209062811
110asdf98209062811
11000019820dddd811
110000198209062811
110000198307170496
110000198909149301 [root@NEO oldboy]# egrep "^[0-9X]+$" id.txt
110000198810098735
110000199007021063
11000019781119429X
110000199103081090
110000197907030484
110000198510204911
110000197908083836
110000199410252806
110000199003296713
110000197510314892
110000198209062811
110000198209062811
110000198307170496
110000198909149301
[root@NEO oldboy]# # linux 中支持正则表达式:Linux三剑客 grep sed awk # 使用正则时的注意事项:
1) 正则表达式是按照 行 进行处理的
2) 禁止使用中文符号
3) 给 grep 和 egrep 配置别名
cat >>/etc/profile<<EOF
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
EOF
source /etc/profile [root@NEO oldboy]# grep "3306" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
[root@NEO oldboy]# grep --color=auto "3306" /etc/services
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL
[root@NEO oldboy]# alias grep='grep --color=auto'
[root@NEO oldboy]# alias egrep='egrep --color=auto'
[root@NEO oldboy]# cat >>/etc/profile<<EOF # 配置别名
> alias grep='grep --color=auto'
> alias egrep='egrep --color=auto'
> EOF
[root@NEO oldboy]# source /etc/profile # 让配置生效
[root@NEO oldboy]# tail -2 /etc/profile
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
[root@NEO oldboy]# # 正则表达式 和 通配符 的区别:
# 通配符 ---> 用来匹配文件名: *.txt , *.log 以 .txt .log 结尾的文件;linux 中大部分命令都可以作用通配符
# 正则表达式 ---> 在文件中匹配查找内容, 包含查找内容的行; linux 三剑客 和一些高级语言(java python等) 支持
正则表达式的分类:
# 基础正则: ^ $ . * [] [^] basic regular expression : BRE --- grep sed awk 支持基础正则 # 扩展正则: | + {} () ? extended regular expression : ERE --- grep -e/egrep sed -r awk 支持 扩展正则
基础正则: ^ $ . * [ ] [^]
# 准备环境:
I am oldboy teacher!
I teach linux. I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448. not 4900000448.
my god ,i am not oldbey,but OLDBOY! [root@NEO oldboy]# cat -A oldboy.txt
I am oldboy teacher!$
I teach linux.$
$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http://oldboy.blog.51cto.com$
our site is http://www.etiantian.org$
my qq num is 49000448.$
$
not 4900000448.$
my god ,i am not oldbey,but OLDBOY!$
$
[root@NEO oldboy]# # cat -A 表示 每行的结束以 $ 显示出来 # 点与转义字符:
. (点)表示任意一个字符,但不包含空行
[root@NEO oldboy]# grep -n '.' oldboy.txt
1:I am oldboy teacher!
2:I teach linux.
4:I like badminton ball ,billiard ball and chinese chess!
5:my blog is http://oldboy.blog.51cto.com
6:our site is http://www.etiantian.org
7:my qq num is 49000448.
9:not 4900000448.
10:my god ,i am not oldbey,but OLDBOY!
[root@NEO oldboy]# # grep -o 可以显示 grep 的执行过程:正则每次匹配到了什么 (-o 参数非常常用,它也是分析正则的一个工具) # 找出文件中以 . (点) 结尾的行 : 利用 \ 进行转义 (撬棍 \ 是转义符号)
[root@NEO oldboy]# grep '.$' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@NEO oldboy]# grep '\.$' oldboy.txt
I teach linux.
my qq num is 49000448.
not 4900000448.
[root@NEO oldboy]# # \n 在 linux 表示 回车换行 # 星号与连续出现:
* (星号) 前一个字符出现了0次或1次以上
[root@NEO oldboy]# grep '0*' oldboy.txt
I am oldboy teacher!
I teach linux. I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448. not 4900000448.
my god ,i am not oldbey,but OLDBOY! [root@NEO oldboy]# grep -o '0*' oldboy.txt
000
00000
[root@NEO oldboy]# # 问题1: 为什么取出的是 000,而不是00 和 0
# 因为正则在表示 连续出现的时候佬表现出贪婪性:有多少匹配多少 # 问题2: 为什么使用 '0*' 会把整个文件的内容都显示出来?
# A* 表示:
1. 连续出现了0次A ===> 什么也没有,即相当于 grep '' oldboy.txt ;所有就会把整个文件的内容都显示出来
2. A连续出现了1次以上 # 表示所有:
.* 表示 所有字符、所有符号、所有
# 找出文件中以m开头的行并且以m结尾的行
[root@NEO oldboy]# grep '^m.*m$' oldboy.txt
my blog is http://oldboy.blog.51cto.com
[root@NEO oldboy]# # 中括号的用法
# [] 中括号 [abc] ---> 找出包含 a 或 b 或 c 的行;另外, 一个中括号相当于一个字符
[root@NEO oldboy]# grep '[abc]' oldboy.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my god ,i am not oldbey,but OLDBOY! # 以 m或n或o开头的 并且以 m或g结尾的行
[root@NEO oldboy]# grep '^[mno].*[mg]$' oldboy.txt
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
[root@NEO oldboy]# # 1. [字符集]
# 2. [a-zA-Z0-9]
# 3. [^字符集] ===> 不匹配的字符集;表示排除
扩展正则: + | () {} ?
扩展正则: + 的使用
+ 表示 前一个符号连续出现了1次或多次
# grep sed 命令默认只支持基础正则表达式,egrep 和 grep -E 支持扩展正则
[root@NEO oldboy]# egrep '0+' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@NEO oldboy]# grep '0+' oldboy.txt
[root@NEO oldboy]# egrep -o '0+' oldboy.txt
000
00000
[root@NEO oldboy]# egrep -o '0' oldboy.txt
0
0
0
0
0
0
0
0
[root@NEO oldboy]# # 把文件中连续出现的小写字母取出来,只保留连续出现的小写字母
[root@NEO oldboy]# egrep '[a-z]+' oldboy.txt -o
am
oldboy
teacher
teach
linux
like
badminton
ball
billiard
ball
and
chinese
chess
my
blog
is
http
oldboy
blog
cto
com
our
site
is
http
www
etiantian
org
my
num
is
not
my
god
i
am
not
oldbey
but
[root@NEO oldboy]# # [] 通常和 + 一起使用
扩展正则:| 竖线的用法
| (竖线) 表示 或者 [root@NEO oldboy]# egrep 'linux|oldboy' oldboy.txt
I am oldboy teacher!
I teach linux.
my blog is http://oldboy.blog.51cto.com
[root@NEO oldboy]# # [] 与 | 的区别:
相同点: 都可以表示 或者 ---> [abc] a|b|c
不同点:
1. [] 是基础正则, | 是扩展正则
2. [] 表示的是单个字符的或者, | 可以表示 单个字符的或者 和 多个字符的或者(|可以用来表示整体单词)
[oldboy] 表示 o或者l或者d或者b或者o或者y , oldboy|linux 表示 oldboy 或者 linux
扩展正则:小括号与后向引用
() 表示括号中的内容相当于是一个整体;也可表示 后向引用(反向引用) # () 表示整体:
[root@NEO oldboy]# egrep 'oldbey|oldboy' oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@NEO oldboy]# egrep 'oldb(e|o)y' oldboy.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@NEO oldboy]# # () 表示 后向引用(反向引用);一般用在 sed 命令中
sed 中,把你想要的内容先保护进来(通过小括号),然后再使用它
[root@NEO oldboy]# echo 123456|sed 's#(.*)#<\1>#g'
sed: -e expression #1, char 13: invalid reference \1 on `s' command's RHS
[root@NEO oldboy]# echo 123456|sed -r 's#(.*)#<\1>#g'
<123456>
[root@NEO oldboy]# # 1. sed 只支持 基础正则, sed -r 支持扩展正则
# 2. 管道后面的 sed 想要前面的6个内容:123456, 就用 .* , 然后加上小括号 把 .* 当一个整体“保护”起来
# 3. sed 中的 \数字 表示前面的 第几个小括号中的内容 [root@NEO oldboy]# echo 123456|sed -r 's#.(.)..(.).#<\1>#g'
<2>
[root@NEO oldboy]#
扩展正则:或括号与问号
{n,m} 表示 前一个字符连续出现了至少n次,最多m次
{n} 表示前一个字符连续出现了n次
{n,} 表示前一个字符连续出现了至少n次 [root@NEO oldboy]# egrep '0{1,4}' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@NEO oldboy]# egrep '0{1,4}' oldboy.txt -o
000
0000
0
[root@NEO oldboy]# # 找出连续出现8次以上的数字
[root@NEO oldboy]# egrep '[0-9]{8,}' oldboy.txt
my qq num is 49000448.
not 4900000448.
[root@NEO oldboy]# egrep '[0-9]{8,}' oldboy.txt -o
49000448
4900000448
[root@NEO oldboy]# ? 表示 前一个字符连续出现0次或1次
# li.log 文件内容如下:
gd
good
god
goooooood # 取出 gd 或 god
[root@NEO oldboy]# egrep 'go?d' li.log
gd
god
[root@NEO oldboy]# # 查询三剑客 grep sed awk 的用法: info 命令,如 info grep
练习:
题1. 取出网卡ip地址 -- awk 方法详解
1) 执行命令取出 linux 中 eth0 的IP地址
# 思路: 1. 定位 -- 取出第2行 ; 2. 取出你要的ip地址 # 方法一:awk 方法: awk + awk + awk
[root@NEO ~]#
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'
inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0 |awk 'NR==2' |awk '{print $2}'
addr:10.0.0.200
[root@NEO ~]# ifconfig eth0|awk 'NR==2'|awk '{print $2}'|awk -F ':' '{print $2}'
10.0.0.200 # 方法二:
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'
inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'|awk -F '[: ]' '{print $13}'
10.0.0.200
[root@NEO ~]#
# awk -F "[: ]" 指定分隔符的时候,遇到一个 : 或者一个 空格 就切一刀(inet addr 前面有10个空格) # 方法三: awk -F "[: ]+"
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'
inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'|awk -F '[: ]+' '{print $4}'
10.0.0.200
# awk -F "[: ]+" 表示 以连续的 : 或者 连续的空格 (当做一个整体) 作为分隔符 # 方法四:awk 最终版
[root@NEO ~]# ifconfig eth0 |awk 'NR==2'
inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0 |awk 'NR==2{print $2}' # awk '找谁{干啥}'
addr:10.0.0.200
[root@NEO ~]# ifconfig eth0 |awk -F '[: ]+' 'NR==2{print $4}'
10.0.0.200
[root@NEO ~]# 取出网卡ip地址 --- sed 命令方法详解
# 方法一: sed + sed + sed
[root@NEO ~]# ifconfig eth0|sed -n '2p' # -n 表示取消默认输出, '2p' 表示第二行在终端显示
inet addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'
10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:##g'|sed 's# Bc.*$##g'
10.0.0.200
[root@NEO ~]# # 方法二: sed 方法的后向引用(反向引用)
# 后向引用的原则: 先把你想要的内容保护进来,然后再后面使用
[root@NEO ~]# ifconfig eth0|sed -n '2p'|sed 's#^.*dr:(.*) Bc.*$#\1#g' -r
10.0.0.200 # 方法三:
# 预备知识: 把 ifconfig eth0 第2行的 inet 替换为 oldboy:
[root@NEO ~]# ifconfig eth0|sed -n '2s#inet#oldboy#gp'
oldboy addr:10.0.0.200 Bcast:10.0.0.255 Mask:255.255.255.0
[root@NEO ~]#
# '2s#inet#oldboy#gp' # 把第2行显示出来,并且把 inet 替换为 oldboy [root@NEO ~]# ifconfig eth0|sed -rn '2s#^.*dr:(.*) Bc.*$#\1#gp'
10.0.0.200
题2: 文件的权限 :如何取得 /etc/hosts 文件的权限对应的数字内容,如 -rw-r--r-- 为 644,要求使用命令取得 644 或 0644 这样的数字
[root@NEO ~]# stat /etc/hosts
File: `/etc/hosts'
Size: 180 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 130078 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2019-04-01 03:31:10.085781787 +0800
Modify: 2019-03-14 18:35:35.112864019 +0800
Change: 2019-03-14 18:35:35.120864048 +0800 # 方法一: awk
[root@NEO ~]# stat /etc/hosts|awk 'NR==4'
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
[root@NEO ~]# stat /etc/hosts|awk -F "[(/]" 'NR==4{print $2}' # 以 ( 和 / 作为分隔符; NR==4{print $2} 第4行,显示第2列
0644
[root@NEO ~]# # 方法二: sed
[root@NEO ~]# stat /etc/hosts |sed -rn '4s#^.*\(([0-9]+).*$#\1#gp' # \( 表示转义; ([0-9]+) 把你需要的内容保护起来
0644
[root@NEO ~]# # 方法三: stat 命令的参数: stat -c%a /etc/hosts # awk 命令指定某一行、某一列: 'NR==2{print $2}'
# sed 找出第几行同时进行替换: '4s#被替换#替换#gp' # sed 擅长取行 和 替换 和 修改文件的内容
题3:已知 /oldboy/test/txt 文件内容如下,如何把文件中的空行过滤掉 (要求命令行实现)
oldboy xizi xiaochao
方法如下:
# 方法一: grep -v 命令可用于 排除
[root@NEO oldboy]# cat test.txt
oldboy xizi xiaochao
[root@NEO oldboy]#
[root@NEO oldboy]# grep -v '^$' test.txt # grep -v 排除空行
oldboy
xizi
xiaochao
[root@NEO oldboy]#
[root@NEO oldboy]# grep '^$' test.txt # grep 找空行 [root@NEO oldboy]# # 方法二: awk '/找谁/' 命令可用于查找; awk '!/找谁/' 用于排除、取反
[root@NEO oldboy]# awk '/^$/' test.txt [root@NEO oldboy]# awk '!/^$/' test.txt
oldboy
xizi
xiaochao
[root@NEO oldboy]# # 方法三: sed '/找谁/d' 命令可用于 排除(d 表示删除;该命令和 sed -i 参数使用时要慎重,因为真的会删除文件内容)
[root@NEO oldboy]# sed '/^$/d' test.txt
oldboy
xizi
xiaochao
[root@NEO oldboy]#
题4: 已知 /oldboy/ett.txt 文件内容如下,请使用 grep 或 egrep 正则匹配的方式过滤出前两行内容
oldboy
olldboooooy
test # 三剑客表示过滤和定位的方法:
[root@NEO oldboy]# egrep 'oldboy' ett.txt
oldboy
[root@NEO oldboy]# awk '/oldboy/' ett.txt
oldboy
[root@NEO oldboy]# sed -n '/oldboy/p' ett.txt # sed -n '/oldboy/p' 把有oldboy 的行过滤出来
oldboy
[root@NEO oldboy]# egrep 'ol+dbo+y' ett.txt
oldboy
olldboooooy
[root@NEO oldboy]# awk '/ol+dbo+y/' ett.txt
oldboy
olldboooooy
[root@NEO oldboy]# sed -nr '/ol_dbo+y/p' ett.txt
[root@NEO oldboy]# # awk 定位:
awk 'NR==1'
awk 'NR==1,NR==10' # 第1到第10行
awk '//'
# sed 定位:
sed -n '1p'
sed -n '1,10p' # 第1到第10行
sed -n '10,$p' # 第10行到最后一行
sed -n '//p'
题5: linux下通过 mkdir 命令创建一个新目录 /alexdir, /alexdir的硬链接数是多少? 然后在 /alexdir 下面又创建了一个目录 /alexdir/test,问 /alexdir 的硬链接数是多少?
[root@NEO oldboy]# mkdir -p /alexdir
[root@NEO oldboy]# ls -ld /alexdir/
drwxr-xr-x 2 root root 4096 Apr 2 03:11 /alexdir/ # 硬链接数为 2
[root@NEO oldboy]# ls -lid /alexdir/ /alexdir/.
140102 drwxr-xr-x 2 root root 4096 Apr 2 03:11 /alexdir/
140102 drwxr-xr-x 2 root root 4096 Apr 2 03:11 /alexdir/. # /alexdir 和 /alexdir/. 互为硬链接
[root@NEO oldboy]# cd /alexdir/
[root@NEO alexdir]# pwd
/alexdir
[root@NEO alexdir]# cd . # cd . 还是在当前目录下
[root@NEO alexdir]# pwd
/alexdir # 创建 /alexdir/test
[root@NEO alexdir]# ls -ld /alexdir/
drwxr-xr-x 3 root root 4096 Apr 2 03:15 /alexdir/ # /alexdir 的硬链接数为3
[root@NEO alexdir]# ls -lid /alexdir/ /alexdir/. /alexdir/test/..
140102 drwxr-xr-x 3 root root 4096 Apr 2 03:15 /alexdir/
140102 drwxr-xr-x 3 root root 4096 Apr 2 03:15 /alexdir/.
140102 drwxr-xr-x 3 root root 4096 Apr 2 03:15 /alexdir/test/..
[root@NEO alexdir]# cd test/
[root@NEO test]# pwd
/alexdir/test
[root@NEO test]# cd ..
[root@NEO alexdir]# pwd
/alexdir
[root@NEO alexdir]#
题6:查找当前目录下所有文件,并把文件中的 www.etiantian.org 字符串 替换成 www.oldboyedu.com
# 假设现在在 /oldboy 目录
find /oldboy -type f # 方法一:
find /oldboy -type f |xargs sed 's#www.etiantian.org#www.oldboyedu.com#g' # 方法二:
# 预备知识: 想看 mkdir 命令的详细信息
[root@NEO alexdir]# ls -l $(which mkdir) # which mkdir 命令可以得到 mkdir 的路径; $() 会先把命令的运行结果保存起来, $() 即相当于 ``
-rwxr-xr-x. 1 root root 50056 Mar 23 2017 /bin/mkdir
[root@NEO alexdir]# ls -l `which mkdir`
-rwxr-xr-x. 1 root root 50056 Mar 23 2017 /bin/mkdir
[root@NEO alexdir]# # 所以方法二如下:
sed 's#www.etiantian.org#www.oldboyedu.com#g' $(find /oldboy -type f)
# 或者
sed 's#www.etiantian.org#www.oldboyedu.com#g' `find /oldboy -type f` # 方法三:find 命令的参数: -exec 命令 {} \; ---> 把 find 命令找到的结果全都放到 {} 中
find /oldboy -type f -exec sed 's#www.etiantian.org#www.oldboyedu.com#g' {} \;
题7:在一个命令上加什么参数可以实现下面命令的内容在同一行输出
echo "oldboy";echo "oldboy"
[root@NEO ~]# echo "oldboy";echo "oldboy"
oldboy
oldboy # linux中 分号 ; 表示分隔多条命令 , 分号之间的命令没有什么逻辑关系, 即前一个命令错误也不影响后一个命令的执行;&& 之间的命令有逻辑关系:前一个命令执行成功后,后一个命令才能执行
[root@NEO ~]# echo -n "oldboy";echo "oldboy"
oldboyoldboy # echo 命令的 -n 参数 可取消输出每一行结尾的换行符号 (echo 命令默认输出回车) [root@NEO ~]# echo "a\nb"
a\nb
[root@NEO ~]# echo -e "a\nb"
a
b
[root@NEO ~]# # echo 命令的 -e 参数 可让 echo 命令支持 \n \t
[root@NEO ~]# echo -e "a\nb\n\tc"
a
b
c
[root@NEO ~]# echo -e "a\nb\n\tc" >echotest.txt
[root@NEO ~]# cat echotest.txt
a
b
c
[root@NEO ~]# cat -A echotest.txt
a$
b$
^Ic$
题8: 请给出如下格式的 date 命令: 例: 11-02-26; 再给出实现按周输出 比如:周六输出为6
[root@NEO ~]# date
Wed Apr 3 23:00:30 CST 2019
[root@NEO ~]# date +%F
2019-04-03
[root@NEO ~]# date +%Y-%m-%d
2019-04-03
[root@NEO ~]# date +%w # 显示周几
3
[root@NEO ~]# date +%F_%w
2019-04-03_3
[root@NEO ~]# date +%T # 显示时分秒
23:06:07
[root@NEO ~]# date +%H:%M:%S
23:06:45 # date +%F 相当于 date +%Y-%m-%d ,输出格式如 2019-04-03
# date +%T 相当于 date +%H:%M:%S
题9: 打印三天前的日期,格式如: 2011-02-26
[root@NEO ~]# date
Wed Apr 3 23:12:12 CST 2019
[root@NEO ~]# date -d "1day" # 一天后
Thu Apr 4 23:12:14 CST 2019
[root@NEO ~]# date -d "+1day" # 一天后
Thu Apr 4 23:12:18 CST 2019
[root@NEO ~]# date -d "-1day" # 一天前
Tue Apr 2 23:12:37 CST 2019
[root@NEO ~]# date -d "-1day" +%F
2019-04-02
[root@NEO ~]# date -d "-7day" +%F_%w # 7天前的时间
2019-03-27_3
[root@NEO ~]# date +%F_%w -d "-7day"
2019-03-27_3
[root@NEO ~]# date -s "20111011 11:11:11" # date -s 修改时间
Tue Oct 11 11:11:11 CST 2011
[root@NEO ~]# date
Tue Oct 11 11:11:14 CST 2011
[root@NEO ~]# date -s "2hour" # 把当前系统的时间往后增加2小时
Tue Oct 11 13:12:30 CST 2011
[root@NEO ~]# date -s "-1hour" # 把当前系统的时间往前调1小时
Tue Oct 11 12:13:16 CST 2011 # date -s 这个方法要慎用 # 自动修改系统时间
# 时间服务器:
pool.ntp.org
ntp1.aliyun.com # 自动修改系统时间
[root@NEO ~]# ntpdate pool.ntp.org
3 Apr 23:27:03 ntpdate[1724]: step time server 95.216.74.37 offset 235998611.969359 sec
[root@NEO ~]#
环境变量 PATH
题10: Centos 5.x 当从root 用户切换到普通用户 oldboy 时,执行 ifconfig 会提示 command not found
# Linux 运行命令过程:
1. 输入命令
2. linux 会在 PATH里面进行查找
3. 有则运行,没有则报错 [root@NEO ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin # PATH 中命令之间以 : 分隔
[root@NEO ~]# export PATH=/usr/bin # 往环境变量中添加内容时,前面要加上 export ;这是临时修改 PATH 的方法,重新连接 xshell 就会恢复
[root@NEO ~]# echo $PATH
/usr/bin
[root@NEO ~]# ls
-bash: ls: command not found
[root@NEO ~]# mkdir
-bash: mkdir: command not found
[root@NEO ~]# /bin/ls
anaconda-ks.cfg data echotest.txt install.log.syslog # 临时修改 PATH
export PATH=/usr/bin # 永久修改 PATH:
# 1. 把环境变量的配置命令追加到 /etc/profile 中
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin # 2. 生效
source /etc/profile # 修改PATH的作用: 把新命令添加到 PATH中
查找命令的绝对路径:题11:如何快速查到 ifconfig 的全路径,请给出命令 (常用的是下面的前两种方法)
# 方法一: which 方法 可以显示命令的 绝对路径 (在PATH环境变量的路径中找)
[root@NEO ~]#
[root@NEO ~]# which sed
/bin/sed
[root@NEO ~]# which mkdir
/bin/mkdir # 方法二: find / -type f -name "命令名" (在根下面找)
[root@NEO ~]# find / -type f -name "oldboy.txt"
/oldboy/oldboy.txt
[root@NEO ~]# find / -type f -name "gawk"
/bin/gawk
[root@NEO ~]# find / -type f -name "sed"
/bin/sed
[root@NEO ~]# find / -type f -name "mkdir"
/bin/mkdir
[root@NEO ~]# # 方法三: whereis 命令 ---> 找出命令相关的内容
[root@NEO ~]# whereis sed
sed: /bin/sed /usr/share/man/man1p/sed.1p.gz /usr/share/man/man1/sed.1.gz
[root@NEO ~]# whereis awk
awk: /bin/awk /usr/bin/awk /usr/libexec/awk /usr/share/awk /usr/share/man/man1p/awk.1p.gz /usr/share/man/man1/awk.1.gz
[root@NEO ~]# # whereis -b ---> -b 参数 只显示命令(二进制文件)
[root@NEO ~]# whereis -b awk
awk: /bin/awk /usr/bin/awk /usr/libexec/awk /usr/share/awk
[root@NEO ~]# whereis -b sed
sed: /bin/sed
[root@NEO ~]# whereis -b ls
ls: /bin/ls
[root@NEO ~]# # 方法四: locate 命令 ---> 根据名字 找出文件的路径 (是模糊查找)
# locate 是根据文件名字与文件路径的表格(一个数据库)查找的;刚创建的文件不在表格中,所以需要先更新表格 [root@NEO ~]#
[root@NEO ~]# touch oldboy-20171111.log
[root@NEO ~]# locate oldboy-20171111.log
[root@NEO ~]# updatedb # 更新该数据库的命令
[root@NEO ~]# locate oldboy-20171111.log
/root/oldboy-20171111.log
[root@NEO ~]#
题12:查询系统中在线的用户
用户在线 ===> 远程连接 (通过xshell 等连接服务器) 到服务器的用户 # 方法一: w 命令
[root@NEO ~]# w
16:39:26 up 33 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 16:06 0.00s 0.07s 0.00s w
[root@NEO ~]#
[root@NEO ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 69
model name : Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
stepping : 1
microcode : 29
cpu MHz : 2401.000
cache size : 3072 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc up arch_perfmon xtopology tsc_reliable nonstop_tsc unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat xsaveopt fsgsbase bmi1 avx2 smep bmi2 invpcid
bogomips : 4802.00
clflush size : 64
cache_alignment : 64
address sizes : 43 bits physical, 48 bits virtual
power management: # cat /proc/cpuinfo 查看 cpu 信息
# core id 表示 每个 cpu 有几个核心 [root@NEO ~]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 1
On-line CPU(s) list: 0
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 69
Model name: Intel(R) Core(TM) i5-4210U CPU @ 1.70GHz
Stepping: 1
CPU MHz: 2401.000
BogoMIPS: 4802.00
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0
[root@NEO ~]# # CPU(s) 表示是几路的
# Core(s) per socket 表示每个 cpu 有几个核 [root@NEO ~]# w
22:37:17 up 57 min, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 22:36 40.00s 0.01s 0.01s -bash
root pts/0 10.0.0.1 21:41 0.00s 0.02s 0.00s w
# 远程登陆的用户 从哪儿登陆() 什么时候连接入系统的 这个用户在做什么 # 注意:
# 1. 远程登陆用户指的是 以什么用户登陆系统的,如果是以 root 用户登陆,哪怕是后来切换到了普通用户,那也是 root 用户登陆
# 2. FROM 是的 - 表示从服务器本地登陆 # 方法二: last 命令 ---> 谁在什么时间连接到了系统,连接了多久 # 方法三:lastlog 命令 ---> 显示系统中所有用户的最近一次登陆信息 (不太常用)
关机和重启
# 重启:
# 1. init 6 # 尽量不要用这个
# 2. shutdown -r 1 # 1 分钟后重启 (可取消)
# 其他用户取消重启: shutdown -c
# 3. shutdown -r now ---> 相当于 reboot ,即 立刻重启
# 4. reboot # 立刻重启 # 关机:
# 1. init 0 # 立刻关机 (尽量不要用这3个立刻关机的)
# 2. poweroff # 立刻关机
# 3. halt # 立刻关机
# 对于物理机来说, poweroff 会把电源都关了,但 halt 不会关闭电源
# 4. shutdown -h 1 # 1分钟后关机
# 5. shutdown -h now # 立刻关机
linux的快捷键
ctrl + a # 把光标移动到行首
ctrl + e # 把光标移动到行尾
ctrl + c # 撤消当前的操作 cancel
ctrl + d # logout 命令(当前行没有任何内容,退出当前用户)
ctrl + l # 清除屏幕内容,即 相当于 clear 命令
ctrl + u # 剪切光标所在位置到行首的内容
ctrl + k # 剪切光标所在位置到行尾的内容
ctrl + y # 粘贴 # 把光标向右移到一个单词:ctrl + → # 把光标向左移到一个单词:ctrl + ← # ctrl + r ---> 搜索历史命令(断续搜索就断续按 ctrl+r ,找到则按回车)
vi/vim 快捷键:
移动光标:
# 移动到文件的第一行: gg :1 1G
# 移动到文件的最后一行: G :$
# 快速到达文件的第100行: 100gg 100G :100 # 移动光标到行首: 0 ^
# 移动光标到行尾: $ 左:h 下:j 上: k 右:l # vim/vi 编辑快捷键:
# 在当前行下一行插入一个空行并进行到编辑模式: o (小写字母o)
# 删除光标所在位置的内容到行尾: D
# 剪切光标所在位置到行尾的内容,然后进入编辑模式: C
# 到达行尾并进入编辑模式: A # 撤消上一次的操作: u
# 恢复上一次的操作: ctrl + r # 删除当前行的内容到行尾(文件的最后): dG # 复制当前行: yy
# 剪切(删除)当前行: dd
# 粘贴: p # 搜索:
/你要找的内容
断续向下搜索: n
断续向上搜索: N 取消搜索高亮: noh # vim 里面查询帮助:
:h vim的命令
Linux 权限
[root@NEO ~]# su - oldboy
[oldboy@NEO ~]$ ls /root/
ls: cannot open directory /root/: Permission denied # 无权限
[oldboy@NEO ~]$ \rm -f /etc/passwd
rm: cannot remove `/etc/passwd': Permission denied # 无权限
[oldboy@NEO ~]$ touch /etc/oldboy.txt
touch: cannot touch `/etc/oldboy.txt': Permission denied # 无权限
[oldboy@NEO ~]$
如何知道我对某个文件有什么权限
1. 查看我是谁: whoami 命令
[oldboy@NEO ~]$ whoami
oldboy 2. 你与这个文件或目录有什么关系(主人、家人、陌生人): id 命令 看 groups
[oldboy@NEO ~]$ id
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
[oldboy@NEO ~]$ id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy) # groups 表示这个用户属于哪几个家庭 [oldboy@NEO ~]$ ls -l /etc/hosts
-rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts # oldboy 用户是 /etc/hosts 文件的陌生人;oldboy 用户对这个文件的权限是后三个 r-- # 权限的计算:
r ===> 4
w 2
x 1
- 0 -rw-------
420000000
6 0 0 -rw-r--r--
420400400
6 4 4 drwxr-xr-x
421401401
7 5 5
修改权限 和 文件的主人
文件权限:
# 权限的修改:chmod 命令 (change mode) # 方法一: 使用数字的方法修改权限
[root@NEO oldboy]# ls -l oldboy.txt
-rw-r--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod 755 oldboy.txt
[root@NEO oldboy]# ls -l oldboy.txt
-rwxr-xr-x 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# # 方法二:使用字符
主人 家人 陌生人
user group other
u g o [root@NEO oldboy]# chmod 644 oldboy.txt
[root@NEO oldboy]# ll oldboy.txt
-rw-r--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod u+x oldboy.txt # 给 主人 加上 x 权限
[root@NEO oldboy]# ll oldboy.txt
-rwxr--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod u-x oldboy.txt # 给 主人 去掉 x 权限
[root@NEO oldboy]# ll oldboy.txt
-rw-r--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod u=x oldboy.txt # 让 主人的权限变成 x
[root@NEO oldboy]# ll oldboy.txt
---xr--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod u=rwx oldboy.txt # 让 主人的权限变成 rwx
[root@NEO oldboy]# ll oldboy.txt
-rwxr--r-- 1 root root 247 Mar 27 21:15 oldboy.txt # 给文件添加上执行权限(主人、家人、陌生人都加上)
[root@NEO oldboy]# ll oldboy.txt
-rwxr--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod ugo+x oldboy.txt
[root@NEO oldboy]# ll oldboy.txt
-rwxr-xr-x 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod ugo-x oldboy.txt
[root@NEO oldboy]# ll oldboy.txt
-rw-r--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod +x oldboy.txt # 只有 x 权限 能这么写: +x (同时给主人、家人、陌生人加上 x 权限)
[root@NEO oldboy]# ll oldboy.txt
-rwxr-xr-x 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod -x oldboy.txt
[root@NEO oldboy]# ll oldboy.txt
-rw-r--r-- 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chmod a+x oldboy.txt
[root@NEO oldboy]# ll oldboy.txt
-rwxr-xr-x 1 root root 247 Mar 27 21:15 oldboy.txt # chmod +x oldboy.txt === chmod ugo+x oldboy.txt === chmod a+x oldboy.txt # 修改文件的所有者各所属的用户组: chown 命令 (change owner)
[root@NEO oldboy]# ll oldboy.txt
-rwxr-xr-x 1 root root 247 Mar 27 21:15 oldboy.txt
[root@NEO oldboy]# chown oldboy.oldboy oldboy.txt # 把文件修改成 oldboy 主人 和 oldboy 家庭组
[root@NEO oldboy]# ll oldboy.txt
-rwxr-xr-x 1 oldboy oldboy 247 Mar 27 21:15 oldboy.txt # 对于文件来说 rwx 的含义:
# 环境准备:
mkdir -p /oldboy
echo -e 'hostname\npwd' >/oldboy/alex.sh # .sh 结尾的文件是 命令 [root@NEO oldboy]# mkdir -p /oldboy
[root@NEO oldboy]# echo -e 'hostname\npwd' >/oldboy/alex.sh
[root@NEO oldboy]# cat alex.sh
hostname
pwd
[root@NEO oldboy]# [root@NEO oldboy]# ll alex.sh
-rw-r--r-- 1 root root 13 Apr 5 23:29 alex.sh
[root@NEO oldboy]# chown oldboy.oldboy alex.sh # 把 alex.sh 的主人和家人改成 oldboy (测试权限不要用 root 用户, root 默认对文件有读和写的权限)
[root@NEO oldboy]# ll alex.sh
-rw-r--r-- 1 oldboy oldboy 13 Apr 5 23:29 alex.sh
[root@NEO oldboy]# # 文件权限之r权限 : cat
# root 用户下面修改 r 权限 [root@NEO oldboy]# chmod u=r alex.sh
[root@NEO oldboy]# ll alex.sh
-r--r--r-- 1 oldboy oldboy 13 Apr 5 23:29 alex.sh # oldboy 用户下面验证:
[root@NEO ~]# su - oldboy
[oldboy@NEO ~]$ whoami
oldboy
[oldboy@NEO ~]$ cd /oldboy/
[oldboy@NEO oldboy]$ ll alex.sh
-r--r--r-- 1 oldboy oldboy 13 Apr 5 23:29 alex.sh
[oldboy@NEO oldboy]$ cat alex.sh # 有读权限
hostname
pwd
[oldboy@NEO oldboy]$ echo "ls -ld /root" >>alex.sh
-bash: alex.sh: Permission denied # 没有 写权限
[oldboy@NEO oldboy]$ ./alex.sh
-bash: ./alex.sh: Permission denied # 也没有 执行权限 # root 用户下面修改 w 权限
[root@NEO oldboy]# chmod u=w alex.sh
[root@NEO oldboy]# ll alex.sh
--w-r--r-- 1 oldboy oldboy 13 Apr 5 23:29 alex.sh
[root@NEO oldboy]# # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ cat alex.sh
cat: alex.sh: Permission denied
[oldboy@NEO oldboy]$ echo 'w' >>alex.sh
[oldboy@NEO oldboy]$ ./alex.sh
-bash: ./alex.sh: Permission denied
[oldboy@NEO oldboy]$ [root@NEO oldboy]# cat alex.sh
hostname
pwd
w
[root@NEO oldboy]# # root 用户下修改为 rw 权限:
[root@NEO oldboy]# chmod u=rw alex.sh
[root@NEO oldboy]# ll alex.sh
-rw-r--r-- 1 oldboy oldboy 15 Apr 5 23:56 alex.sh # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ cat alex.sh
hostname
pwd
w # root 用户下修改为 x 权限:
[root@NEO oldboy]# chmod u=x alex.sh
[root@NEO oldboy]# ll alex.sh
---xr--r-- 1 oldboy oldboy 15 Apr 5 23:56 alex.sh # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ cat alex.sh
cat: alex.sh: Permission denied
[oldboy@NEO oldboy]$ echo 'w' >>alex.sh
-bash: alex.sh: Permission denied
[oldboy@NEO oldboy]$ ./alex.sh
bash: ./alex.sh: Permission denied # 此处不能执行是因为: x权限执行,需要r 权限的配合
[oldboy@NEO oldboy]$ # root 用户下修改为 rx 权限:
[root@NEO oldboy]# chmod u=rx alex.sh
[root@NEO oldboy]# ll alex.sh
-r-xr--r-- 1 oldboy oldboy 15 Apr 5 23:56 alex.sh # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ cat alex.sh
hostname
pwd
w
[oldboy@NEO oldboy]$ ./alex.sh
NEO
/oldboy
00:54:33 up 2:21, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 22:35 1:17m 0.11s 0.11s -bash
root pts/1 10.0.0.1 23:30 1:13m 0.01s 0.01s -bash
root pts/2 10.0.0.1 23:54 1:47 0.02s 0.02s -bash
root pts/3 10.0.0.1 23:54 0.00s 0.01s 0.00s -bash
[oldboy@NEO oldboy]$ # 文件的rwx小结:
1. r 权限可读取文件内容
2. w 权限可修改文件内容,但需要 r 的配合
没有 r 配合,强制修改退出,会清空文件的内容 3. x 权限执行,需要r 权限的配合
目录的权限
# 目录权限 之 r 权限:
r 可查看目录里面的内容, 即 ls
w 可以在目录里面创建、删除、重命名文件
x 可以进入(cd)到这个目录 # 创建环境:
[root@NEO oldboy]# mkdir -p /oldboy/alexdir
[root@NEO oldboy]# chown oldboy.oldboy /oldboy/alexdir # 让这个目录属于 oldboy 用户
[root@NEO oldboy]# touch /oldboy/alexdir/stu{01..5}.txt # root 修改目录权限 r:
[root@NEO oldboy]# ll -d /oldboy/alexdir/ # ls -d 是查看目录的属性
drwxr-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 /oldboy/alexdir/
[root@NEO oldboy]# chmod u=r alexdir/
[root@NEO oldboy]# ll -d /oldboy/alexdir/
dr--r-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 /oldboy/alexdir/ # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ ls -ld alexdir/
dr--r-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 alexdir/
[oldboy@NEO oldboy]$ ls alexdir/
ls: cannot access alexdir/stu05.txt: Permission denied
ls: cannot access alexdir/stu04.txt: Permission denied
ls: cannot access alexdir/stu02.txt: Permission denied
ls: cannot access alexdir/stu03.txt: Permission denied
ls: cannot access alexdir/stu01.txt: Permission denied
stu01.txt stu02.txt stu03.txt stu04.txt stu05.txt
[oldboy@NEO oldboy]$ ls -l alexdir/
ls: cannot access alexdir/stu05.txt: Permission denied
ls: cannot access alexdir/stu04.txt: Permission denied
ls: cannot access alexdir/stu02.txt: Permission denied
ls: cannot access alexdir/stu03.txt: Permission denied
ls: cannot access alexdir/stu01.txt: Permission denied
total 0
-????????? ? ? ? ? ? stu01.txt
-????????? ? ? ? ? ? stu02.txt
-????????? ? ? ? ? ? stu03.txt
-????????? ? ? ? ? ? stu04.txt
-????????? ? ? ? ? ? stu05.txt
[oldboy@NEO oldboy]$ stat alexdir/stu01.txt
stat: cannot stat `alexdir/stu01.txt': Permission denied # 只有目录的 r 权限 , 无法访问目录下的文件信息
[oldboy@NEO oldboy]$ # root 修改目录权限为 rx :
[root@NEO oldboy]# chmod u=rx alexdir/
[root@NEO oldboy]# ll -d /oldboy/alexdir/
dr-xr-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 /oldboy/alexdir/
[root@NEO oldboy]# # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ ls -ld alexdir/
dr-xr-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 alexdir/
[oldboy@NEO oldboy]$ ls -l alexdir/
total 0
-rw-r--r-- 1 root root 0 Apr 6 01:38 stu01.txt
-rw-r--r-- 1 root root 0 Apr 6 01:38 stu02.txt
-rw-r--r-- 1 root root 0 Apr 6 01:38 stu03.txt
-rw-r--r-- 1 root root 0 Apr 6 01:38 stu04.txt
-rw-r--r-- 1 root root 0 Apr 6 01:38 stu05.txt
[oldboy@NEO oldboy]$ # 目录权限之 wx 权限:
# root 修改目录权限为 w:
[root@NEO oldboy]# chmod u=w alexdir/
[root@NEO oldboy]# ll -d alexdir/
d-w-r-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 alexdir/
[root@NEO oldboy]# # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ ls alexdir/
ls: cannot open directory alexdir/: Permission denied # 没有读权限
[oldboy@NEO oldboy]$ touch alexdir/test.txt
touch: cannot touch `alexdir/test.txt': Permission denied # 没有写权限,因为 w 权限需要 x 权限的配合
[oldboy@NEO oldboy]$ \rm -f alexdir/stu01.txt
rm: cannot remove `alexdir/stu01.txt': Permission denied # 没有写权限 # root 修改目录权限为 wx:
[root@NEO oldboy]# chmod u=wx alexdir/
[root@NEO oldboy]# ll -d alexdir/
d-wxr-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 alexdir/
[root@NEO oldboy]# # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ ll -d alexdir/
d-wxr-xr-x 2 oldboy oldboy 4096 Apr 6 01:38 alexdir/
[oldboy@NEO oldboy]$ touch alexdir/test.txt # 创建成功
[oldboy@NEO oldboy]$ \rm -f alexdir/stu01.txt # 删除成功
[oldboy@NEO oldboy]$ \rm -f alexdir/stu01.tx # 删除成功(没有这个文件也不会报错,因为没有读权限)
[oldboy@NEO oldboy]$ # 目录权限之 x 权限:
# root 修改目录权限为 x:
[root@NEO oldboy]# chmod u=x alexdir/
[root@NEO oldboy]# ll -d alexdir/
d--xr-xr-x 2 oldboy oldboy 4096 Apr 6 11:39 alexdir/
[root@NEO oldboy]# # oldboy 用户下面验证:
[oldboy@NEO oldboy]$ ll -d alexdir/
d--xr-xr-x 2 oldboy oldboy 4096 Apr 6 11:39 alexdir/
[oldboy@NEO oldboy]$ cd alexdir/ # 有 cd 的权限(x权限)
[oldboy@NEO alexdir]$ pwd
/oldboy/alexdir
[oldboy@NEO alexdir]$ ls
ls: cannot open directory .: Permission denied # 没有读权限 (所有单独的x权限意义不大)
[oldboy@NEO alexdir]$ # 目录权限rwx小结:
1. 对于目录来说 r 表示 查看目录里面内容的权限,即 ls ,但对于目录的r权限来说需要 x权限 的配合;没有 x 权限,那么显示的时候文件的属性无法显示
2. w 表示 可以在目录中创建、删除文件、重命名文件的权限;但只有 w 权限 无法创建、删除、重命名文件,w权限需要 x 权限的配合 # 总结:
文件 目录
r 读取文件内容 查看目录的内容(需要x权限的配合)
w 修改文件的内容(需要r权限的配合) 在目录下面创建、删除、重命名文件(需要x权限的配合)
x 执行文件(需要r权限的配合) 进入到目录的权限(cd) # root 下面修改文件权限为 777:
[root@NEO oldboy]# touch /etc/oldboy.txt
[root@NEO oldboy]# ll /etc/oldboy.txt
-rw-r--r-- 1 root root 0 Apr 6 11:52 /etc/oldboy.txt
[root@NEO oldboy]# chmod 777 /etc/oldboy.txt
[root@NEO oldboy]# ll /etc/oldboy.txt
-rwxrwxrwx 1 root root 0 Apr 6 11:52 /etc/oldboy.txt # oldboy用户下面去删除该文件:
[oldboy@NEO ~]$ ll /etc/oldboy.txt
-rwxrwxrwx 1 root root 0 Apr 6 11:52 /etc/oldboy.txt
[oldboy@NEO ~]$ \rm -f /etc/oldboy.txt
rm: cannot remove `/etc/oldboy.txt': Permission denied # 没有权限删除
[oldboy@NEO ~]$ # !!!! 删除一个文件 或者 是创建一个文件,要看你对这个文件所在的目录是否有 wx 权限
网站整体权限规划
# 对文件来说,默认权限为 rw-r--r-- 644 比较好
# 对于目录来说,默认权限为 rwxr-xr-x 755 比较好
# 除此之外,还应让文件或目录的所有者和用户组都为 root root # 网站比较安全的权限:
#假设一个网站的域名为: blog.oldboyedu.com , 网站程序存放在 /app/blog 目录下面 # 1. 网站需要运行起来,通过一个傀儡用户运行起来(例如: www 用户) (傀儡用户的使用场景)
# 2. blog 目录下面:
文件 644 目录 755 并且 所有者 和 用户组都是 root
# 3. blog 目录下面有一个 upload/ 目录 用于存放图片和视频,那么 /blog/upload/ 目录: 文件 644 目录 755 并且其所有者和用户组都为 www 用户 (要不然你向这个目录中上传不了图片和视频) # 小结:
# 1. 网站是通过傀儡用户(虚拟用户)运行起来的,如: www用户 (以root用户运行起来很危险)
# 2. 网站用户上传的目录: 文件644 目录755 并且其所有者和用户组都为 www 这个傀儡用户
# 3. 除了上传目录之外:文件644 目录755 并且其所有者和用户组都为 root root
Linux 系统默认权限之 umask
# Linux 控制系统默认权限的命令: umask
# 1. 根据 umask 计算出系统默认的权限
[root@NEO ~]# umask
0022 # umask 默认是 022
# 文件的最大权限: 666
# 目录的最大权限: 777 # 文件 666 022 644
# 目录 777 022 755 # 根据umask 计算文件的默认权限: 666 - 022 = 644 (644是linux 文件的默认权限)
# 根据umask 计算目录的默认权限: 777 - 022 = 755 (755是linux 目录的默认权限) # 修改 umask 默认权限(如修改为 032): umask 032
# 文件: 666 - 032 = 634
# 目录: 777 - 032 = 745 [root@NEO oldboy]# umask 032
[root@NEO oldboy]# umask
0032
[root@NEO oldboy]# touch file032
[root@NEO oldboy]# mkdir dir032
[root@NEO oldboy]# ls -ld *032
drwxr--r-x 2 root root 4096 Apr 6 14:48 dir032 #
-rw-r--r-- 1 root root 0 Apr 6 14:48 file032 # 644 (644=634+010) # 根据 umask 计算出系统默认权限的规则:
1. 对于目录 777 直接减去 umask 就是 目录默认的权限
2. 对于文件 666减去umask 的值,如果 umask 某一位上面是奇数,奇数位需要 +1
Linux系统的属性 --- 文件隐藏属性/权限 (文件系统的权限)
# lsattr ---> ls attribute 查看隐藏的权限/属性
[root@NEO ~]# lsattr
-------------e- ./install.log.syslog
-------------e- ./anaconda-ks.cfg
-------------e- ./oldboy-20171111.log
-------------e- ./data
-------------e- ./echotest.txt
[root@NEO ~]# # chattr ---> change attribute 改变/设置隐藏的权限/属性
# a ===> append only # 只能追加
# i ===> immuteble # 不能修改的 [root@NEO ~]# lsattr oldboy-20171111.log
-------------e- oldboy-20171111.log
[root@NEO ~]# chattr +a oldboy-20171111.log # 加上 a 属性 (去掉 a 属性就是 -a )
[root@NEO ~]# lsattr oldboy-20171111.log
-----a-------e- oldboy-20171111.log
[root@NEO ~]# echo hello >>oldboy-20171111.log # 可以追加内容
[root@NEO ~]# echo hello >>oldboy-20171111.log # 可以追加内容
[root@NEO ~]# cat oldboy-20171111.log
hello
hello
[root@NEO ~]# echo hello >oldboy-20171111.log # 不能重定向(清空后再添加)
-bash: oldboy-20171111.log: Operation not permitted
[root@NEO ~]# \rm -f oldboy-20171111.log # 不能删除
rm: cannot remove `oldboy-20171111.log': Operation not permitted
[root@NEO ~]# mv oldboy-20171111.log /tmp/ # 不能移动
mv: cannot move `oldboy-20171111.log' to `/tmp/oldboy-20171111.log': Operation not permitted
[root@NEO ~]# # 如果一个文件加上了 a 属性,那么该文件只能追加,不能移动、删除等 # i 属性:
[root@NEO ~]# lsattr oldboy-20171111.log
-----a-------e- oldboy-20171111.log
[root@NEO ~]# chattr -a oldboy-20171111.log
[root@NEO ~]# chattr +i oldboy-20171111.log # 修改为 i 属性
[root@NEO ~]# lsattr oldboy-20171111.log
----i--------e- oldboy-20171111.log
[root@NEO ~]# echo hello >>oldboy-20171111.log # 不能追加
-bash: oldboy-20171111.log: Permission denied
[root@NEO ~]# echo hello >oldboy-20171111.log # 不能重定向
-bash: oldboy-20171111.log: Permission denied
[root@NEO ~]# \rm -f oldboy-20171111.log # 不能删除
rm: cannot remove `oldboy-20171111.log': Operation not permitted
[root@NEO ~]# mv oldboy-20171111.log /tmp/ # 不能移动
mv: cannot move `oldboy-20171111.log' to `/tmp/oldboy-20171111.log': Operation not permitted
[root@NEO ~]# cat oldboy-20171111.log # 可以查看
hello
hello
[root@NEO ~]# ##### /tmp 目录的权限: 1777 1 表示 sticky粘滞位