如何使用C/C++创建Linux用户?

问题描述:

我想构建一个程序,它以用户名作为参数并创建用户及其主文件夹(具有像文件夹这样的硬编码规范,并且像用户名的安全检查不能是root或现有用户)。如何使用C/C++创建Linux用户?

我的应用程序需要创建用户才能获得SSH访问权限。

该程序将使用sudo执行。我读过它应该用C或C++而不是脚本编写,因为脚本很容易被利用。

  • 你能给我一些建议或良好的做法关于如何做到这一点?
  • 我应该使用一些Pam库吗?有没有例子?
  • 什么是可能存在的安全缺陷?

我知道C/C++,并运行Ubuntu Lucid。

编辑:

的用户将只能sudo访问来运行特定的命令,我不希望它能够运行一个外壳或旁路某些程序(通过改变PATH环境中,例如) 。

因此,例如,我将需要覆盖路径还有什么我应该担心的?

+4

为什么脚本比可执行文件更容易被利用?如果您拥有root用户访问权限,则您拥有root用户访问权限,而且他们无法做到。以简单的方式完成并使用使用正常linux命令的脚本(因此已经完全测试过)。 – 2010-08-11 00:15:10

+0

用户将只有sudo访问权才能运行该特定命令,我不希望它能够运行shell或绕过某些程序(例如,通过更改PATH环境)。 – Weboide 2010-08-11 10:34:25

可能你最好的选择是调用useradd;它会做正确的事情(给定适当的参数)。

试图通过调用适当的API手动创建一个可能但不可取。

+0

这听起来更适合我。把一个Perl脚本放在一起然后调用useradd就是我*想要解决这个问题的方法。 – 2010-08-10 22:56:48

+5

Linux C库中没有“合适的API”。 – 2010-08-10 23:00:21

你的意思是像adduseruseradd?尝试查看他们的源代码。

这里没有API。您只需使用普通文件访问系统调用即可写入/etc/passwd/etc/group(以及可能还有影子版本)。

+0

为什么downvote? – 2010-08-11 00:26:33

+6

不要忘记,在修改这些值之前,您应该始终获取对文件的独占锁定(修改这些文件的所有系统命令都这样做)。否则有文件损坏的可能性,然后你的形状非常糟糕。 – 2010-08-11 03:29:22

+0

如果你的/ etc/passwd是空白的,我认为这是“唯一的方法”,所以你不能使用adduser将用户添加到组中 – rogerdpack 2012-03-07 23:30:50