我正在尝试编写一个 C 程序来向我的 Ubuntu 14.04 添加新用户。
我编辑了
1) /etc/passwd
sachin:x:65535:1:sachin:/home/sachin:/bin/bash
2)/etc/shadow
sachin:$6$VwBWgroA$t4KXLWIf81sWtiA1/a.fRLrXaOAflGtMo73hGvCzp/M6S8oizZ4iqk.vYbkblXZj2hgGXJxlJ.M2hghGO.a650:16294::::::
3) .profile
stty istrip
PATH=/bin:/usr/bin:/usr/local/bin:/usr/share/bin:.
export PATH
在这之后当我跑步时 -ls -l /home/
drwxr-xr-x 43 mrcr mrcr 4096 Aug 12 10:27 mrcr
d-w------t 2 sachin daemon 4096 Aug 12 11:11 sachin
其中“sachin”是由我的rpogram创建的,“mrcr”是正常创建的。我像普通用户一样更改了权限
drwxr-xr-x 2 sachin daemon 4096 Aug 12 11:11 sachin
我将所有文件从“mrcr”主目录复制到“sachin”主目录(.bashrc,桌面..等)
现在在登录屏幕中“sachin”可以登录。但即使我输入正确的密码,我也无法登录。它将再次加载相同的登录屏幕。下面是我的全部代码,
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/types.h>
#include <pwd.h>
#include<signal.h>
#include<unistd.h>
main(int argc, char **argv)
{
struct passwd *userlist;
int count, usernumber, len1;
FILE *tmp, *stmp, *mailer, *profile;
char *commentfield, *username, *userdir, *home;
char *mailcomment, *mailmail, reply;
commentfield = (char *)malloc(1024*sizeof(char));
username = (char *)malloc(8*sizeof(char));
userdir = (char *)malloc(256*sizeof(char));
home = (char *)malloc(256*sizeof(char));
mailcomment = (char *)malloc(1024*sizeof(char));
mailmail = (char *)malloc(512*sizeof(char));
if (argc!=4)
{
printf("usage : %s [dirname- no slashes] [logname] [comment - in quotes]\n", argv[0]);
exit(1);
}
if( (strlen(argv[2]) < 5) || (strlen(argv[2]) > 8) )
{
printf("pls enter logname between 5-8 \n");
exit(1);
}
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
setpwent();
count = 0;
while((userlist = getpwent()) != NULL)
{
if(count < userlist->pw_uid)
{
count = userlist->pw_uid ;
usernumber = count + 1;
}
}
printf("usernumber : %d\n", usernumber);
endpwent();
sprintf(commentfield,"%s", argv[3]);
sprintf(username, "%s", argv[2]);
sprintf(userdir, "%s", argv[1]);
sprintf(home, "/%s/%s", argv[1], argv[2]);
printf("\n Check this out here: \n");
printf("-----------------------------------------------");
printf("\n username :\t %s", username);
printf("\n Home Directory:\t %s", home);
printf("\n comment :\t %s", commentfield);
printf("\n______________________________________________\n\n");
printf("all of this ok? n/y: ");
scanf("%c", &reply);
if(reply != 'y')
{
printf("\n exiting....u entered not y");
exit(1);
}
tmp = fopen("/etc/passwd", "a");
if (tmp == NULL)
{
printf("\npermission denied\n");
exit(1);
}
fprintf(tmp, "%s:x:%d:1:%s:%s:/bin/bash\n", username, usernumber, commentfield, home);
fclose(tmp);
stmp = fopen("/etc/shadow", "a");
if (stmp == NULL)
{
printf("\npermission denied\n");
exit(1);
}
fprintf(stmp, "%s:*LK*:::::::\n", username);
fclose(stmp);
mkdir(home, 0755);
chdir(home);
profile = fopen(".profile", "a");
fprintf(profile, "stty istrip\n");
fprintf(profile, "PATH=/bin:/usr/bin:/usr/local/bin:/usr/share/bin:.\n");
fprintf(profile, "export PATH\n");
fprintf(profile, "\n\n");
fclose(profile);
chown(home, usernumber, 1);
chown(".profile", usernumber, 1);
chmod(".profile", 0644);
printf("\n\nALL done!!!!!!!\n Now set the password: ");
execl("/usr/bin/passwd", "passwd", username, NULL);
printf("\n\n SUCCESS PASSWORD IS SET.....BYE!!!\n\n");
}
问题:
需要编辑哪些文件?
我如何才能在非 root 身份下运行该程序?
我需要对我的代码做哪些修改?
答案1
我会发布答案,但请注意,有一个工具adduser
它不太容易出错,而且更加复杂。
11.2.4. 手动创建用户
要手动创建新帐户,请按照以下步骤操作:
Edit /etc/passwd with vipw and add a new line for the new account. Be careful with > the syntax. Do not edit directly with an editor! vipw locks the file, so that other commands won't try to update it at the same time. You should make the password field be `*', so that it is impossible to log in. Similarly, edit /etc/group with vigr, if you need to create a new group as well. Create the home directory of the user with mkdir. Copy the files from /etc/skel to the new home directory. Fix ownerships and permissions with chown and chmod. The -R option is most useful. > The correct permissions vary a little from one site to another, but usually the following commands do the right thing: cd /home/newusername chown -R username.group . chmod -R go=u,go-w . chmod go= . Set the password with passwd.
在最后一步设置密码后,该帐户即可使用。在其他所有操作都完成后,您不应设置密码,否则用户可能会在您仍在复制文件时无意中登录。
- 您可以使用波尔基特(原名
Policy Kit
)。
3.:
main
函数应该返回整数(int
)。不要复制
.profile
,复制整个/etc/skel
目录