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

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

···

--
Posted via http://www.ruby-forum.com/.

* 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:

  RDoc Documentation
  (Although I've just noticed that clicking on 'etc' gives a 500...)

···

On 1/30/07, Moritz Reiter <mo@agrav.org> wrote:

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?

Moritz Reiter <mo@agrav.org> wrote/schrieb <d1d81a8b82b36ce7f4843e7949c729c0@ruby-forum.com>:

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

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

···

On Tue, 30 Jan 2007 18:57:08 +0900, Moritz Reiter wrote:

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

--
Ken Bloom. PhD candidate. Linguistic Cognition Laboratory.
Department of Computer Science. Illinois Institute of Technology.
http://www.iit.edu/~kbloom1/

George Ogata wrote:

* 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! :slight_smile:

···

--
Posted via http://www.ruby-forum.com/\.

Thomas Hafner wrote:

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

Yo, that works perfectly, thanks!

···

--
Posted via http://www.ruby-forum.com/\.

File.expand_path('~/.my_config_file').

Why not ENV['HOME'] ?

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

···

On Jan 30, 2007, at 10:10 AM, Ken Bloom wrote:

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

Stephane Wirtel wrote:

File.expand_path('~/.my_config_file').

Why not ENV['HOME'] ?

Yes, I think in my case both solutions are equivalent.

···

--
Posted via http://www.ruby-forum.com/\.

Since you're on a unix system:

`whoami` #=> "johan"

haven't tested it

···

On 1/30/07, Moritz Reiter <mo@agrav.org> wrote:

Stephane Wirtel wrote:
>> File.expand_path('~/.my_config_file').
> Why not ENV['HOME'] ?

Yes, I think in my case both solutions are equivalent.

--
Posted via http://www.ruby-forum.com/\.