Check existence of a login


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Check existence of a login
# 1  
Old 03-01-2008
Check existence of a login

Hi everybody,

I need to check in C program wether a given login is known on the system. Is there any system function that could do this ?

So far, all I could find is getpwnam(), which answers my problem by parsing the local password database. But won't work if a user is authenticated by other means (PAM, Kerberos, ...).

I am suprised not to have found anything on that topic, because any shell is able to resolve a user's HOME while doing the tilde expansion, but how is it done? I had a look at the shell C sources, but I am a bit lost. Also, I don't have a system with network authentication handy, so I can't ktrace /bin/sh while doing a tilde expansion to see what function is called...

Thanks in advance, any help much appreciated.

Xavier
# 2  
Old 03-02-2008
When a user logs in using login(1) login sets the $HOME environmental variable. The shell uses that environmental variable to find a users home directory.

AFAIK, there is no single API which will check whether a login is known to all authentication methods (local, NIS, PAM, etc.) used on a particular system.
# 3  
Old 03-02-2008
Quote:
Originally Posted by fpmurphy
When a user logs in using login(1) login sets the $HOME environmental variable. The shell uses that environmental variable to find a users home directory.

AFAIK, there is no single API which will check whether a login is known to all authentication methods (local, NIS, PAM, etc.) used on a particular system.
Thanks for your answer.
That is true for the current user, who is obviously logged in. However, if I have an existing user, say bob with HOME=/home/bob, on a system, then anyone will see ~bob expanded to /home/bob in their shell. Without that bob has ever logged in (and so called login(1)), and regardless of the authentication method as far as I could experiment...

On the other hand, if bob doesn't exist, then ~bob won't expand.
So the shell knows whether a user exists or not... the question is how? Smilie which I should find in the sources Smilie Smilie
# 4  
Old 03-02-2008
If the system is PAM based then you can use pam_authenticate to verify user access (and probable existence).
Linux example: Chapter 8. An example application
# 5  
Old 03-02-2008
Quote:
So the shell knows whether a user exists or not... the question is how?
No, in general, a shell does not know whether a particular user exists or not. The operating system may know that information.

As for tilde expansion, here is the relevant section from ksh93 s+.
Code:
/*
 * This routine is used to resolve ~ expansion.
 * A ~ by itself is replaced with the users login directory.
 * A ~- is replaced by the previous working directory in shell.
 * A ~+ is replaced by the present working directory in shell.
 * If ~name  is replaced with login directory of name.
 * If string doesn't start with ~ or ~... not found then 0 returned.
 */

static char *sh_tilde(register const char *string)
{
        register char           *cp;
        register int            c;
        register struct passwd  *pw;
        register Namval_t *np=0;
        static Dt_t *logins_tree;
        if(*string++!='~')
                return(NIL(char*));
        if((c = *string)==0)
        {
                if(!(cp=nv_getval(nv_scoped(HOME))))
                        cp = getlogin();
                return(cp);
        }
        if((c=='-' || c=='+') && string[1]==0)
        {
                if(c=='+')
                        cp = nv_getval(nv_scoped(PWDNOD));
                else
                        cp = nv_getval(nv_scoped(OLDPWDNOD));
                return(cp);
        }
        if(logins_tree && (np=nv_search(string,logins_tree,0)))
                return(nv_getval(np));
        if(!(pw = getpwnam(string)))
                return(NIL(char*));
        if(!logins_tree)
                logins_tree = dtopen(&_Nvdisc,Dtbag);
        if(np=nv_search(string,logins_tree,NV_ADD))
                nv_putval(np, pw->pw_dir,0);
        return(pw->pw_dir);
}

# 6  
Old 03-03-2008
MySQL

Quote:
Originally Posted by fpmurphy
No, in general, a shell does not know whether a particular user exists or not. The operating system may know that information.

