0

I am trying to write a C program to add a new user to my Ubuntu 14.04.
I edited
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

After this when I run - 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

Where "sachin" is created by my rpogram, "mrcr" is created normally. I changed the permissions like a normal user home

drwxr-xr-x 2 sachin    daemon    4096 Aug 12 11:11 sachin

I copied all files from "mrcr" home directory to "sachin" home directory(.bashrc, Desktop ..etc)

Now in login screen "sachin" is there to login. but even if I enter correct password I can't login into it. It will load again the same login screen. given below is my entire code,

#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");

}

QUESTIONS:

  1. what are the files needs to be edit?

  2. How can i run the program without to be a root?

  3. what changes i needs to put in my code?

3
  • If you really want to rewrite the adduser command line tool, maybe you could get its code from the Ubuntu sources.
    – Pyrophorus
    Aug 12, 2014 at 6:13
  • Or just use a bash script/command, as all the utils are available there. N.B. it needs to be done as root, creating/changing users is a admin job - see also this.
    – Wilf
    Aug 12, 2014 at 7:00
  • Can you login via terminal? (Press Ctrl-Alt-F2 to get to one).
    – muru
    Aug 12, 2014 at 10:19

1 Answer 1

0

I'll post answer but note that there is tool adduser which is less error-prone and more complex.

  1. Source - http://www.tldp.org/LDP/sag/html/adduser.html

11.2.4. Creating a user by hand

To create a new account manually, follow these steps:

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. 

After you set the password in the last step, the account will work. You shouldn't set it until everything else has been done, otherwise the user may inadvertently log in while you're still copying the files.

  1. You can use polkit (formerly known as Policy Kit).

3.:

  • main function should be returning integer (int).

  • don't copy .profile, copy whole /etc/skel directory

1
  • thanksss...actually i did the work already...in the same manner u sed....you are right...and thanks for the answer..:)
    – mr.Cracker
    Aug 20, 2014 at 16:10

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .