Linux

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > Linux > Linux系统特殊权限和通配符及特殊字符

Linux系统特殊权限和通配符及特殊字符使用详解

作者:koboides

本文概述Linux权限掩码、SUID/SGID设置及通配符(如~、.、..)与引号(单/双引号)的使用区别,结合应用案例与练习题,帮助理解文件目录权限控制和命令字符串处理技巧

一、Linux系统基础权限

1. 默认权限掩码及设置命令umask

1.1 umask命令说明

umask是通过八进制的数值来定义用户创建文件或目录的默认权限的。系统会根据预先设定的 umask 值计算出默认情况下创建的文件或目录权限。

1)为什么创建文件默认权限为644,目录为755?

umask 权限掩码。控制系统的文件和目录的默认权限。

[root@buffes buffes]# umask 
0022

针对文件来说:默认权限计算方法
6 6 6
0 2 2 -
-----------
6 4 4  ###系统的文件默认权限
==============================

2)umask掩码的3位每一位数字是否有【奇数】,如果有奇数(奇数位加1)

测试:
[root@buffes buffes]# umask 021
[root@buffes buffes]# umask 
0021
[root@buffes buffes]# touch f021
[root@buffes buffes]# ls -l f021 
-rw-r--rw-. 1 root root 0 5月  21 10:40 f021

计算:
6 6 6
0 2 1 -
-----------
6 4 5  ###系统的文件默认权限
0 0 1
---------------
6 4 6

测试:
[root@buffes buffes]# umask 033
[root@buffes buffes]# umask 
0033
[root@buffes buffes]# touch f033
[root@buffes buffes]# ls -l f033
-rw-r--r--. 1 root root 0 5月  21 10:42 f033


结论:文件默认权限结论
1.权限从666开始计算。
2.如果偶数,正常做减法。
3.如果是奇数,奇数位加一。

3)针对目录默认权限

1.权限从777开始计算。
2.和掩码正常做减法。


测试:
[root@buffes buffes]# mkdir d033
[root@buffes buffes]# ls -ld d033
drwxr--r--. 2 root root 6 5月  21 10:44 d033
[root@buffes buffes]# umask 045
[root@buffes buffes]# mkdir d045
[root@buffes buffes]# ls -ld d045
drwx-wx-w-. 2 root root 6 5月  21 10:45 d045


UID大于199,并且用户和组同名,umask为002
cat /etc/bashrc
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ];
then
       umask 002
else
       umask 022
fi

/home/buffes 默认700,  #控制/etc/login.defs


想一想???为什么系统把默认权限定为:
默认644,目录755呢? #安全临界值

1.2 有关权限生产环境应用案例及思路

运营电商 jd,站点目录给什么权限安全呢?
目录755
[root@buffes buffes]# mkdir /data/html -p
[root@buffes buffes]# ls -ld /data/html/
drwxr-xr-x. 2 root root 6 5月  21 11:07 /data/html/
web服务运行时候有一个【虚拟用户www】,
1)虚拟用户www 可进入查看程序文件,不可以写、删文件。

[root@buffes buffes]# useradd www
[root@buffes buffes]# chown -R www.www /data/html
[root@buffes buffes]# ls -ld /data/html
drwxr-xr-x. 2 www www 6 5月  21 11:07 /data/html  #可以写、删文件


普通站点目录:【用户和组都是root,权限755】
[root@buffes buffes]# ls -ld /data/html
drwxr-xr-x. 2 root root 6 5月  21 11:07 /data/html/


[root@buffes buffes]# mkdir /data/html/upload -p ###存放图片,文件
[root@buffes buffes]# ls -ld /data/html/upload/
drwxr-xr-x. 2 root root 6 5月  21 11:15 /data/html/upload/

图片、文件目录授权:【用户和组www,权限755】
[root@buffes buffes]# chown -R www.www /data/html/upload/
[root@buffes buffes]# ls -ld /data/html/upload/
drwxr-xr-x. 2 www www 6 5月  21 11:15 /data/html/upload/

解决upload上传目录安全:
1)不让上传:程序:控制这个目录上传的内容只能是.jpg,.zip。
2)不让执行:nginx:针对upload访问的时候,除了.jpg,.zip之外,不提供访问。
3)不让执行:动态服务器和静态服务器分离,访问的时候只有静态服务器(不安装PHP,java,python)
4)不让执行:磁盘上挂载的时候,设置禁止程序运行(二进制程序)。

不管什么业务都没有改程序文件的需求。
程序文件 [644 root root]
程序文件 [644 www www]    #不推荐

