Retrieving non-/etc/passwd users with Python 3?

Loris Bennett loris.bennett at fu-berlin.de
Thu Apr 1 02:46:10 EDT 2021


Christian Heimes <christian at python.org> writes:

> On 31/03/2021 14.45, Loris Bennett wrote:
>> Chris Angelico <rosuav at gmail.com> writes:
>> 
>>> On Wed, Mar 31, 2021 at 11:21 PM Loris Bennett
>>> <loris.bennett at fu-berlin.de> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I want to get a list of users on a Linux system using Python 3.6.  All
>>>> the users I am interested in are just available via LDAP and are not in
>>>> /etc/passwd.  Thus, in a bash shell I can use 'getent' to display them.
>>>>
>>>> When I try to install the PyPi package
>>>>
>>>>   getent
>>>>
>>>> I get the error
>>>>
>>>>     File "/tmp/pip-build-vu4lziex/getent/setup.py", line 9, in <module>
>>>>       long_description = file('README.rst').read(),
>>>>   NameError: name 'file' is not defined
>>>>
>>>> I duckduckwent a bit and the problem seems to be that 'file' from Python
>>>> 2 has been replaced by 'open' in Python 3.
>>>>
>>>> So what's the standard way of getting a list of users in this case?
>>>>
>>>
>>> I don't have LDAP experience so I don't know for sure, but is the
>>> stdlib "pwd" module suitable, or does it only read /etc/passwd?
>>>
>>> https://docs.python.org/3/library/pwd.html
>>>
>>> Failing that, one option - and not as bad as you might think - is
>>> simply to run getent using the subprocess module, and parse its
>>> output. Sometimes that's easier than finding (or porting!) a library.
>> 
>> D'oh!  Thanks, 'pwd' is indeed exactly what I need.  When I read the
>> documentation here
>> 
>>   https://docs.python.org/3.6/library/pwd.html 
>> 
>> I mistakenly got the impression that it was only going to give me the
>> local users.  It doesn't actually say that, but it mentions /etc/shadow
>> and not getent.  However, it does talk about the "account and password
>> database", which is a clue (although our passwords are on an other
>> system entirely), since "database" is more getent terminology.
>> 
>> In any case, I think 'pwd' is hiding its light under a bushel a bit
>> here.
>
> Please open a documentation bug :)

I'll have a look :)

> The pwd and grp module use the libc API to get users from the local
> account database. On Linux and glibc the account database is handled by
> NSS and nsswitch.conf.
>
> By the way I recommend that you use SSSD instead of talking to LDAP
> directly. You'll have a much more pleasant experience.

Yes, we do use SSSD, but my grasp of what it does is pretty much limited
to "as well as looking at the local /etc/passwd it can also talk to
LDAP" :/

Cheers,

Loris

-- 
This signature is currently under construction.


More information about the Python-list mailing list