Linux 编程之权限系统与工具使用(二),【大牛系列教学】
tmpfs 933636 0 933636 0% /sys/fs/cgroup/dev/mapper/centos-home 19105792 33080 19072712 1% /home/dev/sda1 508588 177692 330896 35% /boot.host:/ 127927292 118371212 9556080 93% /mnt/hgfstmpfs 186728 12 186716 1% /run/user/42tmpfs 186728 0 186728 0% /run/user/0
因为我安装的是 centos7,所以我的系统文件系统是 xfs 类型,用 xfs_growfs 命令查看,如果文件系统是 ext2/ext3/ext4 可以用 dumpe2fs 命令查看指定分区详细文件系统信息。[root@localhost tmp]# xfs_growfs /dev/sda1meta-data=/dev/sda1 isize=256 agcount=4, agsize=32000 blks= sectsz=512 attr=2, projid32bit=1= crc=0 finobt=0 spinodes=0data = bsize=4096 blocks=128000, imaxpct=25
naming =version 2 bsize=4096 ascii-ci=0 ftype=0log =internal bsize=4096 blocks=853, version=2= sectsz=512 sunit=0 blks, lazy-count=1realtime =none extsz=4096 blocks=0, rtextents=0
查看系统是否支持 ACL,使用 dmesg 命令(可以帮助用户了解系统的启动信息,可以查看 ACL 信息)查看,发现 xfs 文件系统是默认支持 ACL 权限的。
查看 ACL 权限:
设定 ACL 权限:
setfacl 选项 文件名选项:
-m:设定 ACL 权限。
-x:删除指定的 ACL 权限。
-b:删除所有的 ACL 权限。
-d:设定默认的 ACL 权限。
-k:删除默认的 ACL 权限。
-R:递归设定 ACL 权限。
1.4、sudo 权限
sudo 是 linux 系统管理指令,操作对象是系统命令。是允许让普通用户执行部分或者全部的系统管理员才能执行的命令的一个工具,限制某个普通用户有限的命令有 root 权限(比如说重启,备份,添加用户,ifconfig 命令等)。sudo 执行时候不需要知道超级管理员的密码。
sudo 是超级用户赋予普通用户权限才能使用,sudo 为系统管理员提供配置文件,使用 visudo 命令(这个命令可以防止两个用户同时修改它,也能进行有限的语法检查)可以打开该配置文件:
[root@localhost ~]# visudo 这个命令实际是打开了/etc/sudoers 文件
Sudoers allows particular users to run various commands as
the root user, without needing the root password.
Examples are provided at the bottom of the file for collections
of related commands, which can then be delegated out to particular
users or groups.
... ...
在文件 98 行有个例子
格式解释: 用户名(给哪个用户赋予权限,这里是 root) 被管理的主机地址(第一个 ALL)= (可使用身份(第二个 ALL),这个可以省略直接跟授权的命令) 授权的命令(要写绝对路径,命令写的越简单权限就越大,越详细普通用户获得权限就越小)使用 man 5 sudoers 命令查看配置文件详细解释
普通用户没有关闭系统的权限,如下提示。
[song@localhost ~]$ shutdown -r now==== AUTHENTICATING FOR org.freedesktop.login1.reboot ===Authentication is required for rebooting the system.Authenticating as: rootPassword: Failed to execute operation: 连接超时 Must be root.polkit-agent-helper-1: pam_authenticate failed: Authentication failure
在配置文件中最后一行给 song 用户添加 shutdown 权限并保存
用 song 账号登录并用 sudo -l 命令显示出自己(执行 sudo 的使用者)的权限。
[song@localhost ~]$ sudo -l[sudo] password for song:匹配此主机上 song 的默认条目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATELC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARYLC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALLLANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin:/bin:/usr/sbin:/usr/bin
用户 song 可以在该主机上运行以下命令:(ALL) /sbin/shutdown -r now 这里 song 身份就被切换成 ALL
这里用 sudo 命令后面加配置文件赋予的命令去执行,不能写错,不然会执行不了,如下。
[song@localhost ~]$ sudo /sbin/shutdown -h now 对不起,用户 song 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/shutdown -h now。
所以写成配置文件里一模一样的就可以执行
[song@localhost ~]$ sudo /sbin/shutdown -r now
如果写多个可以用逗号分开
再看下
[song@localhost ~]$ sudo -l 匹配此主机上 song 的默认条目:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAMELANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin:/bin:/usr/sbin:/usr/bin
用户 song 可以在该主机上运行以下命令:(ALL) /sbin/shutdown -r now, (ALL) /sbin/ls
上面的例子是给某个用户赋予权限,当然我们也可以给一组用户赋予权限。也是在配置文件中
Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
上面 wheel 是组名,前面要加上 %号,其它设置和用户一样。
sudo 命令主要参数说明:
1.5、文件的特殊权限 SetUid & SetGid & Sticky BIT
linux 系统文件中除了读(r),写(w),执行(x)权限外,还有 s 和 t 这两个特殊的权限。当 s 这个标志出现在文件所有者的 x 权限上时,此时就被称为 SetUid(简称 SUID),当 s 出现在用户组(g)上就是 SetGid,当 s 出现在其他用户(o)上就是 Sticky Bit(简称 SBIT)。
SetUid 的功能:
只有可执行的二进制程序才能设定 SUID 权限,就是这个文件可以执行才可以设定,否则不起作用。命令执行者要对该程序拥有 x(执行)权限。命令执行者在执行该程序是获得该程序文件属主身份,打个比方,user1 用户没有 passwd 文件的读取权限,那么 user1 用户希望能看见 passwd 文件内容,只能将自己的身份添加到 passwd 文件所属的用户组,或 者是用 root 用户登录,或者就是修改 passwd 的文件权限,也就是 setuid 这个特殊的文件权限。SetUid 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
赋 SUID 权限方式:
数字赋予法:chmod 4755 文件名。
字母赋予法: chmod u+s 文件名 这里 s 就是 SUID 的意思,取消可以用 chmod u-s 文件名。
普通用户不能设置 SUID 权限。要用 root 用户执行。
[song@localhost ~]$ chmod 4755 /bin/vichmod: 更改"/bin/vi" 的权限: 不允许的操作
下面有个文件 aaa,并且用户对该文件拥有执行权限,我们去给该文件添加 SUID 权限。
红色箭头那里之前 x 变成了 s,表示 aaa 文件拥有了 s 权限,同时 aaa 文件也变成了红色,表示不安全。
如果要是用户对 aaa 没有执行权限呢。我们创建一个新文件 bbb,并修改其权限不包含执行权限。然后在赋予 SUID。
这里变成了大 S,这里大 S 表示不能正确使用的。
我们知道用户的密码是保存在/etc/shadow 文件中,我们看下这个文件的权限
[root@localhost tmp]# ll /etc/shadow---------- 1 root root 1696 5 月 27 18:58 /etc/shadow
发现这个文件的权限是 000,用户属主是 root,那么除了 root 用户能修改密码外,用户自己同样也能修改密码,为什么没有写入这个文件的权限去修改密码,这是因为这个 SUID 功能。我们看下 passwd 这个命令就知道原因了。
[root@localhost tmp]# which passwd/usr/bin/passwd[root@localhost tmp]# ll /usr/bin/passwd-rwsr-xr-x. 1 root root 27832 6 月 10 2014 /usr/bin/passwd
首先 passwd 命令是可执行的,同时发现 passwd 命令默认就有 SUID 权限,而且任何用户对这个命令也有执行权限(最后有 x),所以普通用户在执行这个命令的时候就会拥有这个命令所属主的身份,变成了 root,命令执行完后这个身份就消失了又变成普通用户。
系统还有其他的命令也包含 SUID 权限,比如 su 命令。
SUID 权限比较灵活,所以不能随意设置,不然会对系统造成潜在的危害。比如 vi 命令,如果添加 SUID 权限,那么普通用户获取 root 身份就可以修改所有的文件。
所以 SUID(也包括 SGID)权限原则:
关键的目录要严格控制写权限,比如根目录“/”,“/usr”目录等。用户的密码设置要严格遵守密码三原则(复杂性,易记性,时效性)。对系统中默认应该具有 SUID,SGID 权限的文件列表出来,定时检查有没有之外的文件被设置 SUID,SGID 权限。可以通过 find 命令查找。
[root@localhost tmp]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {} ; 04000 表示 SUID 02000 表示 SGID -o 表示或者的意思 find: ‘/proc/26739/task/26739/fdinfo/6’: 没有那个文件或目录 find: ‘/proc/26739/fdinfo/6’: 没有那个文件或目录-rwsr-xr-x 1 root 0 5 月 28 14:19 /root/tmp/aaa-rwSr--r-- 1 root 0 5 月 28 14:30 /root/tmp/bbb-rwsr-xr-x. 1 root 32584 6 月 10 2014 /usr/bin/fusermount-r-xr-sr-x. 1 tty 15344 6 月 10 2014 /usr/bin/wall-rwsr-xr-x. 1 root 64200 3 月 6 2015 /usr/bin/chage-rws--x--x. 1 root 23960 3 月 6 2015 /usr/bin/chfn-rws--x--x. 1 root 23856 3 月 6 2015 /usr/bin/chsh-rwsr-xr-x. 1 root 44232 3 月 6 2015 /usr/bin/mount-rwsr-xr-x. 1 root 32064 3 月 6 2015 /usr/bin/su-rwxr-sr-x. 1 tty 19536 3 月 6 2015 /usr/bin/write-rwsr-xr-x. 1 root 78168 3 月 6 2015 /usr/bin/gpasswd-rwsr-xr-x. 1 root 41752 3 月 6 2015 /usr/bin/newgrp
在上面我们新创建一个文件系统会根据 umask 的设置赋予新文件一个权限,那么 umask 的值是四位,如下:
[root@localhost ~]# umask0022
可是我们通过 chmod 命令给文件赋予权限一般都是三位数字,比如 755,644 等,那么这个 umask 后三位 022 是基本默认权限,第一位 0 就是特殊权限。
1.6、chattr 权限(不可改变位权限)
chattr 命令用于改变文件属性,只针对 root 用户有效。
格式:chattr [ + - = ] [选项] 文件或目录,这里的[ + - = ]是控制文件的属性。
: 增加权限。
: 删除权限。
= : 赋予/等于某权限。
常用选项:
i: 即 insert,不得任意更动文件或目录。
如果对文件设置 i 属性,那么不允许对文件进行删除,重命名,添加和修改数据,相当于锁定这个文件。如果对目录设置 i 属性,那么只能修改目录下的文件数据(文件数据保存在文件自己的数据块中),不允许建立和删除文件。a:即 append,让文件或目录仅供附加用途。
如果对文件设置 a 属性,只能在文件中添加数据(因为 vi 被禁用了,所以用 echo >> 输出重定向追加的方式),不能删除也不能修改数据。如果对目录设置 a 属性,那么只允许在目录中新建和修改文件,不允许删除文件,可以适用于各种日志文件。
案例:
给文件添加 i 属性
[root@localhost tmp]# chattr +i aa.txt[root@localhost tmp]# lsattr aa.txt 用 lsattr 命令查看----i----------- aa.txt
不允许删除
[root@localhost tmp]# rm -rf aa.txtrm: 无法删除"aa.txt": 不允许的操作
给目录添加 i 属性
[root@localhost tmp]# chattr +i dir[root@localhost tmp]# lsattr -d dir----i----------- dir[root@localhost tmp]# cd dir[root@localhost dir]# touch a.txttouch: 无法创建"a.txt": 权限不够
1.7、Linux 常用权限
1.600(rw------):只有 root 有读写权限。
2.644(rw-r--r--):只有 root 有读写权限;group 用户和 other 用户只有读权限。
3.755(rwxr-xr-x):root 有读、写、执行权限;group 用户和 other 用户只有读、执行权限。
二、Linux 下 Vim 工具使用介绍
所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
什么是 vim?Vim 是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
简单的来说,vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。vim 则可以说是程序开发者的一项很好用的工具。
连 vim 的官方网站(http://www.vim.org)自己也说 vim 是一个程序开发工具而不是文字处理软件。
vim 键盘图:
vi/vim 的使用:基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:命令模式:用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符。比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。以下是常用的几个命令:i:切换到输入模式,以输入字符。x:删除当前光标所在处的字符。::切换到底线命令模式,以在最底一行输入命令。若想要编辑文本:启动 Vim,进入了命令模式;按下 i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式:在命令模式下按下 i 就进入了输入模式。在输入模式中,可以使用以下按键:字符按键以及 Shift 组合,输入字符;ENTER,回车键,换行;BACK SPACE,退格键,删除光标前一个字符;DEL,删除键,删除光标后一个字符;方向键,在文本中移动光标;HOME/END,移动光标到行首/行尾;Page Up/Page Down,上/下翻页;Insert,切换光标为输入/替换模式,光标将变成竖线/下划线;ESC,退出输入模式,切换到命令模式;
底线命令模式:在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。在底线命令模式中,基本的命令有(已经省略了冒号):q:退出程序;w:保存文件;按 ESC 键可随时退出底线命令模式。
简单的说,我们可以将这三个模式想成底下的图标来表示:
vi/vim 使用实例:使用 vi/vim 进入一般模式:如果你想要使用 vi 来建立一个名为 runoob.txt 的文件时,你可以这样做:$ vi runoob.txt 直接输入 vi 文件名就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加文件名,不管该文件存在与否!
按下 i 进入输入模式(也称为编辑模式),开始编辑文字。在一般模式之中,只要按下 i、o、a 等字符就可以进入输入模式了!在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。
这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。
按下 ESC 按钮回到一般模式。好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角的– INSERT –不见了!
评论