我想以其个人权限在Linux中以其他用户身份运行进程。在服务器程序中,我要求用户输入登录名和密码以访问系统。接下来,我必须以另一个用户身份运行客户端程序以分隔工作区并提供身份验证。然后客户端程序应该通过Linux IPC套接字从服务器发送和接收消息。我发现了一些以其他用户身份运行程序的方法:
int pid = fork();
if(pid == 0) // child
{
int ret = system("sudo -u username ./client.out");
}
else if(pid > 0) // server
{
// communicate with client via socket
}
else {
exit(EXIT_FAILURE);
}
但是它不使用密码。我的问题是如何以其他用户身份运行程序并通过密码?另外,使用system
命令也不是一个好的解决方案。 sudo
是一个命令行程序,但是我必须从C调用它。如何在C中正确运行另一个程序?
答案 0 :(得分:0)
我没有发表评论的权限,因此我将其写为答案。 一种方法是提示输入密码并自己进行验证,然后分叉并为该过程设置新用户。 您可以检查Given a linux username and a password how can I test if it is a valid account?来查看如何验证密码,基本上,它会为您拥有的密码生成一个哈希,在/ etc / shadow中为用户读取哈希,然后将它们进行比较。 要切换用户,您需要调用setuid和setgid(设置组ID)。检查以下答案:Linux C programming execute as user
您可以从/ etc / password获取用户的uid和gid。该文件中的示例条目为:
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
第三个字段是用户标识,第四个字段是组标识,在这种情况下为39和39。 调用setuid之后,您的进程将以新用户的身份运行。然后,您可以开始所需的任何过程。 为此,您的程序必须打开setuid位。
编辑:
如果以root身份运行,则无需在可执行文件中设置setuid位。
由于您已经在使用fork(),因此您可能想调用exec()的任何变体而不是system(),因为system()将创建一个附加进程。参见Difference between "system" and "exec" in Linux?
您可以使用getpwdnam()读取/ etc / passwd,因为它将为您解析字段。参见How to get linux user id by user name?