Quais são os arquivos que precisam ser editados para adicionar um usuário? e o que escrever?

0

Estou tentando escrever um programa em C para adicionar um novo usuário ao meu Ubuntu 14.04.
 Eu editei
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

Depois disso, quando eu corro - 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

Onde "sachin" é criado pelo meu rpogram, "mrcr" é criado normalmente. Eu mudei as permissões como uma casa de usuário normal

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

Copiei todos os arquivos do diretório inicial "mrcr" para o diretório inicial "sachin" (.bashrc, Desktop ..etc)

Agora, na tela de login, "sachin" está lá para fazer o login. mas mesmo se eu digitar a senha correta, não consigo fazer login nela. Ele irá carregar novamente a mesma tela de login. abaixo está o meu código inteiro,

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

}

PERGUNTAS:

  1. quais são os arquivos que precisam ser editados?

  2. Como posso executar o programa sem ser uma raiz?

  3. que mudanças preciso colocar no meu código?

por mr.Cracker 12.08.2014 / 08:02

1 resposta

0

Vou postar a resposta, mas note que existe uma ferramenta adduser que é menos propensa a erros e mais complexa .

  1. Fonte - link

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. Você pode usar o polkit (anteriormente conhecido como Policy Kit ).

3.:

  • A função main deve estar retornando inteiro ( int ).

  • não copie .profile , copie todo o diretório /etc/skel

por enedil 15.08.2014 / 01:56