如何更改我的c程序将自己标识为的用户?
我想要自动调用的命令行工具需要以特定用户身份运行,否则无法运行。
我尝试过使用setuid(0)
,但仍然无法获得理想的结果。
我想模仿的用户不是' root ',而是普通的无特权,无shell用户。我希望能够以用户nobody身份运行登录的二进制文件。我能够使用以下方法将解决方案编写为“root”:
su -ls /bin/bash -c /binary
(超级用户)
但是,我希望能够以用户 nobody
的方式登录我有什么遗失的吗?
答案 0 :(得分:6)
如果有人可以通过将setuid(0);
放在他们的程序中而成为root用户,那么Unix就是Windows。
一些想法:
sudo
权限并通过sudo运行它。鉴于您提出的非常基本的问题,您甚至不应该尝试编写将以root身份运行的代码,因此我省略了有关如何为您的程序设置root权限的任何详细信息。
答案 1 :(得分:3)
您不需要在C方面做任何事情。只需更改要使用的用户拥有的二进制文件,启用二进制文件中的setuid位(chmod u+s
),就可以了![/ p>
(如果您不希望任何用户能够无条件地以指定用户身份运行,请考虑使用sudo。)
答案 2 :(得分:1)
要更改当前的用户ID:
首先,使用getpwnam()
查找新的用户ID。这将返回struct passwd *pw
,NULL值将指示用户不退出。 struct
包含执行更改所需的用户ID(pw_uid
)和组ID(pw_gid
)。
if((pw = getpwnam(userid)) == NULL)
sprintf(error_msg "Userid '%s' does not exist", userid);
然后设置新用户的组ID
if (setgid(pw->pw_gid) != 0)
sprintf(error_msg "setgid() to %d failed", pw->pw_gid);
最后,设置新用户的用户ID
if (setuid(pw->pw_uid) != 0)
sprintf(error_msg "setuid() to %d failed", pw->pw_uid);
此过程中的错误恢复很麻烦。最简单的方法是在setgid()
或setuid()
失败时简单地中止。如果更改组成功,但更改用户失败,则会出现真正的问题。