三剑客sed 企业木马案例:
[root@buffes buffes]# touch suid.txt
[root@buffes buffes]# ls -l suid.txt
-rw-r--r--. 1 root root 0 5月  21 11:55 suid.txt

2. linux特殊权限位

[suid]
1)suid(setuid)位通过S字符标识。
2)存在于基本权限的用户权限位的x权限对应的位置。
3)如果用户权限位对应的x权限位上有x权限,则suid就用小写的s标识。
4)suid的s对应的数字权限为4。
5)完整权限用八进制数4000表示。

创建文件备用测试
[root@buffes buffes]# touch suid.txt
[root@buffes buffes]# ls -l suid.txt
-rw-r--r--. 1 root root 0 5月  21 11:55 suid.txt

数字权限设置suid测试:
chmod 4644 suid.txt

[root@buffes buffes]# chmod 4644 suid.txt
[root@buffes buffes]# ls -l suid.txt
-rwSr--r--. 1 root root 0 5月  21 11:55 suid.txt
[root@buffes buffes]# chmod u+x suid.txt
[root@buffes buffes]# ls -l suid.txt
-rwsr--r--. 1 root root 0 5月  21 11:55 suid.txt

取消设置suid测试:
[root@buffes buffes]# chmod 644 suid.txt
[root@buffes buffes]# ls -l suid.txt
-rw-r--r--. 1 root root 0 5月  21 11:55 suid.txt

字符设置suid
chmod u+s suid.txt
ls -l suid.txt
chmod u-s suid.txt
ls -l suid.txt

2.1 为什么会有SUID?

例子:普通用户修改密码。
	[buffes@buffes ~]$ passwd
	更改用户 buffes 的密码 。
	为 buffes 更改 STRESS 密码。
	(当前)UNIX 密码:
	新的 密码:
	重新输入新的 密码:
	passwd:所有的身份验证令牌已经成功更新。
1)修改密码passwd =======>>修改/etc/shadow文件

buffes用户使用passwd命令,修改/etc/shadow文件,来实现修改密码的。
ls -l /etc/shadow 
[buffes@buffes ~]$ ls -l /etc/shadow 
----------. 1 root root 2484 5月  21 12:10 /etc/shadow
传统权限分析,buffes是其他用户,修改/etc/shadow权限---,没有权限修改。。
事实呢?改了

suid的特殊作用:可以绕过基础权限体系,可以修改没有权限修改的文件。
基于二进制命令的。

[buffes@buffes ~]$ ls -l `which passwd`
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /bin/passwd
1)给一个命令设置suid以后,所有使用这个命令的用户,都拥有和这个命令对应的用户的权限。

问题:
cd 不好用
1)bash内置命令,C6系统中没有对应文件。
2)有对应文件。授权系统文件的cd,执行cd很可能执行的是bash内置的cd。
3)
[root@buffes ~]# which cd
/usr/bin/cd
[root@buffes ~]# cd /usr/bin/
[root@buffes bin]# mv cd cdd
[root@buffes bin]# cd /root
[root@buffes ~]# ls cdd
ls: 无法访问cdd: 没有那个文件或目录
[root@buffes ~]# cd /usr/bin
[root@buffes bin]# ls cdd
cdd

-rwxr-xr-x. 1 root root 62872 8月  20 2019 /bin/rm
[root@buffes bin]# find /bin/ -type f -perm 4755|xargs ls -l
-rwsr-xr-x. 1 root root 73888 8月   9 2019 /bin/chage
-rwsr-xr-x. 1 root root 57656 8月   9 2019 /bin/crontab
-rwsr-xr-x. 1 root root 32096 10月 31 2018 /bin/fusermount
-rwsr-xr-x. 1 root root 78408 8月   9 2019 /bin/gpasswd
-rwsr-xr-x. 1 root root 44264 4月   1 2020 /bin/mount
-rwsr-xr-x. 1 root root 41936 8月   9 2019 /bin/newgrp
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /bin/passwd
-rwsr-xr-x. 1 root root 23576 4月   1 2020 /bin/pkexec
-rwsr-xr-x. 1 root root 32128 4月   1 2020 /bin/su
-rwsr-xr-x. 1 root root 31984 4月   1 2020 /bin/umount


suid生产场景实际用途。
1.所有普通用户都能用到
2.普通用户想修改没有权限文件时候使用。
3.命令是没有破坏作用的。
比如:ping,passwd

3.sgid权限知识

