在Linux这玩意儿里,谁还没碰过root权限的事儿。想装个软件、改个配置,结果提示没权限,那真是抓瞎。网上一堆教程让你用su或者sudo,看着都差不多,输完密码都能干root的事,但它们其实根本不是一回事。我刚开始也乱用,后来发现有些命令就是跑不通,才搞明白这里面门道还挺多。今天就说说这几个命令到底有啥区别,别再稀里糊涂用了。
先说su,这东西全名叫switch user,就是换个人的意思。比如你现在是普通用户小王,想临时用下root身份,直接敲su就行。它会要你输root的密码,输对了就进去了。但这时候有个坑:你虽然身份是root了,但你的工作目录、环境变量还是小王的。这就导致有些脚本跑不了,因为它认的路径还是小王家里的。
要解决这个,就得用su -,注意那个短横线。这个命令不光换身份,连整个登录环境都给你切过去。进了之后你会发现,当前目录变成了/root,PATH也变成root那一套了。这才是真正的“完全切换”。所以平时要动系统级配置的时候,最好用su -,省得后面出莫名其妙的问题。
再说sudo。这个设计思路跟su不一样,不是让你彻底变成另一个人,而是“帮我跑一条命令”。比如你想重启个服务,就sudo systemctl restart xxx。它会让你输自己的密码,不是root的。输完就能执行这条命令,但你自己还是你自己。过了大概5到15分钟(看系统设置),下次再用sudo还得再输一遍。这种机制挺安全的,毕竟不能一直挂着高权限到处跑。
但有时候你就是想多干几件事,总输密码烦死了。这时候有人用sudo su,意思是先拿sudo给自己提权,然后再跑su命令。这招相当于绕开root密码,用自己的密码就能登进去。但它还是继承了你原来的环境,和su -比起来还是差点意思。而且这样做其实挺危险的,等于把sudo的精细控制给绕过去了。
更规范的做法是sudo -i。这个命令的意思是“模拟一次完整的root登录”。它也会要你输自己密码,但进去之后就跟用su - root一样,环境全换了,目录也变成/root了。唯一的不同是:一个靠root密码,一个靠你自己能进sudo名单就行。现在很多服务器都不给root密码,只能靠sudo -i来操作,这也更符合安全管理逻辑。
还有人喜欢写sudo su -,这其实是多此一举。sudo -i已经干了这事儿了,再写一遍纯粹是手熟。而且这样还会留下两个日志记录,审计的时候显得乱。关键是功能上没差别,不如直接用标准做法。
这些命令背后其实牵扯到权限管理哲学的不同。su靠的是你知道密码就行,谁拿到密码谁就是老大,风险全在密码守不守得住。而sudo是白名单机制,可以精确控制谁能在哪台机器上执行哪条命令。比如运维可以允许开发人员重启某个服务,但不能动别的,这就安全多了。日志也记得清清楚楚,谁在什么时候干了啥,一查便知。
刚开始玩Linux的人最容易犯的错就是分不清环境变量的问题。明明权限有了,命令却报错说找不到文件或库。一查才发现PATH还是普通用户的那一套,压根没把/sbin或者/usr/sbin加进去。这时候就得意识到,是不是该用带横线的那个切换方式。
还有一个细节是退出方式。用su或su -进去的,打个exit就行。sudo -i进去的也一样。但如果你用了sudo su,其实是在sudo的壳子里跑了su,退出逻辑也一样。别以为有什么特殊操作,该咋退就咋退。
现在大多数发行版默认不设root密码,全靠sudo来提权。Ubuntu就是典型例子。你装完系统后根本没法直接用su,因为它不知道root密码。必须先sudo passwd root去设一个,才能用su系列命令。反过来也说明,官方更推荐你用sudo这种方式来管理权限。
这几个命令看着小,用错了轻则命令失败,重则留下安全隐患。特别是共享服务器上,乱用su可能让别人通过环境变量做手脚。所以记住一点:日常单次操作用sudo command,需要长时间操作就sudo -i,别折腾sudo su那一套。
这些命令也就那么回事,搞清楚原理比背命令重要。