As for tilde expansion, here is the relevant section from ksh93 s+.
Thanks, this answers my question. Furthermore I was wrong, and you are right: the shell knows only for users already logged at least once on the system. I could test getpwnam() on a set of PCs running Linux with PAM authentication, it failed for PAM logins of users that never logged on the machine. Same occurred with tidlde expansion.

BTW, I understand that getpwnam() manpage is confusing : it claims that /etc/passwd is parsed. But seen the output of last(1), and the outcome of my test, I understand it is rather /var/run/wtmp...

X.
# 7  
Old 03-04-2008
Quote:
BTW, I understand that getpwnam() manpage is confusing : it claims that /etc/passwd is parsed. But seen the output of last(1), and the outcome of my test, I understand it is rather /var/run/wtmp...
Wrong. The getpwnam() searches the user database for an entry with a matching name.
Note, that I did not say searches /etc/passwd.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

File existence check

hi i wanted to check if the file exist or not(multiple files) DIRE=/home/V478 if ; then echo "file present" else echo "file not present" fi But i am getting the error as : [: unexpected operator/operand (3 Replies)
Discussion started by: ATWC
3 Replies

2. Shell Programming and Scripting

Check the Files existence

Hi I have a requirement to check whether the files exists, then it will call other steps in shell script. I did ls *.csv|wc -l if then checking the count of the files should be more than 1 then it will call other steps. I am getting the error that too many arguements as there n... (13 Replies)
Discussion started by: cnrj
13 Replies

3. UNIX for Dummies Questions & Answers

To check for existence of a file

I need to check for the existence of a file *.log in a specific directory using a perl script. Presently am not in that particular directory. So i am using chdir ("/path/to/my/file) And then i am using the -e in an if statement to check if it exists. if (-e $File) {......} $File contains the... (1 Reply)
Discussion started by: manutd
1 Replies

4. Shell Programming and Scripting

How to check for file existence?

i want to check if the file is in the directory or not, and also it should be handle error conditions, like missing files and report the error and exit. i did something like this: file ="hello" if !test -e "${file}" then echo "No such files exist!" exit 1 else do something....... fi ... (1 Reply)
Discussion started by: mingming88
1 Replies

5. Shell Programming and Scripting

check existence of the path

Hi How can I check if the path exist or not? echo "Enter path:"; read my_path; ##I should check whether my_path exists or not.... (5 Replies)
Discussion started by: tjay83
5 Replies

6. AIX

Check for File Existence

I have requirement where i need to search for files which start with SALESORDER and PURCHASEORDER. i need to process the files with SALESORDER first and then PURCHASEORDER. If SALESORDER files are not there i dont want to process PURCHASEORDER and i want to come out of script. I have written a code... (4 Replies)
Discussion started by: dsdev_123
4 Replies

7. AIX

check for file existence

Hello I am having a requirement like if there is no file in the directory then i need a message to pop on after the execution of the script. My script basically does for File in `ls -t $DIRECTORY | tail -1`; if there is no file the DIRECTORY then the script is simply exiting with out... (2 Replies)
Discussion started by: dsdev_123
2 Replies

8. Programming

C function to test existence of a login

Hi everybody, I need to check in C program whether a given login is known on the system. Is there any system function that could do this ? So far, all I could find is getpwnam(), which answers my problem by parsing the local password database. But won't work if a user is authenticated by... (2 Replies)
Discussion started by: xavier054
2 Replies

9. UNIX for Dummies Questions & Answers

Variable check for existence ?

Hi , I have a script wherein i have a For Loop. Within this for loop i create a variable and assign it a value. The script goes to a For Loop only if certain conditions are met , which means the variable may or may not exists. However down the line in the script i have to check if that... (2 Replies)
Discussion started by: samit_9999
2 Replies

10. Shell Programming and Scripting

check for FILES existence

hi, I have a list of filenames and I want to verify if they all exist. I know "if filename" would do the trick but how do I go about a list of files? thanks (3 Replies)
Discussion started by: mpang_
3 Replies
Login or Register to Ask a Question