对于二进制命令或者程序来说,sgid的功能和suid基本相同,唯一的区别是suid是获得命令所属用户的身份和权限,而sgid是获得命令的所属用户组的身份和权限,因此,有关sgid对于二进制命令或者程序方面的知识就不详细叙述了。

3.1 suid核心知识

1)与suid不同的是,sgid既可以针对文件,也可以针对目录设置!
2)sgid的权限是针对用户组权限位的。
对于文件来说,sgid的功能如下:
1)sgid仅对二进制命令及程序有效。
2)二进制命令或程序,也需要有可执行权限x配合。
3)执行命令的任意用户可以获得该命令程序执行期间所属组的身份和权限。


理解sgid:
locate====>读/var/lib/mlocate/mlocate.db <====updatedb

[root@buffes bin]# ls -l /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1423565 5月  21 03:23 /var/lib/mlocate/mlocate.db
结论没有权限可以查询/var/lib/mlocate/mlocate.db

事实上是可以查的。
[buffes@buffes ~]$ locate cp

原因:就是locate命令被设置了sgid
[buffes@buffes ~]$ ls -l `which locate`
-rwx--s--x. 1 root slocate 40520 4月  11 2018 /bin/locate

测试:取消sgid
[root@buffes bin]# chmod g-s /bin/locate 
[root@buffes bin]# ls /bin/locate -l
-rwx--x--x. 1 root slocate 40520 4月  11 2018 /bin/locate

查看:
[buffes@buffes ~]$ locate cp
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 权限不够


参考解答:
[root@buffes ~]# mkdir /home/admins             #<==创建共享目录admins。
[root@buffes ~]# groupadd adminuser             #<==添加用户组adminuser。
[root@buffes ~]# ls -ld /home/admins 
drwxr-xr-x. 2 root root 4096 Apr 30 16:54 /home/admins
[root@buffes ~]# chgrp adminuser /home/admins/  #<==给adminis目录授权adminuser用户组。
[root@buffes ~]# ls -ld /home/admins
drwxr-xr-x. 2 root adminuser 4096 Apr 30 16:54 /home/admins  #<==查看授权结果。
[root@buffes ~]# touch /home/admins/buffes.txt  #<==创建测试文件。
[root@buffes ~]# ls -l /home/admins/


来看一道RHCE认证考试题(了解即可)。
创建共享目录/home/admins,要求属组为adminuser,adminuser组成员对admins目录有写入、读取和执行的权限,其他所有用户没有任何权限(root除外),在/home/admins目录中创建的文件会自动继成adminuser组。
参考解答:
[root@buffes ~]# mkdir /home/admins             #<==创建共享目录admins。
[root@buffes ~]# groupadd adminuser             #<==添加用户组adminuser。
[root@buffes ~]# ls -ld /home/admins 
drwxr-xr-x. 2 root root 4096 Apr 30 16:54 /home/admins
[root@buffes ~]# chgrp adminuser /home/admins/  #<==给adminis目录授权adminuser用户组。
[root@buffes ~]# ls -ld /home/admins
drwxr-xr-x. 2 root adminuser 4096 Apr 30 16:54 /home/admins  #<==查看授权结果。
[root@buffes ~]# touch /home/admins/buffes.txt  #<==创建测试文件。
[root@buffes ~]# ls -l /home/admins/
total 0
-rw-r--r--. 1 root root 0 Apr 30 19:59 buffes.txt  #<==文件默认用户和组都是root。
[root@buffes ~]# chmod 2770 /home/admins  #<==授权sgid权限给admins目录。
[root@buffes ~]# ls -ld /home/admins/
drwxrws---. 2 root adminuser 4096 Apr 30 20:10 /home/admins/  #<==查看授权结果。
[root@buffes ~]# touch /home/admins/newfile.txt  #<==在创建新文件。
[root@buffes ~]# ls -l /home/admins/
total 0
-rw-r--r--. 1 root adminuser 0 Apr 30 20:04 newfile.txt  
#<==新创建的文件用户组为adminuser了,而非默认的root了。
-rw-r--r--. 1 root root      0 Apr 30 19:59 buffes.txt
整个配置过程,已满足题意需求。

二、通配符与特殊符号

1. 通配符

1.代表特殊含义的一些符号。
2.bash命令行操作的时候。

作用于文件名的通配符:
符号	作用
*	    匹配任意(0个或多个)字符或字符串,包括空字符串※
?	    匹配任意1个字符,有且只有一个字符

