程序员的知识教程库

网站首页 > 教程分享 正文

怎样让chmod安全起飞?alias,find命令为你插上翅膀

henian88 2024-09-09 03:46:56 教程分享 9 ℃ 0 评论

chmod 基本概念

  • chmod是一个GNU实用程序,在Linux发行版中作为coreutils rpm的一部分提供。
  • chmod是“Change Mode”的简写。
  • chmod根据模式更改每个给定文件/目录的文件模式位。
  • 用户可以使用符号表示更改,也可以使用八进制数标识的位模式表示新模式位。
  • 符号模式的格式为:[ugoa...][[-+=][perms...]...]。其中perms可以为0,或者rwxXst其中的字符。
  • 用户也可以添加、修改、删除特殊权限,例如 setuid, setgid, sticky bit。

chmod的防止删库跑路参数: --preserve-root

最好是所有的chmod都使用--preserve-root参数。
特别是在递归修改文件属性的时候,这个参数尤为重要。
为什么呢?这里必须要划重点:防止误操作根路径/。下面的操作在任何时候都不要执行,会直接摧毁操作系统:

# chmod --changes --recursive 755 /

上面的操作,和执行“rm -rf /”有类似的功效。
如果在执行命令时,添加参数--preserve-root,程序就会拒绝执行。

问题来了,不是每个人都会记得添加这个参数,也不会有人在每次执行chmod的时候都记得添加这个参数。怎么办呢?
我们可以使用alias,修改chmod的命令默认带参数--preserve-root。

alias chmod='chmod --preserve-root'

当然,可以在/etc/bashrc 或者 用户的.bashrc文件中添加此命令。

一个小知识点:bashrc,.bashrc,.bash_profile 什么关系?

环境变量一般通过三个文件设置:/etc/profile,bashrc, ~/.bash_profile.

  • /etc/profile对所有用户生效。当用户登录时,文件会被执行。
  • bashrc用于配置函数或别名,对shell生效,在shell终端启用的时候调用。不管是否登录。分为两个,一个是系统级的:/etc/bashrc,一个是用户级的:~/.bashrc.
  • ~/.bash_profile在用户登录的时候调用。只对一个用户生效,可用于配置环境变量和启动程序。
    一般来说,没啥事可以修改~/.bash_profile

linux权限映射关系

权限

八进制

符号

read+write+execute

4+2+1=7

rwx

read+write

4+2+0=6

rw-

read+execute

4+0+1=5

r-x

read

4+0+0=4

r--

write+execute

0+2+1=3

-wx

write

0+2+0=2

-w-

execute

0+0+1=1

--x

chmod 递归修改文件权限

如果想要修改文件夹下所有的文件权限,且目标权限是一致的,可以使用-R 或者 --recursive 参数。
为了明确哪些文件的权限发生了变化,最好添加另外一个参数:--changes或者-c
命令格式:

chmod [--changes|-c] {--recursive|-R} {PATH}

示例:

drwxr-xr-x 2 yunzhong yunzhong 4096 Nov 17 11:01 dir2
yunzhong@DESKTOP-9VB7LN7:/tmp/chmodtest$ chmod -c -R 775 ./dir1/
mode of './dir1/' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of './dir1/friutes.txt' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of './dir1/test.file' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of './dir1/dir11' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)
mode of './dir1/dir11/friutes.txt' changed from 0755 (rwxr-xr-x) to 0775 (rwxrwxr-x)

上面的例子,文件夹dir1的权限也被更改了。如果不想修改参数文件夹的权限,只是修改其子文件的权限,可以通过以下命令:

