一台Linux服务器M上的一个普通账号a,想获得root账号的权限。我听到的有以下两种表述:
表述一:XX管理员,请帮忙给机器M下账号a添加root权限;
表述二:XX管理员,请帮忙给机器M下账号a添加sudo权限;
这里想探讨的是root权限和sudo权限那种说法更准确。
按照《鸟哥Linux私房菜》中的说法,我们一般用普通账号登陆系统,有需要进行系统维护或软件更新时才转到root的身份来操作。由此可见,添加root权限的说法更准确。
0、添加root权限。
# visudo编辑/etc/sudoers文件更安全,格式错误保存的时候会有提示。用vim/vi没有格式错误提示。 visudo /etc/sudoers ...省略... # 找到下面这行 root ALL=(ALL) ALL # 加上下面的指令就OK了 salmonl ALL=(ALL) NOPASSWD: ALL
1、切换到root权限。
sudo -s
2、谁可以添加root权限
用root账号登录的用户
添加过root权限的普通用户【之前以为不可以,实际验证可以】
3、后记,一个小插曲。
一次升级gcc版本到4.8,通过devtoolset-2工具安装gcc到这个目录/opt/rh/devtoolset-2/root/usr/bin/,然后建立软链
ll /opt/rh/devtoolset-2/root/usr/bin/* /usr/local/bin/ gcc -v gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC)
升级gcc成功,但是下一次登陆服务器后切换到root权限,切换不了了
[chuanbo7@241 ~]$ sudo -s /var/tmp/sclpY7yvB: line 8: -s: command not found
Google了半天也没有相关的问题,心里大概知道跟gcc的升级有关,于是查看gcc安装目录下果然有sudo。也就是有两个可执行程序sudo, 发现直接使用/usr/bin/sudo就能解决问题,但是根本原因是啥?这就涉及到优先级问题了。分析如下:
# 查看当前sudo的执行路径 [chuanbo7@241 ~]$ which sudo /usr/local/bin/sudo # 查看全部sudo执行路径 [chuanbo7@241 ~]$ whereis sudo sudo: /usr/bin/sudo /etc/sudo.conf /usr/local/bin/sudo /usr/share/man/man8/sudo.8.gz # 查看环境变量中配置的执行路径 [chuanbo7@241 ~]$ echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/chuanbo7/bin
以上可知/usr/local/bin路径在/usr/bin前面,优先级高,故而默认使用/usr/local/bin/sudo。知道原因了,如果想正常切换到root权限,有好多种方法:
其实命令执行完整优先级:alias > 内部命令> hash > $PATH。 分析可以参考这里。
至于/usr/local/bin/sudo为啥无法切换,还需要深入研究。
4、小结
解决了一个问题,很多时候并不是找到了原因。找原因,并找到原因的价值往往大于解决问题。解决问题是为了公司,找到原因是为了自己。
参考:
《鸟哥Linux私房菜基础版》第14章Linux账号管理-用户身份切换(P426)