字符集合(匹配一堆字符/文本)
[abcd]	匹配abcd中任何一个字符,abcd也可是其他任意不连续字符
[a-z]	匹配a到z之间的任意一个字符,字符前后要连续,也可以用连续数字[1-9]

[!abcd]	表示不匹配括号里面的任何一个字符,也可书写为[!a-d],这里的!号可以用^替代,即[^abcd]

*的作用:经常使用
ls *
rm -f *.txt
ls *
rm -f f*


[root@buffes ~]# find ./ -name "*.txt"
./a.txt
./aaa.txt
./girlLove/girlLove.txt

[root@buffes ~]# find /etc/ -type f -name "*hosts"
/etc/hosts


?的作用(了解)
[root@buffes ~]# touch a.txt
[root@buffes ~]# touch aaa.txt
[root@buffes ~]# ls ?.txt
a.txt
[root@buffes ~]# ls ???.txt
aaa.txt

[abcd]的实践(了解)
[root@buffes ~]# ls [abcd].txt
a.txt
[root@buffes ~]# touch b.txt
[root@buffes ~]# ls [abcd].txt
a.txt  b.txt
[root@buffes ~]# touch bb.txt
[root@buffes ~]# ls [abcd].txt
a.txt  b.txt

[a-z]或[1-9]
[root@buffes ~]# touch {1..3}.txt
[root@buffes ~]# ls [a-z].txt
a.txt  b.txt
[root@buffes ~]# ls [1-9].txt
1.txt  2.txt  3.txt

[^a-z]或[!1-9](了解)
[root@buffes ~]# ls *.txt
1.txt  2.txt  3.txt  aaa.txt  a.txt  bb.txt  b.txt  cd.txt
[root@buffes ~]# ls [^1-9].txt
a.txt  b.txt
[root@buffes ~]# ls [a-z].txt
a.txt  b.txt
[root@buffes ~]# ls [!a-z].txt
1.txt  2.txt  3.txt

2. 与路径和位置有关的特殊符号

符合作用
~用户的家目录,超级用户为/root,普通用户为/home
-代表上一次(相对于当前路径)用户所在的路径
.代表当前目录(点号还有很多其它含义,暂且不表)
代表上一级目录
有一个环境变量名字叫OLDPWD,用来时刻记录上一次所在的路径。
所以 cd -的时候,实际就是 cd $OLDPWD

[root@buffes ~]# echo $OLDPWD
/etc
[root@buffes ~]# cd -
/etc
[root@buffes etc]# echo $OLDPWD
/root
[root@buffes etc]# cd -
/root
[root@buffes ~]# cd /etc/sysconfig/
[root@buffes sysconfig]# echo $OLDPWD
/root
[root@buffes sysconfig]# cd -
/root
[root@buffes ~]# echo $OLDPWD
/etc/sysconfig
[root@buffes ~]# cd -
/etc/sysconfig
[root@buffes sysconfig]# cd $OLDPWD
[root@buffes ~]# pwd
/root
[root@buffes ~]# 
[root@buffes ~]# 
[root@buffes ~]# 
[root@buffes ~]# cd $OLDPWD
[root@buffes sysconfig]# pwd
/etc/sysconfig

2.1 单引号

(‘’)所见即所得,即输出单引号内容时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的是什么就会输出什么,被称之为强引用

[root@buffes ~]# echo 'date'
date
[root@buffes ~]# a=123
[root@buffes ~]# echo $a
123
[root@buffes ~]# echo '$a'
$a
[root@buffes ~]# echo "$a"
123

希望看到啥就输出啥就用单引号。

2.2 双引号(常用)

(“”) 输出双引号内的所有内容时,如果内容中有命令(要反引下)、变量、特殊转义符等,会先把变量、命令、转义字符解析出结果,然后再输出最终内容,被称为弱引用。推荐使用

1)不知道用什么引号就用双引号。
[root@buffes ~]# echo $(date)
2030年 05月 24日 星期五 23:26:09 CST
[root@buffes ~]# echo '$(date)'
$(date)
[root@buffes ~]# echo "$(date)"
2030年 05月 24日 星期五 23:26:28 CST

2.3 无引号

赋值时,如果变量内容有空格会使得赋值不完整。而在输出内容时,也会将含有空格的字符串视为一个整体输出;如果内容中有命令(要反引下)、变量等,会先把变量、命令解析出结果,然后输出最终内容;如果字符串中带有空格等特殊字符,则有可能无法完整地输出,因此需要改加双引号。

