有没有人知道在unix中添加用户和组并删除它们的api?我想以编程方式执行此操作。
谢谢, 弗兰克
答案 0 :(得分:1)
我开始查看一些系统调用并找到以下内容。请注意,它们的标准各不相同,因此并非所有标准都适用于您的Unix版本:
然而,这些都假设一个密码文件。出于好奇,我试图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.lock
。 useradd
与阴影和gshadow文件类似。
同样重要的是要注意useradd
向nscd
发出了四个电话。其中两个用于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系统上也可能显示为truss
和ktrace
。
答案 1 :(得分:1)
我在寻找一种在Unix上列出所有组的方法时发现了这个问题。 但是要创建和删除用户,您可以以编程方式调用实用程序useradd,userdel,groupadd,groupdel,因为您知道用户名已被发送。但我想你需要超级用户权限才能调用它们。无论如何,您可以检查进程退出代码以获取命令状态。
useradd xxx // status zero operation completed
useradd xxx // status nine user already exists
希望它有所帮助。