Какая команда корректно узнает имя пользователя в python
Перейти к содержимому

Какая команда корректно узнает имя пользователя в python

  • автор:

Is there a portable way to get the current username in Python?

What is a portable way (e.g. for Linux and Windows) to get the current user’s username? Something similar to os.getuid() would be nice:

The pwd module works for Unix only. Some people suggest that getting the username under Windows can be complicated in certain circumstances (e.g., running as a Windows service).

Jacob Gabrielson's user avatar

15 Answers 15

Look at getpass module

Availability: Unix, Windows

p.s. Per comment below "this function looks at the values of various environment variables to determine the user name. Therefore, this function should not be relied on for access control purposes (or possibly any other purpose, since it allows any user to impersonate any other)."

Mateen Ulhaq's user avatar

Combine os.getuid() with pwd.getpwuid() :

See pwd docs for more details.

Mateen Ulhaq's user avatar

You can also use:

Mateen Ulhaq's user avatar

Note that environment variables can be modified by the user, so this is a potential security vulnerability. With this method, an attacker can easily fake their username.

Mateen Ulhaq's user avatar

These might work. I don’t know how they behave when running as a service. They aren’t portable, but that’s what os.name and if statements are for.

ncica's user avatar

If you are needing this to get user’s home dir, below could be considered as portable (win32 and linux at least), part of a standard library.

Also you could parse such string to get only last path component (ie. user name).

Mateen Ulhaq's user avatar

To me using os module looks the best for portability: Works best on both Linux and Windows.

User’s home Dir: C:\Users\myuser

username: myuser

No need of installing any modules or extensions.

psutil provides a portable way that doesn’t use environment variables like the getpass solution. It is less prone to security issues, and should probably be the accepted answer as of today.

Under the hood, this combines the getpwuid based method for unix and the GetTokenInformation method for Windows.

Combined pwd and getpass approach, based on other answers:

For UNIX, at least, this works.

edit: I just looked it up and this works on Windows and UNIX:

On UNIX it returns your username, but on Windows, it returns your user’s group, slash, your username.

UNIX returns: "username"

Windows returns: "domain/username"

It’s interesting, but probably not ideal unless you are doing something in the terminal anyway. in which case you would probably be using os.system to begin with. For example, a while ago I needed to add my user to a group, so I did (this is in Linux, mind you)

I feel like that is easier to read and you don’t have to import pwd or getpass.

I also feel like having "domain/user" could be helpful in certain applications in Windows.

Полное имя пользователя Windows (в домене) с использованием Python

Я хочу получить полное имя пользователя компьютера с Windows в Python.

Я нашел эквивалентную пакетную команду:

который возвращает полное имя (например, Full Name John Doe ).

Я сделал следующий способ, используя subprocess но мне интересно, есть ли более естественный способ сделать это с некоторыми модулями Python.

1 ответ 1

Более прямой способ сделать это — запросить Active Directory. Вы выполняете поиск пользователя, а затем получаете атрибут displayName . (Это соответствует Full Name отображаемому в Windows.)

У вас есть два варианта здесь:

Использование библиотеки Python AD, например, pyad

Это очень специфично для Windows и требует библиотеки pywin32 . Он опирается на API-интерфейсы ADSI, поэтому будет работать только на Windows.

Как вы получите имя пользователя, зависит от вас. Вы можете использовать getpass.getuser() , os.environ[«USERNAME»] (только для Windows) и т.д.

Использование библиотеки Python LDAP, например, ldap3

Это соответствует стандартному протоколу LDAP с чистой реализацией Python, поэтому должен работать с любой клиентской ОС.

Использование необработанных запросов LDAP гораздо сложнее, чем абстракции ADSI. Я предлагаю вам прочитать документацию (в которой есть достойные учебные пособия) и найти дополнительные учебные пособия по взаимодействию с Microsoft AD через ldap3.

Обратите внимание, что одной из возможных проблем является то, что поиск по имени пользователя (CN) может привести к неправильному объекту. Можно иметь несколько объектов с одним и тем же CN в нескольких подразделениях. Если вы хотите быть более точным, вы можете использовать уникальный идентификатор, такой как SID.

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

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

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

