How to get the unix login name of the calling user?

M

Moritz Reiter

Hi,

I am writing a script which uses a configuration file. I already managed
that it is possible for the caller to specify the location of the config
file as a command line parameter (which was pretty easy with optparse).
Now I want to set the default location of for the config file to
/home/username/.my_config_file. Therefore I have to get the username of
the user who is calling the script.

My idea would be to parse /etc/passwd for the return value of
Process.uid but as I am pretty unexperienced in ruby I wanted to ask
here if someone could tell me a more elegant method to do it?

Thanks,
mo
 
G

George Ogata

Hi,

I am writing a script which uses a configuration file. I already managed
that it is possible for the caller to specify the location of the config
file as a command line parameter (which was pretty easy with optparse).
Now I want to set the default location of for the config file to
/home/username/.my_config_file. Therefore I have to get the username of
the user who is calling the script.

My idea would be to parse /etc/passwd for the return value of
Process.uid but as I am pretty unexperienced in ruby I wanted to ask
here if someone could tell me a more elegant method to do it?

* If you just need the user's home directory, use
File.expand_path('~/.my_config_file').

* If you actually need the user's login name, the USER envvar is
usually (always?) set to this -- so ENV['USER'].

* If you really need to traipse through passwd ruby also comes with an
'etc' file parsing library.

require 'etc'

Then:

user = Etc.getpwuid(Process.uid).name

Or:

effective_user = Etc.getpwuid(Process.euid).name

More info:

http://ruby-doc.org/stdlib/
(Although I've just noticed that clicking on 'etc' gives a 500...)
 
M

Moritz Reiter

George said:
* If you just need the user's home directory, use
File.expand_path('~/.my_config_file').

Great! I think this first suggestion will do it in this case, but the
other information is very valuable, too. Thank you! :)
 
T

Thomas Hafner

Moritz Reiter said:
Now I want to set the default location of for the config file to
/home/username/.my_config_file. Therefore I have to get the username
of the user who is calling the script.

Not necessarily. How about that?:
File.expand_path("~/.my_config_file")
=> /home/username/.my_config_file

Regards
Thomas
 
M

Moritz Reiter

Thomas said:
Not necessarily. How about that?:
File.expand_path("~/.my_config_file")
=> /home/username/.my_config_file

Yo, that works perfectly, thanks!
 
K

Ken Bloom

Hi,

I am writing a script which uses a configuration file. I already managed
that it is possible for the caller to specify the location of the config
file as a command line parameter (which was pretty easy with optparse).
Now I want to set the default location of for the config file to
/home/username/.my_config_file. Therefore I have to get the username of
the user who is calling the script.

My idea would be to parse /etc/passwd for the return value of
Process.uid but as I am pretty unexperienced in ruby I wanted to ask
here if someone could tell me a more elegant method to do it?

Thanks,
mo

Just to add to what everyone else has said so far about using
File.expand_path('~/.my_config_file') or ENV['HOME'], there is no
requirement on UNIX that the home directories be located in
/home/username. They could be placed in other trees (for example on an NFS
share somewhere) or they may be buried several levels deep -- a common
practice in large computer labs is to split them into directories based on
their first couple letters (for easier directory access) for example
/home/k/ka/kabloom.

Thus, trying to access /home/#{username}/.my_config_file is precisely the
wrong thing to do. Instead, use File.expand_path('~/.my_config_file') or
#{ENV['HOME']}/.my_config_file

--Ken
 
G

gwtmp01

Thus, trying to access /home/#{username}/.my_config_file is
precisely the
wrong thing to do. Instead, use File.expand_path
('~/.my_config_file') or
#{ENV['HOME']}/.my_config_file

These methods all depend on environment variables. If you need/want to
find this information based on the actual userid and home directory
information maintained by the OS:

require 'etc'

homedir = Etc.getpwuid(Process.uid).dir

Gary Wright
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,444
Messages
2,571,709
Members
48,796
Latest member
Greg L.
Top