我正在读一本关于使用C编程的书,我得到了一个部分,我必须编写一个程序,它将显示正在执行文件的真实uid和有效uid.用
gcc编译代码后,我输入命令查看当前的uOwner和gOwner ls-l id_demo输出是这样的:
-rwxrwxr-x 1 user user 8629 Sep 21 13:04 id_demo
然后我执行程序本身,这是我得到的:
real uid: 1000 effective uid: 1000
…到现在为止还挺好.然后我输入一个命令来更改文件的所有者:
sudo chown root:root ./id_demo
ls -l确认所有者已更改为root:
-rwxrwxr-x 1 root root 8629 Sep 21 13:04 id_demo
再次,执行程序显示真正的uid和uid为1000. uid必须为0之后的最后一步是:sudo chmod us ./uid_demo但对我来说它们保持为1000,在书中输出显示为是这样的:
real uid: 1000 effective uid: 0
任何想法为什么会发生这种情况?
UPDATE
id_demo源代码:
#include <stdio.h> int main () { printf("real uid: %d\n",getuid()); printf("effective uid: %d\n",geteuid()); }
更新2
截屏
请帮忙.我疯了,我花了6个小时寻找解决方案,我需要继续前进.
解决方法
We’ve figured it out.原因是安装了ecryptfs的主目录. mount输出包含以下行:
/home/evgeny/.Private on /home/evgeny type ecryptfs
这意味着主目录实际上不是根文件系统的一部分(具有必要的suid标志),但它自己的虚拟文件系统默认情况下显然不支持setuid二进制文件.我已经成功地使用具有加密主目录的测试用户重现了该问题.
可以使用以下命令将suid标志添加到ecryptfs:
sudo mount -i -o remount,suid /home/evgeny
我不确定它是多么安全,也不确定如何永久地改变它以便它能够在重新启动后存活下来.