前言:
如今你们对“linux中的超级用户”大体比较看重,咱们都想要剖析一些“linux中的超级用户”的相关资讯。那么小编在网摘上搜集了一些有关“linux中的超级用户””的相关知识,希望同学们能喜欢,你们快快来学习一下吧!早期的计算机智能通过纸条打孔输入程序,让计算机执行任务,所以打孔得排队,人们都希望计算机能够同时处理多个用户的命令,因此才有了 Unix 的诞生,每个人都登录到一个 Unix 的机器上,执行自己的任务,最前面我们知道可以输入 w 来查看系统登录的其他用户。怎么为其他人新建一个他自己的用户呢? 可以使用 useradd 命令,如果希望为这个用户建立一个 home 目录,则需要带上 -m 参数。试一试,但是发现报错了。
wangbo@wangbo-VirtualBox:~$ useradd -m zhangsanuseradd: Permission denied.useradd: cannot lock /etc/passwd; try again later.
因为新建用户需要写入 /etc/passwd 文件,而该文件是 linux 系统的核心文件,只有超级用户才能写入,我们在前面加上 sudo 再次新建,系统可能会提示你输入当前用户的密码,sudo 的意思是以管理员的身份来执行密码(试试 sudo whoami),在 /etc/suoders 文件的最后面可以加入 wangbo ALL=(ALL) NOPASSWD: ALL 来取消每次使用 sudo 都需要密码的不变性,那么怎么修改这个文件呢? 千万不要直接打开这个文件,请使用 sudo visudo,默认情况下系统会用 nano 编辑器来打开 /etc/suoders 文件,修改完成后按 ctrl + x 退出,输入 y 确认保存;也有可能系统是用 vi 编辑器来打开,关于 vi、vim 的知识请点击快速学 vim 教程。
请注意命令带上 sudo 就是以管理员的身份来执行命令,通过 mkdir 的小实验来看看,使用 sudo mkdir 建立的文件夹,它的用户和用户组默认都是 root,root 是 linux 里的超级用户,默认情况下,工程师都不会用 root 登录系统去操作。
wangbo@wangbo-VirtualBox:~/test$ mkdir normalwangbo@wangbo-VirtualBox:~/test$ sudo mkdir specialwangbo@wangbo-VirtualBox:~/test$ ls -ltotal 8drwxrwxr-x 2 wangbo wangbo 4096 12月 10 17:27 normaldrwxr-xr-x 2 root root 4096 12月 10 17:27 special
好了,回到正题,现在给张三建立一个账号,并且确认张三的主目录确实存在,使用 passwd 命令给 zhangsan 分配初始密码。
wangbo@wangbo-VirtualBox:~/test$ sudo useradd -m zhangsanwangbo@wangbo-VirtualBox:~/test$ ls -l /home/zhangsan/total 0wangbo@wangbo-VirtualBox:~/test$ cat /etc/passwd | grep zhangsanzhangsan:x:1001:1001::/home/zhangsan:/bin/sh
每个用户都隶属于一个用户,可以使用 id 命令来查看用户的组信息,可以使用 su zhangsan 切换到 zhangsan 用户,相当于用 zhangsan 的用户登录了系统,如果张三对你不好,你可以用他的身份做点不好的事情,如果和张三的感情彻底破裂了,可以使用 sudo userdel zhangsan 删除他。想要切换自己的账户,输入 exit 命令,不确定的话,别忘了 whoami 命令。
wangbo@wangbo-VirtualBox:~/test$ id zhangsanuid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan) wangbo@wangbo-VirtualBox:~/test$ su zhangsanPassword:$$ pwd/home/wangbo/test$ cd ~$ pwd/home/zhangsan // 这是张三的主目录了$ whoamizhangsan$ exit // 退出了 zhangsan 的身份wangbo@wangbo-VirtualBox:~/test$ whoamiwangbo // 还是做回自己好
如果 zhangsan 在自己的主目录下新建一个文件,使用 ls -l 可以看到默认的权限。
$ touch myfile.txt$ ls -ltotal 0-rw-rw-r-- 1 zhangsan zhangsan 0 12月 10 17:56 myfile.txt
-rw-rw-r-- // 第一个 - 表示是普通文件,接下来 rw- 表示用户 zhangsan 的权限,再接下来 rw- 表示用户组 zhangsan 其他用户成员的权限,最后 r-- 表示其他用户
r=read w=write x=execute,rw表示读写,rwx表示读写执行,作为其他用户只有 r 权限,尝试对他写入内容会报没有权限的错误。
wangbo@wangbo-VirtualBox:~$ ls -l /home/zhangsan/test/myfile.txt-rw-rw-r-- 1 zhangsan zhangsan 16 12月 10 18:04 /home/zhangsan/test/myfile.txtwangbo@wangbo-VirtualBox:~$ cat /home/zhangsan/test/myfile.txt我是张三的wangbo@wangbo-VirtualBox:~$ echo try to hack > /home/zhangsan/test/myfile.txt-bash: /home/zhangsan/test/myfile.txt: Permission denied
用户 zhangsan 如果希望其他用户可以对文件进行写入,可以使用 chmod 命令,执行完后最后一段由 r-- 变为了 rw-,其中 o 的含义是 others,类似的还有 a 和 u,a 表示所有用户,u 表示用户组,所以 chmod a+w 就是为所有用户增加 w 权限,chmod a-w 就是为所有用户删除写入权限。
zhangsan@wangbo-VirtualBox:~/test$ chmod o+w myfile.txtzhangsan@wangbo-VirtualBox:~/test$ ls -ltotal 4-rw-rw-rw- 1 zhangsan zhangsan 16 12月 10 18:04 myfile.txt
现在其他用户可以修改 zhangsan 的文件了。
wangbo@wangbo-VirtualBox:~$ echo try to hack > /home/zhangsan/test/myfile.txt
张三去掉所有用户的权限后,权限位显示为 r-- r-- r--,也就是所有人都能读,但都不能写入,连 zhangsan 自己也不能写入,可以重新执行 chmod a+rw 皆大欢喜。
zhangsan@wangbo-VirtualBox:~/test$ chmod a-w myfile.txtzhangsan@wangbo-VirtualBox:~/test$ ls -latotal 12drwxrwxr-x 2 zhangsan zhangsan 4096 12月 10 18:04 .drwxr-xr-x 3 zhangsan zhangsan 4096 12月 10 18:04 ..-r--r--r-- 1 zhangsan zhangsan 12 12月 10 18:16 myfile.txtzhangsan@wangbo-VirtualBox:~/test$ echo fix it > myfile.txtbash: myfile.txt: Permission denied
同理,你会看到 chmod +rw、chmod +x、chmod o+x 等等很多用法,但更多的是 chmod 755 myfile.txt 这种形式,这是什么鬼?
755 三个数字分别代表文件隶属用户的权限、用户组的权限、其他用户的权限,那么 7 和 5 怎么来的呢? 简单,Unix 的缔造者说来,让 r=4 w=2 x=1,7 就是 rwx 读写执行,5 就是 rx 读执行,这种说法很不严谨,但你现在可以这么简单理解。那么 chmod 666 myfile.txt 啥意思呢? 双击666,不对。6 就是 rw,666 意思就是文件所有者、文件用户组、其他用户都可以读和写文件,用 ls -l 确认一下,文件的全线显示为 rw- rw- rw-。
zhangsan@wangbo-VirtualBox:~/test$ chmod 666 myfile.txtzhangsan@wangbo-VirtualBox:~/test$ ls -ltotal 4-rw-rw-rw- 1 zhangsan zhangsan 12 12月 10 18:16 myfile.txt
把 755 和 666 都说清楚了,其他的数字你可以自己推理了,比如 644 表示什么? 但是更诡异的,你还会看到 chmod 4755,不是说了三个数字吗? 不讲武德。先建立一个可执行文件,为它加上 +x 执行权限。
zhangsan@wangbo-VirtualBox:~/test$ chmod +x printdate.shzhangsan@wangbo-VirtualBox:~/test$ ls -l printdate.sh-rwxrwxr-x 1 zhangsan zhangsan 5 12月 10 18:30 printdate.shzhangsan@wangbo-VirtualBox:~/test$ ./printdate.sh2020年 12月 10日 星期四 18:31:21 CST
学习方法最重要,我们先给他来个 chomd 4755 看看有什么变化?
zhangsan@wangbo-VirtualBox:~/test$ chmod 4755 myfile.txtzhangsan@wangbo-VirtualBox:~/test$ ls -latotal 16drwxrwxr-x 2 zhangsan zhangsan 4096 12月 10 18:30 .drwxr-xr-x 3 zhangsan zhangsan 4096 12月 10 18:30 ..-rwsr-xr-x 1 zhangsan zhangsan 12 12月 10 18:16 myfile.txt // 虽然 myfile.txt 不是可执行文件,也加上了 s 权限位-rwxrwxr-x 1 zhangsan zhangsan 5 12月 10 18:30 printdate.sh
我们发现第一节的权限位显示为 rws,出现了一个 s,这个位叫做 suid,suid 的作用是让其他用户在执行文件的时候具有和文件所有者相同的权限,由于脚本的杀伤力很大,很多类 Unix 系统会忽略脚本的 s 位,只对二进制执行文件生效。
zhangsan@wangbo-VirtualBox:~/test$ chmod 4755 printdate.shzhangsan@wangbo-VirtualBox:~/test$ ls -ltotal 8-rwsr-xr-x 1 zhangsan zhangsan 12 12月 10 18:16 myfile.txt-rwsr-xr-x 1 zhangsan zhangsan 5 12月 10 18:30 printdate.sh // 脚本也有 s 权限位了,别人在执行的时候相当于有 zhangsan 的访问权限
为什么会有这种需求? 下面2个例子帮助你理解。
第一: 网络设备管理是系统的核心,root 超级用户写了上网的程序,其他用户也要上网,但是其他用户运行上网的程序时,程序还要访问一堆核心的配置文件,这些文件只有 root 才能访问,所以 o+x 后其他用户可以运行程序,但还是无法上网,所以加 s 后,其他用户运行程序的时候就具有和 root 用户一样的权限了,也可以访问核心文件,从而上网了。
第二:每个用户都可以运行 passwd 命令修改自己的密码,但是 /etc/passwd 是系统的核心文件,你不能说每次改自己的密码都需要 root 用户帮你改吧,大家都是有隐私的对吧,怎么办呢? 使用 suid 机制,通过学过的知识验证一下。
zhangsan@wangbo-VirtualBox:~/test$ which passwd/usr/bin/passwdzhangsan@wangbo-VirtualBox:~/test$ ls -l /usr/bin/passwd-rwsr-xr-x 1 root root 68208 5月 28 2020 /usr/bin/passwd
发现 passwd 这个文件,天生具有 s 权限位,所以 s 是必须的存在,不存在 linux 用户系统无法工作,明白? 但请记住,给文件 s 权限位是非常危险的,一定要知道被授权的可执行文件究竟是在干什么事情。
和文件权限有关的还有2个重要的命令,一个是 chgrp 修改文件的用户组,一个是 chown 修改文件的所有者和用户组,chown 有个 -R 参数,表示递归修改子目录,非常重要,赶紧去试试吧。
说了这么多次用户组,用户组从来哪里来呢? 和 user 类似,有 groupadd、groupdel、groupmod 等命令,修改用户所属的用户组,需要用到 usermod 命令,使用 -G 参数,移除用户的组使用 gpasswd,如果你已经看到了这里,你已经可以自学这些命令了,学习的时候,不要怕把系统搞坏,随便折腾。
wangbo@wangbo-VirtualBox:~$ sudo groupadd testgroupwangbo@wangbo-VirtualBox:~$ sudo usermod -G testgroup zhangsanwangbo@wangbo-VirtualBox:~$ id zhangsanuid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),1002(testgroup)wangbo@wangbo-VirtualBox:~$ sudo gpasswd -d zhangsan testgroupRemoving user zhangsan from group testgroupwangbo@wangbo-VirtualBox:~$ id zhangsanuid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)wangbo@wangbo-VirtualBox:~$ sudo groupdel testgroup
标签: #linux中的超级用户 #linux中的超级用户为