一般连续的字符串、数字、路径等可以不加任何引号赋值和输出,不过无引号的情况最好用双引号替代之,特别是变量赋值时内容很简单,且没有空格,这个时候 不加引号也可以和双引号类似,双引号引起来的内容是一个整体。

[root@buffes ~]# echo $a
123
[root@buffes ~]# echo $(date)
2030年 05月 24日 星期五 23:27:54 CST

双引号引起来的内容是一个整体。
[root@buffes ~]# echo 123 456
123 456
[root@buffes ~]# a=123 456
-bash: 456: 未找到命令
[root@buffes ~]# echo $a
123
[root@buffes ~]# a=“123 456”
[root@buffes ~]# echo $a
123 456

2.4 反引号(相当于$())

(``) 一般用于引用命令,执行的时候命令会被执行,相当于$(),赋值和输出都要将命令用``引起来里面是可执行的命令。

[root@buffes ~]# date
2030年 05月 24日 星期五 23:31:02 CST
[root@buffes ~]# echo $(date)
2030年 05月 24日 星期五 23:31:09 CST
[root@buffes ~]# echo `date`
2030年 05月 24日 星期五 23:31:19 CST
[root@buffes ~]# tar zcf /tmp/etc_$(date +%F).tar.gz /etc
tar: 从成员名中删除开头的“/”

2.4 其他特殊符号

;	
表示一个命令的结束
也是命令间的分隔符

#	
1)root用户的命令提示符
2)表示是注释内容,是用来给管理员看的,系统不会执行#号开头的内容
3)命令替换用的分隔符 比如VIM里的替换  :%s#129#921#g

	
|	表示管道,将一个命令处理后的中间内容输出给下一个命令继续处理
	[root@buffes ~]# cat /etc/services |grep 3306
	mysql           3306/tcp                        # MySQL
	mysql           3306/udp                        # MySQL
	 1)管道传输的是数据流(文件内容),不是文件(文件名)。
	 2)不需要管道直接可以用命令处理。
		[root@buffes ~]# grep 3306 /etc/services 
		mysql           3306/tcp                        # MySQL
		mysql           3306/udp                        # MySQL
	 3)分组功能,同时过滤多个字符串
	 grep -E ==egrep 
	 [root@buffes ~]# egrep "3306|1521" /etc/services 
	mysql           3306/tcp                        # MySQL
	mysql           3306/udp                        # MySQL
	ncube-lm        1521/tcp                # nCube License Manager
	ncube-lm        1521/udp                # nCube License Manager