задан 08 мая ’09, 19:05

Это не работает на моем компьютере с Linux! — Riccardo

import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecos or import pwd, os; print pwd.getpwuid(os.getuid()).pw_name — chown

getusername () не является допустимым методом в модуле Python os: docs.python.org/2.7/library/os.html — Matt Bruzek

@MattBruzek Это была точка зрения OP. Он представлял, как можно было бы вызвать такую ​​функцию, если бы она существовала. — poke

«имя пользователя» даже не переносное концепция. Рассмотрим microPython — если вы работаете непосредственно на оборудовании, такого нет. — Charles Duffy

13 ответы

смотреть на GetPass модуль

Доступность: Unix, Windows

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

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

В getpass.getuser () нет ничего плохого, поскольку он не претендует на аутентификацию пользователя. Цель функции — определить, кем выдает себя пользователь, не спрашивая его напрямую. — Уокер Хейл IV

Это не сработает, если вы сделали su. $ echo $ USER hithwen $ su julia Пароль: $ echo $ USER julia $ python >>> import getpass >>> getpass.getuser () ‘hithwen’ — Hithwen

@GregHewgill поднимает очень хороший вопрос, но действительно, определение имени пользователя простым неаутентифицированным способом, как это, имеет некоторые приложения. Мой текущий вариант использования: пометить некоторые общие ресурсы тестирования именем пользователя для легкой очистки позже. (Так легче понять, чей бардак чей.) — дрифтер

И я согласен с @GregHewgill в отношении контроля доступа, но полностью не согласен с «любыми другими целями» — это все равно что сказать: «Не используйте $ USER в сценарии оболочки». Замечательный пункт о контроле доступа, но есть много других применений, не связанных с аутентификацией. — Невелис

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

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

ответ дан 01 дек ’10, 14:12

В качестве альтернативы (немного приятнее читать): pwd.getpwuid(os.getuid()).pw_name . — Брайан М. Хант

Что он делает в Windows? Возможно, кто-то может попробовать это, а если это не удастся, вернуться к дрянным методам getpass / env var. — Джонатан Хартли

Это правильный способ, если вам нужно получить имя пользователя как при входе в систему, так и без нее. — Деррик Чжан

@ Джонатан Хартли: ImportError: No module named pwd — Джастин

Этот метод есть в unix-подобных системах много превосходит ответ Константина Тензина, потому что он обрабатывает sudo дело правильно. (Я знаю, что OP не запрашивал unix-подобных систем.) — Halloleo

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

ответ дан 20 окт ’09, 14:10

В Linux getlogin () возвращает имя «пользователя, вошедшего в систему на управляющем терминале процесса». Поэтому он не работает, когда нет управляющего терминала, например, в приложении mod_python. — Вебьорн Лйоса

Если вы использовали su, то это не вернет текущего пользователя, а будет возвращать пользователя, вошедшего в систему. — Тревор Оллред

работает на Windows . Python 3.4.1 (v3.4.1: c0e311e010fc, 18 мая 2014 г., 10:38:22) [MSC v.1600 32 бит (Intel)] на win32 Введите «help», «copyright», «кредиты» или «лицензия» для получения дополнительной информации. >>> import os; os.getlogin () ‘jrb’ — наиб

Он доступен только в Windows для Python 3.x. — Цитракс

Спасибо за это. Пользователь входа — это не совсем то, о чем просил плакат, но это то, что я искал. — Йорфус

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

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

ответ дан 05 окт ’18, 15:10

os.getenv(. ) устарел в пользу os.environ[. ] . — Майк Грэм

Разве это не должно быть USER вместо USERNAME? — Карл Бартель

@МайкГрэм os.getenv не кажется устаревшим . — DBR

Да, именно USER vs USERNAME — это именно то, что не переносимо, поэтому оно не дает правильного ответа. — Питер М

USERNAME для Windows, USER для Linux — Сабрина

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

Создан 29 июля ’19, 22:07

