在Unix中添加用户和组

时间:2010-09-09 22:37:01

标签: unix

有没有人知道在unix中添加用户和组并删除它们的api?我想以编程方式执行此操作。

谢谢, 弗兰克

2 个答案:

答案 0 :(得分:1)

我开始查看一些系统调用并找到以下内容。请注意,它们的标准各不相同,因此并非所有标准都适用于您的Unix版本:

  • 的getpwent
  • setpwent
  • putpwent

然而,这些都假设一个密码文件。出于好奇,我试图useradd找出他做了什么。这是它的一小部分输出:

# grep -E 'passwd|shadow' useradd.log.20283
...
open("/etc/shadow", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd.20283", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
link("/etc/passwd.20283", "/etc/passwd.lock") = 0
stat("/etc/passwd.20283", {st_mode=S_IFREG|0600, st_size=6, ...}) = 0
unlink("/etc/passwd.20283")             = 0
open("/etc/passwd", O_RDWR)             = 4
open("/etc/shadow.20283", O_WRONLY|O_CREAT|O_EXCL, 0600) = 5
link("/etc/shadow.20283", "/etc/shadow.lock") = 0
stat("/etc/shadow.20283", {st_mode=S_IFREG|0600, st_size=6, ...}) = 0
unlink("/etc/shadow.20283")             = 0
open("/etc/shadow", O_RDWR)             = 5
open("/etc/gshadow.20283", O_WRONLY|O_CREAT|O_EXCL, 0600) = 7
link("/etc/gshadow.20283", "/etc/gshadow.lock") = 0
stat("/etc/gshadow.20283", {st_mode=S_IFREG|0600, st_size=6, ...}) = 0
unlink("/etc/gshadow.20283")            = 0
open("/etc/gshadow", O_RDWR)            = 7
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 8
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 9
open("/etc/passwd-", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 9
utime("/etc/passwd-", [2010/09/02-07:07:34, 2010/09/02-07:07:34]) = 0
open("/etc/passwd+", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
lstat("/etc/passwd", {st_mode=S_IFREG|0644, st_size=2479, ...}) = 0
rename("/etc/passwd+", "/etc/passwd")   = 0
open("/etc/shadow-", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
utime("/etc/shadow-", [2010/09/02-07:07:34, 2010/09/02-07:07:34]) = 0
open("/etc/shadow+", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
lstat("/etc/shadow", {st_mode=S_IFREG|0600, st_size=1429, ...}) = 0
r    ename("/etc/shadow+", "/etc/shadow")   = 0
open("/etc/gshadow-", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
utime("/etc/gshadow-", [2010/09/02-07:07:34, 2010/09/02-07:07:34]) = 0
open("/etc/gshadow+", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
lstat("/etc/gshadow", {st_mode=S_IFREG|0400, st_size=1069, ...}) = 0
rename("/etc/gshadow+", "/etc/gshadow") = 0
unlink("/etc/shadow.lock")              = 0
unlink("/etc/passwd.lock")              = 0
unlink("/etc/gshadow.lock")             = 0

虽然您可以更好地了解完整上下文的内容,但请注意,它会将其创建的临时文件(/etc/passwd.20283)链接到/etc/passwd.lockuseradd与阴影和gshadow文件类似。

同样重要的是要注意useraddnscd发出了四个电话。其中两个用于passwd,另外两个用于group

execve("/usr/sbin/nscd", ["/usr/sbin/nscd", "nscd", "-i", "passwd"], [/* 0 vars */]) = 0

如果没有API(我似乎找不到它),可能是因为存储用户的方式比简单的passwd文件多得多。实际上,机器可能无法控制用户。

编辑:我认为同样重要的是要注意useradd也咨询/etc/nsswitch.conf,可能会验证用户数据库的来源。此外,userdel表现几乎相同,创建类似命名的临时文件和锁文件。

我在Linux下使用以下命令进行了测试:

strace -o useradd.log -f -ff -s 1024 useradd tempuser

strace在其他unix系统上也可能显示为trussktrace

答案 1 :(得分:1)

我在寻找一种在Unix上列出所有组的方法时发现了这个问题。 但是要创建和删除用户,您可以以编程方式调用实用程序useradd,userdel,groupadd,groupdel,因为您知道用户名已被发送。但我想你需要超级用户权限才能调用它们。无论如何,您可以检查进程退出代码以获取命令状态。

 useradd xxx // status zero operation completed
 useradd xxx // status nine user already exists

希望它有所帮助。

相关问题