$	
	1)代表普通用户的命令提示符
	2)字符串前加$符号,代表字符串变量内容
	[buffes@buffes ~]$ a=buffes
	[buffes@buffes ~]$ echo $a
	buffes
	[root@buffes ~]# echo $LANG #字符集设置
	zh_CN.UTF-8
	[root@buffes ~]# echo $PS1  #命令行的变量
	[\[\e[35;1m\]\u@\[\e[33;1m\]\h\[\e[34;1m\] \W\[\e[0m\]]\$
	[root@buffes ~]# echo $HOME
	/root
	
\	逃脱符或转义字符,即将有特殊含义的字符(通配符或正则表达式)还原成字符本意
    \? 只表示问号本身
	
touch \?.txt #代表创建?.txt这个文件。
[root@buffes ~]# ls ?.txt
1.txt  2.txt  3.txt  a.txt  b.txt
[root@buffes ~]# ls \?.txt
ls: 无法访问?.txt: 没有那个文件或目录
[root@buffes ~]# touch ?.txt
[root@buffes ~]# ls
1.txt  aaa.txt  bb.txt  girlLove      buffes_dir
2.txt  abc      b.txt   girlLove.zip  user.list
3.txt  a.txt    cd.txt  buffes        老男孩Linux58期开班典礼3_-.pptx
[root@buffes ~]# touch \?.txt
[root@buffes ~]# ls
1.txt    abc     cd.txt        buffes_dir
2.txt    a.txt   girlLove      ?.txt
3.txt    bb.txt  girlLove.zip  user.list
aaa.txt  b.txt   buffes        老男孩Linux58期开班典礼3_-.pptx
[root@buffes ~]# ls ?.txt
1.txt  2.txt  3.txt  a.txt  b.txt  ?.txt
[root@buffes ~]# ls \?.txt
?.txt

{}	
1)生成序列
[root@buffes ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@buffes ~]# 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@buffes ~]# echo {z..a}
z y x w v u t s r q p o n m l k j i h g f e d c b a
[root@buffes ~]# echo {10..1}
10 9 8 7 6 5 4 3 2 1

seq 数字序列
1)默认:
[root@buffes ~]# seq 5
1
2
3
4
5

=============
打奇偶数
seq 1      2       5 
    起始   步长   结束
[root@buffes ~]# seq 1 2 5 
1
3
5
[root@buffes ~]# seq 2 2 6 
2
4

[root@buffes ~]# seq 6 -1 1
6
5
4
3
2
1
[root@buffes ~]# seq -w 10
01
02
03
04
05
06
07
08
09
10

用途:
touch stu{1..10}.txt
[root@buffes ~]# echo {00..10}
00 01 02 03 04 05 06 07 08 09 10
[root@buffes ~]# echo {00..10}|xargs -n 1
00
01
02
03
04
05
06
07
08
09
10
[root@buffes ~]# seq -s " " 5
1 2 3 4 5
[root@buffes ~]# seq -w -s " " 10
01 02 03 04 05 06 07 08 09 10
[root@buffes ~]# seq 10
1
2
3
4
5
6
7
8
9
10
[root@buffes ~]# seq -w 10
01
02
03
04
05
06
07
08
09
10
[root@buffes ~]# seq -w 10|sed -r 's#(.*)#\1#g'
01
02
03
04
05
06
07
08
09
10
[root@buffes ~]# seq -w 10|sed -r 's#(.*)#useradd buffes\1#g'
useradd buffes01
useradd buffes02
useradd buffes03
useradd buffes04
useradd buffes05
useradd buffes06
useradd buffes07
useradd buffes08
useradd buffes09
useradd buffes10
[root@buffes ~]# echo -e {00..10}"\n"
00
 01
 02
 03
 04
 05
 06
 07
 08
 09
 10
[root@buffes ~]# echo -e {00..10}"\n"|column -t
00
01
02
03
04
05
06
07
08
09
10
总结seq:
seq 10    #竖向打印序列
seq -w 10 #补全位数打印序列。
seq 起始 步长 结束 #打印奇数和偶数序列
步长为正数就是从小到大,否则从大到小。起始数字>结束数字
seq -w -s" " 10 #-s指定分隔符,横向打印序列


2)引用变量作为变量与普通字符的分隔
[root@buffes ~]# a=123
[root@buffes ~]# echo "I am$a岁了"
I am123岁了
[root@buffes ~]# 
[root@buffes ~]# echo "I am$ale"
I am
[root@buffes ~]# 
[root@buffes ~]# 
[root@buffes ~]# 
[root@buffes ~]# echo "I am${a}le"
I am123le


bash里特殊符号
名称	解释
&&	前一个命令执行成功,再执行后面一个命令
||	前一个命令执行失败,再执行后面一个命令
!	
1)在Bash中表示取反
2)在vi/vim中表示强制
3)!ls表示找出最近一次以ls开头的命令并运行



&& 并且的意思 and 前面正确,后面才输出

echo 123 && echo 456 #前面命令能正确输出,则打印456,否则不打印。

生产场景使用:
cd /etc/sysconfig/network-scripts/ &&\
tar zcf /tmp/ifcfg-eth0.tar.gz ./ifcfg-eth0
[root@buffes ~]# echo $? #验证命令是否执行成功,0表示成功,非0表示失败。
0

|| or或者 
前面错误,后面才输出
前面正确,后边不输出。
[root@buffes ~]# cho 123 || echo 456
-bash: cho: 未找到命令
456

作用:
[root@buffes ~]# echo adsfas||echo 1
adsfas
输出1,表示前面命令执行错误,否则,命令执行正确。


! 取反
[root@buffes ~]# ! cho 123 || echo 456
-bash: cho: 未找到命令

2.5 练习题

1)竖向打印a到z,共26个字母。
2)查找/下,包含.conf的所有文件,并打包,将压缩包备份到/opt下。
3)批量添加test01-test1010个用户,并设置对应数字密码。
4)横向打印1,4,7序列。
5)描述下单引号,双引号,反引号的含义。
6)使用cat命令将下面内容输入到文件test.txt里。
	http://www.etiantian.org
	http://bbs.etiantian.org
	http://www.etiantian.org
	http://blog.etiantian.org
	http://www.etiantian.org
	http://blog.etiantian.org
7)对题6的内容,统计域名出现的次数,并倒序排序。
8)题6中同时过滤包含bbs和blog字符串的行。
9)如何能让执行一个命令成功后再执行另一个命令?
10)把题6中的etiantian.org替换为buffes。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文