土豆不好吃

rm –rf /, dd, chmod, sudoers和root权限的一些小事

这篇文章在 2016年12月30日21:59:40 更新了哦~

预先警告一下,这些命令都是十分危险的,请不要在自己的电脑上尝试!

话说几个星期前,圈里爆出来这么一个事:一名Arch用户尝试使用rm –rf /删除已有的arch然后重装,结果这条命令却成功的毁了他的固件。rm删掉了/sys/firmware/efivars的内容……

更详细的讨论可以看这里:

https://www.reddit.com/r/linux/comments/43ls7j/no_post_after_rm_rf_systemd_uefi/


传说中Linux是怎么自杀的,就是用的rm –rf /,递归强制删除根目录下所有文件和目录。当然要root权限才能干这个事,Ubuntu还要加--no-preserve-root参数。

sudo rm -rf --no-preserve-root /

可以看到左侧的dock没了,语言支持没了,ls、rm等在命令没了(因为/usr/bin,/sbin都被删掉了)。唯一还在的是bash内建命令……关了此终端之后,就彻底game over了。


除此之外还有dd,dd是一个很强大的命令,裸读写,把指定的输入文件拷贝到指定的输出文件中,而且可以无视文件系统。if(此处不是如果,而是infile)指定来源,of指定目的,常常用它来备份文件或者制作镜像。但是这个命令如果滥用下…

dd if=/dev/zero of=/dev/sda
/dev/zero是啥?
/dev/zero是Linux的一个"伪文件",它会提供连续不断的null,要多少有多少。比如说初始化文件的时候。
类似的有个/dev/null,这家伙外号"无底洞"、"黑洞",什么东西放进去都没了,而且永远不会吃撑,比如说某些命令的输出结果就可以给它吃掉

这句话的意思是,读取0放到sda里……直接抹掉硬盘的内容。

而且更可怕的是,假想这种情况:某人双硬盘(sda,sdb),想把某个iso写到U盘上(sdc),结果一不小心就写成了of=sdb,恰巧sda是Linux的/所在磁盘,于是乎……和数据说拜拜,这里连root权限都没用上。

dd前要三思啊!要把of看三遍啊!使劲用df看磁盘信息啊!


还有一个神级蛋疼的命令,chmod,用于改变文件的权限。和rm类似以下,sudo chmod –R 777 /,此命令会将递归的将/下所有文件的权限都设置成777(设置成000会更酸爽)。乍一看好像没什么,文件都还在。但是,Linux是一个权限管理比较严格的系统,有些文件是需要正确权限才可以运行的,像ssh,sudo等。

那三个数字是什么意思?
4读 2写 1执行,第一个数字表示属主(文件的所有者,文件的主人,谁创建的),第二个数字表示同组用户,第三个数字表示其他用户。当然,这里的"其他用户"不包括root,因为root拥有一切权限。775的意思就是,属主可以读写执行(4+2+1=7),同组可以读写执行,其他用户只可以读和执行。

这是chmod –R 000/的后果,失去了对一切文件的访问权限,当前的终端都没了,壁纸都没了!要远比777可怕的多。此时唯一的解救方法就是用liveCD重新改权限了。

再次警告下,这些命令十分危险,如要尝试请在和宿主机完全隔离的虚拟机上进行。完全隔离的意思就是,别装VMTools那类工具!

可是问题来了,这些命令这么危险,为什么还要存在呢?

其实这只是一种滥用,或者说是一时疏忽大意造成的灾难性后果。

rm –rf /*(因为带了r参数,所以此时/*和/含义并无区别)更多情况下是对rm –rf ./*的误打。注意后一个命令在/之前
有个.,Linux中./表示当前目录,所以这句话的意思的删除当前目录下的所有文件和文件夹。很常见的一个操作了。

chmod也是一样,chmod –R 777 ./*改变当前目录下所有文件目录的权限为777。


可是这些事情本不该发生的,哪怕少打了一个.也不至于如此(更何况Ubuntu在rm –rf /时还要加上--no-preserve-root)。为什么我们却看到了如此多的惨案呢?那是因为他们使用了root权限!

root权限就是上帝,无所不能。这也是很多书籍都强烈建议使用普通权限的用户,需要root时用sudo暂时提权到root的原因。

提到sudo,也就要提到sudoers了。比如说你新添加了一个用户给别人用,但是他也需要使用到root权限,可是常使用root权限太危险了,那我就给他sudo吧!

创建用户benny,设置密码

sudo useradd benny
sudo passwd benny

输入benny用户的密码。

然后切换到benny,ls下/root

su benny
sudo ls /root

(root用户的家目录/root只有root才可以访问,我们可以在此测试下是否提权到root了)

天啊,好害怕,竟然还打小报告!

这是为什么,因为你新建的用户名没在sudoers里,/etc/sudoers定义了用户的权限,当然包括是否可以提权了。sudoers为440权限,属主可以读,同组可以读,其他人无权限。这也就是说,只有root才可以编辑。编辑就是写,权限2)此文件。

好学的小伙伴可能会上网搜索sudoers,其中很多文章建议先chmod成777权限,编辑,然后在改回440权限。但是我强烈建议不要这么做!为什么!一是因为对新手来说,很容易没办法改回权限;二是因为脱裤子放屁。

sudo只有在440权限的时候才可以使用,如果你现在是普通用户,看到那篇文章可能修改sudoers权限为777,于是你的命令是

sudo chmod 777 /etc/sudoers

777权限你的用户就可以编辑了,编辑完,当你再想改回权限时

sudo chmod 440 /etc/sudoers

会发现这么提示:

任何sudo都会这么提示

你再也没办法使用sudo了!如果你使用的是Ubuntu等系统,那就更悲剧了,因为Ubuntu默认的root用户默认是被禁用的。。这也就意味着当你输入su试图切换到root时永远也无法输入正确的密码。这也就是在说你需要liveCD才能当上帝了。

正确的办法是sudo –s永久切换到root,然后再改权限……

可是问题来了,既然都是root了,还改权限干嘛啊!直接nano得了呗!脱裤子放屁干嘛啊!

可可是,用文本编辑器修改sudoers是不科学的,假如你写错了,编辑器又不会提示你任何错误。

但是当你sudo的时候……

一样的悲剧。

如果你看了sudoers文件,注意到最上面的注释,会看到这么一句:

此文件必须使用"visudo"命令以root身份编辑。

用visudo的万无一失的,假如你不小心弄出了语法错误(此处的“万无一失”是指的不作死):

visudo提示有语法错误,并且依旧有重新编辑的机会!还有后悔药!

如果没有语法错误,visudo会正常退出。

当然请不要作死给Allow members of group sudo to excute any command注释了……

因为visudo只会检查语法错误。


 

说了这么多废话,正确创建一个用户benny、给它提权到root的方法如下:

创建用户

sudo useradd benny
sudo passwd benny

两次确认给benny设置密码

执行visudo

sudo visudo

在Allow members of group sudo to excute any command下仿造上面一行添加:

benny ALL=(ALL:ALL) ALL

ctrl + x退出保存。

其实仿造admin那个写也可以,我暂时还没搞懂少一个:ALL有何影响。

切换到新创建的benny用户

su benny

测试权限

sudo ls /root

没有提示Permission denied.

如果没有权限,应该是这样提示的:


文章版权归原作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权|
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/rm-dd-chmod-sudoers-root.html
退出移动版