Python имя пользователя linux

Есть ли портативный способ получить текущее имя пользователя в Python?

Существует ли переносимый способ получить имя пользователя текущего пользователя в Python (т. Е. Тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать как os.getuid :

>>> os.getuid() 42 >>> os.getusername() 'slartibartfast' 

Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ добиться этого, скажем, в Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.

16 ответов

import getpass getpass.getuser() 'kostya' 

ps В комментариях ниже «эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, в любых других целях, поскольку она позволяет любому пользователю выдавать себя за любое другое).«

Лучше всего было бы объединить os.getuid() с pwd.getpwuid() :

import os import pwd def get_username(): return pwd.getpwuid( os.getuid() )[ 0 ] 

Обратитесь к документации по pwd для более подробной информации:

Вы также можете использовать:

Вы, вероятно, можете использовать:

Но это не будет безопасным, потому что переменные среды могут быть изменены.

Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не являются переносимыми, но для этого предназначены выражения «os.name» и «if».

Если вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.

>>> os.path.expanduser('~') 'C:\\Documents and Settings\\johnsmith' 

Также вы можете проанализировать такую ​​строку, чтобы получить только последний компонент пути (т. Е. Имя пользователя).

Для меня с помощью os модуль выглядит лучше для переносимости: лучше всего работает как на Linux, так и на Windows.

import os # Gives user's home directory userhome = os.path.expanduser('~') print "User's home Dir: " + userhome # Gives username by splitting path based on OS print "username: " + os.path.split(userhome)[-1] 

Дом пользователя Dir: C:\Users\myuser

имя пользователя: myuser

Дом пользователя Dir: /root

имя пользователя: root

Нет необходимости устанавливать какие-либо модули или расширения.

psutil предоставляет переносимый способ, который не использует переменные среды, такие как getpass решение. Он менее подвержен проблемам с безопасностью и, вероятно, должен быть принятым ответом на сегодняшний день.

import psutil def get_username(): return psutil.Process().username() 

Под капотом это объединяет getpwuid основанный на unix и GetTokenInformation метод для Windows.

Читайте также:  Линукс манджаро кде плазма

Комбинированный pwd а также getpass подход, основанный на других ответах:

try: import pwd except ImportError: import getpass pwd = None def current_user(): if pwd: return pwd.getpwuid(os.geteuid()).pw_name else: return getpass.getuser() 

Для UNIX, по крайней мере, это работает.

import commands username = commands.getoutput("echo $(whoami)") print username 

редактировать: я только что посмотрел, и это работает на Windows и UNIX:

import commands username = commands.getoutput("whoami") 

В UNIX он возвращает ваше имя пользователя, но в Windows он возвращает группу вашего пользователя, косую черту, ваше имя пользователя.

UNIX возвращает: «имя пользователя»

Windows возвращает: «домен / имя пользователя»

Это интересно, но, вероятно, не идеально, если вы все равно что-то не делаете в терминале. в этом случае вы, вероятно, будете использовать os.system начать с. Например, некоторое время назад мне нужно было добавить своего пользователя в группу, что я и сделал (это в Linux, заметьте)

import os os.system("sudo usermod -aG \"group_name\" $(whoami)") print "You have been added to \"group_name\"! Please log out for this to take effect" 

Мне кажется, что это легче читать, и вам не нужно импортировать pwd или getpass.

Я также чувствую, что наличие «домен / пользователь» может быть полезным в некоторых приложениях в Windows.

Использование только стандартных библиотек Python:

from os import environ,getcwd getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"] user = getUser() 

Работает на Windows, Mac или Linux

В качестве альтернативы вы можете удалить одну строку с помощью немедленного вызова:

from os import environ,getcwd user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])() 

Некоторое время назад я написал модуль plx для переноса имени пользователя в Unix и Windows (среди прочего): http://www.decalage.info/en/python/plx

import plx username = plx.get_username() 

(для Windows требуются расширения win32)

В моем случае ничего из вышеперечисленного не сработало (прокрутите вниз до фактического решения).
Проблема, с которой я сталкиваюсь со всеми решениями, — это неправильное имя пользователя при запуске команд с sudo :

$ python3 >>> import psutil >>> psutil.Process().username() 'ubuntu' # OK! $ sudo su $ python3 >>> import psutil >>> psutil.Process().username() 'root' # OK! $ sudo python3 >>> import psutil >>> psutil.Process().username() 'root' # WRONG, should be ubuntu! 
$ python3 >>> import getpass >>> getpass.getuser() 'ubuntu' # OK! $ sudo su $ python3 >>> import getpass >>> getpass.getuser() 'root' # OK! $ sudo python3 >>> import getpass >>> getpass.getuser() 'root' # WRONG, should be ubuntu! 
$ python3 >>> import os, pwd >>> pwd.getpwuid( os.getuid() )[ 0 ] 'ubuntu' # OK! $ sudo su $ python3 >>> import os, pwd >>> pwd.getpwuid( os.getuid() )[ 0 ] 'root' # OK! $ sudo python3 >>> import getpass >>> getpass.getuser() 'root' # WRONG, should be ubuntu! 
$ python3 >>> import os >>> os.getlogin() 'ubuntu' # OK! $ sudo su $ python3 >>> import os >>> os.getlogin() 'ubuntu' # WRONG, should be root! $ sudo python3 >>> import os >>> os.getlogin() 'ubuntu' # OK! 
$ python3 >>> import os >>> os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK! $ sudo su $ python3 >>> import os >>> os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # WRONG, should be root! $ sudo python3 >>> import os >>> os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK! 

