使用su切换自定义超级用户sroot时遇basename错误及权限异常
你遇到的问题核心在于:虽然给sroot设置了和root相同的UID/GID,但系统的shell初始化脚本和部分程序会校验用户名而非仅仅UID,再加上初始化文件里的语法错误,导致了这些异常。下面一步步帮你解决:
1. 先搞定TERM报错和basename问题
你看到的basename: missing operand错误,大概率是/root目录下的shell初始化文件(比如.bashrc、.bash_profile)里有错误的命令。因为sroot和root共享/root家目录,这些脚本里可能有依赖用户名的逻辑,或者没给basename传参数。
快速排查方法
先跳过初始化文件登录sroot,看看是否还报错:
su - sroot --noprofile --norc
如果这次没有报错,那肯定是初始化文件的问题。接下来去检查/root下的这些文件:
- 找所有用到
basename的行,比如有没有类似$(basename)这种没传参数的写法,改成$(basename $HOME)或者明确的参数 - 检查是否有脚本用
$USER变量判断用户名,比如if [ "$USER" != "root" ],这种逻辑会把sroot拒之门外,改成用UID判断:if [ "$UID" -ne 0 ]
另外,TERM变量显示[xterm-r6]是因为初始化脚本里可能错误地拼接了变量,导致格式异常,修复后可以用echo $TERM确认是否恢复正常。
2. 解决权限无法执行的问题
很多系统工具(比如sudo、部分系统命令)会检查用户名是否为root,而不是只看UID=0。所以即使sroot的UID是0,这些工具还是会拒绝执行。
修复方法
- 如果用sudo,编辑
/etc/sudoers(必须用visudo命令编辑,避免语法错误),添加一行:
这样sroot就能通过sudo执行所有root权限的命令了。sroot ALL=(ALL) ALL - 对于那些硬校验用户名的工具,要么修改它们的配置(比较麻烦),要么放弃用同UID的方式——其实完全没必要创建和root同UID的用户,更安全的做法是创建普通用户,通过sudo赋予全权限,或者给服务用户单独配置所需权限。
3. 验证修复效果
修改后重新执行su - sroot,先确认没有报错,然后试试执行需要root权限的命令,比如mkdir /root/test或者systemctl status sshd,看是否能正常运行。
额外提醒
创建UID=0的非root用户是个很冒险的操作,会导致很多系统工具的行为异常,因为很多程序默认认为UID=0的用户就是root,会依赖用户名做校验。如果你的需求是服务用的超级用户,更推荐用useradd -r创建无登录shell的系统用户,再通过sudo或者文件权限配置给它需要的权限,这样更安全也更规范。
内容的提问来源于stack exchange,提问作者sys463

