【原】记一次找回mac root账号的苦逼经历

时间:2022-09-15 21:10:21

缘起

之前我在mac上自己搞了个shell脚本,一条龙完成svn代码更新、打包、应用部署、jboss启动等动作,但是在unix环境下有一条法律:1024以下的端口都是保留给root用户使用的,这样我以自己的账号起web服务器想占用80端口岂不捉急。。。之前在网上找到一个方法,利用ipfw做端口转发,jboss http服务端口仍保留8080,通过ipfw将所有发往80端口的请求都转发到8080端口,配置如下:

    sudo ipfw del 60000
    sudo ipfw add 60000 fwd 127.0.0.1,8080 tcp from any to any 80 in

将如上命令放在我的ssh自动部署脚本里,大功告成~但是有一个问题,可以看到ipfw需要sudo执行权限,每次很爽的运行脚本时,都要暂停以下愉快心情,输入一次密码。于是某日晚上,我就上网找绕过sudo密码输入的方法。。。

中招

很快就找到一个解救方法,大致思路是修改sudo的配置文件/etc/sudoers,其中支持将某个用户配置为sudo执行命令无需密码输入(甚至可以针对指定命令做到这一点)。其中将我带沟里的就是如下这一段:

【原】记一次找回mac root账号的苦逼经历

依葫芦画瓢,我通过sudo visudo将自己的/etc/sudoers修改如下:

    #User privilege specification
    root    ALL=(ALL) ALL
    yangchuan ALL = NOPASSWD : yangchuan ALL = NOPASSWD: /sbin/ipfw
    #%admin  ALL=(ALL) ALL

保存退出,悲剧就此开始。此时我发现配置的确生效了,而且我发现sudo现在只能执行唯一一个命令就是ipfw ,其它命令都不能执行,其实刚才的配置中本来指定了允许admin组在所有主机上执行所有sudo命令,但是。。。我刚才把它注掉了。此时,为需要干的就是把sudoers文件恢复回来,现在作茧自缚sudo是不能用了,那直接走root用户把,悲剧的是我死活想不起来root密码了,试遍所有密码之后仍无法登陆到root,当时脑子要炸了,搜遍网上所有资料关于“如何找回root密码”,很多人说要用原厂OSX安装光盘启动,那里有初始化root密码的功能,但是找到mac纸盒一翻,没有光盘啊。。。上网一查才知,lion之后mac都已经不带启动盘了(因为都已经流行联网安装了),再搜,这时找到一位大神的牛帖,顿时看到曙光。关键信息如下:

三,如果以上2条都不成功就只能在single user mode(command+S)下修改了,启动电脑进入single user模式,打入"/sbin/fsck -y"(先检查一下磁盘哈),再打入"/sbin/mount -wu /"(装载系统volumn并赋予读写权利),然后打入"/sbin/SystemStarter",启动系统服务包括网络服务,这样我们就能进入netinfo数据库来修改root的账号密码了,"passwd root",大功告成!

注:也可以把root的密码hash存下来,打入"nidump passwd .",纪录下hash,然后还原算出原root的密码。

总之看上去这是mac的一种神奇的single user目测直接以类似root用户身份进入了系统,但是按这个教程操作几遍,都无法进入passwd命令行,对此模式操作也不懂,不敢胡乱折腾。。。带着郁闷关机睡觉,想到后面万一逼不得已需要重装OSX系统,那可如何是好,这么多的软件开发环境那会是何等的折腾啊。(因为毕竟后面开发时肯定会用到root账号的)

拆招

第二天早上我很早就去了公司,打算做最后一搏,搞不好的话就拿到苹果店里去问问吧(想想就头大),再次尝试了两遍昨晚教程中的做法,仍失败。。。抓腮挠耳。忽然我有点思路,如果在所谓single user模式下,我是以root身份操作的,我何不直接以root身份去恢复/etc/sudoers文件,将sudo命令解套,然后在sudo passwd解救root账户,冒险尝试了一把

【原】记一次找回mac root账号的苦逼经历

首先发现sudoers文件是只读权限的(联想到visudo命令是如何编辑此文件的。。。以后再研究先搞问题),chmod尝试修改一下文件权限,发现成功了!!!!此时其实基本就可确定此路能通了,后面恢复了文件,重新进入系统,执行sudo,忽然跳出“/private/etc/sudoers is mode 0640, should be 0440”,忽然回想我刚才chmod改了权限但是没有改回去,unix对这个文件的要求真是严格的说。再重启进入single user模式,chmod改回只读,最后发现——我成功了!!!sudo命令权限恢复,然后赶紧赶紧sudo passwd了一把,找回了久违的root密码。心里好幸福,心想终于爬出了这个自己挖的坑,而且还是在上班前。

晕死

时间来到下午,偶然间我看到一个帖子。意思是教人如何将mac的root账号关闭,继续一查,发现默认情况下mac得root账号就是关闭的。。。而且sudo passwd命令时相当于会连带启用了root账号。

【原】记一次找回mac root账号的苦逼经历

回想一下早上的情况把,当时其实根本不是我想不起root密码了,而是root账号根本没有启用,后来我走奇淫巧计的single user模式恢复sudoers文件之后走sudo passwd其实是将root账户开通了。那说明,如果昨晚我直接到这里来开通root用户并初始化密码,就可直接走root恢复sudoers文件了,OMG好吧,还好没有被逼折腾到重装系统的程度。。。看上掉到自己给自己挖的一个大坑里,九牛二虎之力爬墙翻出来了,回头一看发现坑底其实有个电梯直接上来 T_T

结束

由于一惊一乍感受比较深刻,写下来记录一下,后续也努力驱动自己持续写技术blog。通过这个事,还是被动去了解了sudo原理及mac的root机制,也算有收获~最终我的sudoers文件修改如下,现在真正通过自定义脚本做到了mac环境下得一键实现“更新代码+打包+log清理+ipfw端口转发+部署web服务”。

    #User privilege specification
    root    ALL=(ALL) ALL
    %admin  ALL=(ALL) ALL
    yangchuan ALL = NOPASSWD:ALL