Переключение SUDO_USER а также USER дает неправильный результат в sudo python3 дело.

Читайте также:  Добавить раздел в линукс

Актуальное решение (непереносимое)

Решение немного сложное и полагается на расположение корневого домашнего каталога по умолчанию, но работает во всех случаях:

$ python3 >>> import os >>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK! $ sudo su $ python3 >>> import os >>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER')) 'root' # OK! $ sudo python3 >>> import os >>> 'root' if os.path.expanduser('~') == '/root' else os.getenv('SUDO_USER', os.getenv('USER')) 'ubuntu' # OK! 

Источник

Есть ли портативный способ получить текущее имя пользователя в Python?

Существует ли портативный способ получить имя пользователя текущего пользователя в Python (то есть тот, который работает как в Linux, так и в Windows, по крайней мере). Это будет работать как os.getuid :

>>> os.getuid() 42 >>> os.getusername() 'slartibartfast' 

Я гуглил вокруг и был удивлен, что не нашел окончательного ответа (хотя, возможно, я просто плохо гуглил). Модуль pwd обеспечивает относительно простой способ достижения этой цели. под, скажем, Linux, но его нет в Windows. Некоторые результаты поиска показали, что получение имени пользователя в Windows может быть сложным в определенных обстоятельствах (например, запуск в качестве службы Windows), хотя я этого не проверял.

12 ответов

import getpass getpass.getuser() 'kostya' 

Постскриптум В комментариях ниже « эта функция просматривает значения различных переменных среды для определения имени пользователя. Поэтому на эту функцию не следует полагаться в целях контроля доступа (или, возможно, для любой другой цели, поскольку она позволяет любому пользователю выдавать себя за другого»). любой другой). «

Используя только стандартные библиотеки Python:

from os import environ,getcwd getUser = lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"] user = getUser() 

Работает на Windows, Mac или Linux

Кроме того, вы можете удалить одну строку с немедленным вызовом:

from os import environ,getcwd user = (lambda: environ["USERNAME"] if "C:" in getcwd() else environ["USER"])() 

Некоторое время назад я написал модуль plx для переноса имени пользователя в Unix и Windows (среди прочего): http://www.decalage.info/en/python/plx

import plx username = plx.get_username() 

(для Windows требуются расширения win32)

Комбинированный подход pwd и getpass , основанный на других ответах:

try: import pwd except ImportError: import getpass pwd = None def current_user(): if pwd: return pwd.getpwuid(os.geteuid()).pw_name else: return getpass.getuser() 

Вы также можете использовать:

Читайте также:  Linux команда копирования папки

Это может сработать. Я не знаю, как они ведут себя при работе в качестве службы. Они не являются переносимыми, но для этого предназначены операторы os.name и if .

win32api.GetUserName() win32api.GetUserNameEx(. ) 

Вы, вероятно, можете использовать:

Но это не будет безопасным, потому что переменные среды могут быть изменены.

Если вам это нужно, чтобы получить домашний каталог пользователя, ниже можно считать переносимым (по крайней мере, win32 и linux), частью стандартной библиотеки.

>>> os.path.expanduser('~') 'C:\\Documents and Settings\\johnsmith' 

Также вы можете проанализировать такую строку, чтобы получить только последний компонент пути (т.е. имя пользователя).

Для меня использование os модуля выглядит лучше всего для переносимости: лучше всего работает как в Linux, так и в Windows.

import os # Gives user's home directory userhome = os.path.expanduser('~') print "User's home Dir: " + userhome # Gives username by splitting path based on OS print "username: " + os.path.split(userhome)[-1] 

Дом пользователя Dir: C: \ Users \ myuser

имя пользователя: myuser

Дом пользователя Dir: / root

имя пользователя: root

Нет необходимости устанавливать какие-либо модули или расширения.

Лучше всего было бы объединить os.getuid() с pwd.getpwuid() :

import os import pwd def get_username(): return pwd.getpwuid( os.getuid() )[ 0 ] 

Обратитесь к документации по pwd для более подробной информации:

Вы можете получить текущее имя пользователя в Windows, пройдя через Windows API, хотя вызывать его немного через FFI ctypes (GetCurrentProcess → OpenProcessToken → GetTokenInformation → LookupAccountSid).

Я написал небольшой модуль, который может сделать это прямо из Python, getuser.py. Применение:

import getuser print(getuser.lookup_username()) 

Он работает как в Windows, так и в * nix (последний использует модуль pwd , как описано в других ответах).

Для UNIX, по крайней мере, это работает .

import commands username = commands.getoutput("echo $(whoami)") print username 

изменить Я только что посмотрел, и это работает на Windows и UNIX:

import commands username = commands.getoutput("whoami") 

В UNIX он возвращает ваше имя пользователя, но в Windows он возвращает группу вашего пользователя, косую черту, ваше имя пользователя.

UNIX возвращает: «имя пользователя»

Windows возвращает: «домен / имя пользователя»

Это интересно, но, вероятно, не идеально, если вы все равно что-то делаете в терминале . в этом случае вы, вероятно, будете использовать os.system для начала. Например, некоторое время назад мне нужно было добавить своего пользователя в группу, что я и сделал (это в Linux, заметьте)

import os os.system("sudo usermod -aG \"group_name\" $(whoami)") print "You have been added to \"group_name\"! Please log out for this to take effect" 

Мне кажется, что легче читать, и вам не нужно импортировать pwd или getpass.

Я также чувствую, что наличие «домен / пользователь» может быть полезным в некоторых приложениях в Windows.

Источник

Оцените статью
Adblock
detector