shell 脚本-运算符(文件测试运算符)
文件测试符
操作符 | 说明 |
---|---|
-r | 检测文件是否可读, 可读返回 true |
-w | 检测文件是否可写, 可写返回 true |
-x | 检测文件是否可执行, 可执行返回 true |
-s | 检测文件是否为空, 为空返回 false |
-d | 检测文件是否为目录, 为目录返回 true |
-e | 检测文件是否存在, 存在返回 true |
-b | 检测文件是否是块设备文件,如果是,则返回 true。 |
-c | 检测文件是否是字符设备文件,如果是,则返回 true。 |
-f | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是则返回 true。 |
-g | 检测文件是否设置了 SGID 位,如果是,则返回 true。 |
-u | 检测文件是否设置了 SUID 位,如果是,则返回 true。 |
-k | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-p | 检测文件是否是有名管道,如果是,则返回 true。 |
demo
file="/xxx/xxx/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -d $file ]
then
echo "文件为目录"
else
echo "文件不是目录"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
设备文件
简单来说就是负责处理硬件设备相关工作的文件, 设备文件
本身可以获取特定的设备资源, 可以为其他设备提供简单的接口.
字符设备文件
和块设备文件
区别在于, 操作系统和硬件设备如何向他们读写数据.
字符设备是指每次与系统传输 1 个字符的设备;
块设备是指与系统间用块的方式移动数据的设备. 系统向其写入数据是通常把数据存入一块缓冲区,在缓冲区存满是, 再把整块数据传入.
命名管道
命名管道是计算机进程间的一种先进先出通信机制。是类 Unix 系统传统管道的扩展。传统管道属于匿名管道,其生存期不超过创建管道的进程的生存期。但命名管道的生存期可以与操作系统运行期一样长。
与传统的无名的 shell 管道不同,命名管道利用了文件系统。使用 mkfifo()[1]或 mknod()[2]创建命名管道。两个进程可以通过管道的名字打开、读写管道。
参考 维基百科
SGID 和 SUID
了解 SGID 和 SUID 前需要了解一下 unix 权限的表示方式
unix 系统十位文件权限表示方法
UNIX 下可以用 ls -l 命令来看到文件的权限。用 ls 命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位, 从左到右 1~10 位分别代表:
第一位
表示文件类型
可能值 | 说明 |
---|---|
- | 表示普通文件 |
d | 表示目录文件 |
p | 表示管道文件 |
l | 表示连接文件 |
s | 表示 socket 文件 |
c | 表示字符设备文件 |
b | 表示块设备文件 |
第 2~4 位
表示文件的读写权限, 如果没有相应条件,则为 -
例如: rwx 表示具有读写和执行权限, rw- 表示具有读写权限, 但是没有执行权限
第 5~7 位
与 2~4 位类似,2~4 表示的权限指的是所有者的权限, 而 5~7 表示对应群组对该文件的权限
第 8~10 位
与前两个类似,8~10 表示其他群组对该文件的权限
SGID 和 SUID
SGID
和 SUID
分别是 set group id
和 set use id
当权限的第 4 位为 s
时, 我们称这个文件设置了 SUID
当权限的第 7 位为 s
时, 我们称这个文件设置了 SGID
SGID
和 SUID
都是针对执行文件的, 对非执行文件没有意义
SGID
和 SUID
的作用
可以使用户在执行该文件使临时获得所有者权限, 简单来说就是可以让本来没有权限的用户执行该文件
SUID
的权重要大于 SGID
Sticky Bit
黏着位
又称 黏滞位
. 设置 Sticky Bit
的文件或目录, 只有文件所有者或 root 用户才能删除或移动该文件, 用来防止文件被普通用户删除或移动其他用户的文件