root切换用户时遭遇"cannot change directory to /home/xxx: Permission denied"
系统:centos5.x
以前我安装mysql时,新建用户的命令是这样的:
shell> groupadd mysql
shell> useradd -g mysql mysql
shell> cd /usr/local
shell> useradd -g mysql mysql
shell> cd /usr/local
这时查看/etc/passwd时,记录这样的:
mysql:x:501:502::/home/mysql:/bin/bash
从上面的记录可以看出,此时的mysql是个普通用户(uid 500+)。
查看一下mysql的home目录:
drwx------ 2 mysql mysql 4096 Apr 15 21:07 mysql
嗯,这时从root用户切换成mysql是没有问题的。所以我一直都没有在这个步骤上遇到过问题。接下来,我说说今天在这个步骤上遇到的问题。
如果细心留意观察mysql manual(2.2. Installing MySQL from Generic Binaries on Unix/Linux)的话,会发现它的操作命令是这样的:
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> useradd -r -g mysql mysql
shell> cd /usr/local
它的useradd 多加了一个选项'-r',这个参数的意思是"create system account"。可以从/etc/passwd中mysql的uid反映这一点:
mysql:x:101:502::/home/mysql:/bin/bash
在建立完用户以后,这时做root切换成mysql用户的操作,会出现一个意想不到的情况:
# su - mysql
su: warning: cannot change directory to /home/mysql: 权限不够
-bash: /home/mysql/.bash_profile: 权限不够
-bash-3.2$
su: warning: cannot change directory to /home/mysql: 权限不够
-bash: /home/mysql/.bash_profile: 权限不够
-bash-3.2$
在我的印象当中,root的切换操作在正常情况下不会出现"Permission denied",是什么原因引起的?通过查询一些网上的资料,有一种说法是说用户的权限出现了问题。详情可以参阅这里。但我这个却不是这个原因。通过观察,问题的表现在这里:
drwx------ 2 504 mysql 4096 Apr 29 15:06 mysql
这个属主标识错误的问题,很好解决:
# chown -R mysql mysql/
原因分析:上述属主标识问题发生的原因其实很简单,就是在建立新的mysql用户(系统uid)时,它使用了以前的mysql普通用户(使用userdel删除具有相同名称的旧账号,没有加 '-r'选项,保留其主目录)的主目录。这样当uid不一致(系统没有更新此主目录的属主标识位),而此uid的用户已经不存在于系统中,所以root用户在切换用户时发生了" Permission denied"。