yunzhong@DESKTOP-9VB7LN7:/tmp/chmodtest$ chmod -c -R 755 ./dir1/*
mode of './dir1/dir11' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of './dir1/dir11/friutes.txt' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of './dir1/friutes.txt' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)
mode of './dir1/test.file' changed from 0775 (rwxrwxr-x) to 0755 (rwxr-xr-x)

在上面的示例中,我们都是通过八进制来标识权限,也可以通过符号标识来标识权限。符号标识的意义,以及和八进制的映射关系,可以参考上面的表格。
示例:

yunzhong@DESKTOP-9VB7LN7:/tmp/chmodtest$ chmod -c -R u+rx,g+rx,o-rwx ./dir1
mode of './dir1' changed from 0775 (rwxrwxr-x) to 0770 (rwxrwx---)
mode of './dir1/friutes.txt' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---)
mode of './dir1/test.file' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---)
mode of './dir1/dir11' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---)
mode of './dir1/dir11/friutes.txt' changed from 0755 (rwxr-xr-x) to 0750 (rwxr-x---)

使用find 和exec协助修改文件权限

为何要使用find和exec协助?

1 上面的示例会更改一个文件夹下的文件、文件夹属性。如果需要修改多个文件夹下的文件或文件夹,则需要多次执行chmod命令。
2 chmod不能区分文件和文件夹。如果只想更改子文件夹,或者子文件,只使用chmod命令是做不到的。
3 类似地,如果您想更改特定命名语法的某些文件或目录的权限,chmod自己不能处理这样的情况。

因此,需要使用find命令过滤需要修改的文件、文件夹。
chmod不能直接接收find的过滤结果,需要通过使用exec或者xargs对接信息。
使用了find,chmod命令不再需要--recursive 或者 -R 参数。find的结果会逐条传递给chmod。

使用find exec配合chmod修改权限

find命令语法:

find {PATH} [OPTIONS] -exec chmod <permission> {} \;

PATH 是目标文件夹。
OPTIONS 是find命令的参数。例如通过类型搜索用-type, 通过名称搜索用-name。
注意结尾:{} ; 。 这个是必不可少的,{}表示命令的参数即为所找到的文件,命令的末尾必须以“ ;”结束,”{}”和”;”之间必须有一个空格。
示例:

yunzhong@DESKTOP-9VB7LN7:/tmp$ find /tmp/chmodtest/ -type f -exec chmod --changes 644 {} \;
mode of '/tmp/chmodtest/dir1/friutes.txt' changed from 0750 (rwxr-x---) to 0644 (rw-r--r--)
mode of '/tmp/chmodtest/dir1/test.file' changed from 0750 (rwxr-x---) to 0644 (rw-r--r--)
mode of '/tmp/chmodtest/dir1/dir11/friutes.txt' changed from 0750 (rwxr-x---) to 0644 (rw-r--r--)

当然,也可以使用符号来修改权限:

yunzhong@DESKTOP-9VB7LN7:/tmp$ find /tmp/chmodtest/ -type f -exec chmod --changes u=rxw,go=r {} \;
mode of '/tmp/chmodtest/dir1/friutes.txt' changed from 0644 (rw-r--r--) to 0744 (rwxr--r--)
mode of '/tmp/chmodtest/dir1/test.file' changed from 0644 (rw-r--r--) to 0744 (rwxr--r--)
mode of '/tmp/chmodtest/dir1/dir11/friutes.txt' changed from 0644 (rw-r--r--) to 0744 (rwxr--r--)

只修改文件夹的属性:

yunzhong@DESKTOP-9VB7LN7:/tmp$  find /tmp/chmodtest/ -type d -exec chmod --changes 755 {} \;
mode of '/tmp/chmodtest/dir1' changed from 0770 (rwxrwx---) to 0755 (rwxr-xr-x)
mode of '/tmp/chmodtest/dir1/dir11' changed from 0750 (rwxr-x---) to 0755 (rwxr-xr-x)

使用find xargs配合chmod修改权限

和exec类似,通过xargs将find结果传递给chmod。
命令格式:

find {PATH} [OPTIONS] -print0 | xargs -0 [COMMAND]

-print0 让find的结果打印到标准输出, 每个结果都通过 ASCII NUL 字符: ‘\000’分割。
-0 告知xargs每个输入都通过ASCII NUL 字符: ‘\000’ 来分割。
下面示例,将指定文件夹下的属性都改成644:

# find /tmp -type f -print0 | xargs -0 chmod --changes 644

同样,也可以通过符号。

yunzhong@DESKTOP-9VB7LN7:/tmp$ find /tmp/chmodtest/ -type f -print0 | xargs -0 chmod --changes u=rxw,go=rxw
mode of '/tmp/chmodtest/dir1/friutes.txt' changed from 0766 (rwxrw-rw-) to 0777 (rwxrwxrwx)
mode of '/tmp/chmodtest/dir1/test.file' changed from 0766 (rwxrw-rw-) to 0777 (rwxrwxrwx)
mode of '/tmp/chmodtest/dir1/dir11/friutes.txt' changed from 0766 (rwxrw-rw-) to 0777 (rwxrwxrwx)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表