Этот ответ по крайней мере так же полезен, как (бесполезный) ответ только для unix с 25 голосами. — Том Б

> «По крайней мере так полезно» Согласен. По-видимому, правильный ответ — комбинация этих двух. — Джонатан Хартли

Если вы застряли на Python 2 в Windows, это единственный безопасный способ сделать это. Все остальные способы можно обмануть, запустив SET USERNAME=FAKE перед вашей командой python — КодДетский

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

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

ответ дан 05 дек ’13, 14:12

Чей-то домашний каталог не всегда отражает его имя пользователя. — снотворный

К сожалению, если вы установите переменную HOME в Windows, она вернет это значение. — GLRoman

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

Домашний каталог пользователя: C: \ Users \ myuser

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

Домашний каталог пользователя: / root

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

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

ответ дан 05 дек ’13, 14:12

Это умное решение, но некоторые предположения не всегда верны. Нет ограничений, которые требовали бы, чтобы имя пользователя появлялось в пути homedir в Linux. В большинстве случаев так бывает, но системный администратор может настроить домашний адрес пользователя на все, что он захочет. — Джо Холлоуэй

Установка переменной HOME побеждает это. — GLRoman

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

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

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

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

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

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

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

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

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

Как ввести имя в Python — учимся вводить данные по запросу

Ввести имя в Python

Как ввести имя в Python — учимся вводить данные по запросу

Попрактикуемся в решении простых но интересных задач:

  • Узнаем, как ввести имя в Python;
  • Научимся выводить полученное имя на экран;

Как ввести имя в Python

1. Выведем запрос на получение имени

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

Python послушно вывел нашу просьбу на экран:

2. Реализуем ввод имени

Теперь нам нужно разрешить пользователю вводить данные в программе. Поэтому предлагаю воспользоваться функцией input(). При вызове функции input(), программный поток останавливается до того момента, пока пользователь не введет данные через клавиатуру. Это то, что нам нужно! А чтобы была возможность использовать в дальнейшем полученные от пользователя данные, сразу же после получении имени, сохраним его в какой-нибудь переменной, например, в переменной user_name:

В среде разработки Anaconda результат работы этих двух строк выглядит так:

В вашей среде разработки окно для ввода информации может выглядеть иначе. Например, при работе в консоли, ожидание пользовательского ввода помечено мигающим прямоугольником. Однако, вид строки ввода не так важен, важно то, что программа перешла в режим ожидания ответа от пользователя!

Таким образом, мы справились с заданием и сохранили введенные пользователем данные в переменной user_name. Давайте теперь выведем имя пользователя на экран в контексте диалога:

Результат работы кода

Теперь при вводе имени «Великий Программист», на экран выводится строка:

Однако, в этом коде есть маленькая недоработка

Давайте проверим, что произойдет, если не вводить ничего, или же — ввести пробел вместо имени, и нажать «Enter»? В таком случае на экране появится некорректное приветствие:

Как это исправить?

Нам нужно добавить проверку на число введенных пользователем символов, предварительно удалив крайние пробелы. То есть нам нужно добавить условие:

Для этого мы воспользуемся циклом while (который означает «пока..» ), и конструкцией len(user_name.split()), которая возвращает длину строки без пробелов. Подробнее о работе функций split() и len() я расскажу чуть ниже, под кодом. А сейчас переведем сформулированное выше условие на язык Python:

Обратите внимание, что перед циклом while появилось объявление переменной user_name. Так как в цикле нам нужно посчитать длину строки user_name еще до того, как пользователь осуществит ввод, то создадим пустую строку user_name до вызова цикла. Так как длина этой строки равна нулю, то функция print() выведет на экран предложение познакомиться, и у пользователя появится шанс изменить длину user_name.

Подробнее о функциях split() и len():

Функция split() — удаляет пробелы в начале и в конце строки. Вызов функции split() для строки user_name осуществляется следующим образом:

Функция len() является специалистом по измерению длин в мире Python. Если мы передадим функции len() в качестве аргумента строку, оставшуюся после удаления пробелов, то узнаем длину этой строки:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *