programing

Python에서 현재 사용자 이름을 얻을 수 있는 휴대용 방법이 있나요?

minecode 2022. 9. 15. 22:14
반응형

Python에서 현재 사용자 이름을 얻을 수 있는 휴대용 방법이 있나요?

현재 사용자의 사용자 이름을 취득하는 휴대용 방법(Linux 및 Windows 등)은 무엇입니까?비슷한 것os.getuid()좋을 것 같아요.

>>> os.getuid()
42

>>> os.getusername()
'slartibartfast'

이 모듈은 Unix에서만 작동합니다.Windows 의 유저명을 취득하는 것은, 특정의 상황(예를 들면, Windows 서비스로서 실행)에서는 복잡할 가능성이 있다고 하는 사람도 있습니다.

모듈 보기

import getpass
getpass.getuser()
'kostya'

가용성:Unix, Windows


p.s. 아래 댓글에 "이 함수는 다양한 환경변수 값을 보고 사용자 이름을 결정합니다. 따라서 기능은 접근통제 목적(또는 어떤 사용자가 다른 사용자로 가장할 수 있기 때문에 다른 목적)에 의존해서는 안 됩니다."

결합하다os.getuid()와 함께pwd.getpwuid():

import os
import pwd

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

자세한 내용은 문서를 참조하십시오.

다음 항목도 사용할 수 있습니다.

os.getlogin()

Windows:

os.environ.get('USERNAME')

Linux:

os.environ.get('USER')

둘 다:

os.environ.get('USER', os.environ.get('USERNAME'))

사용자가 환경변수를 변경할 수 있으므로 잠재적인 보안 취약점이 될 수 있습니다.이 방법을 사용하면 공격자는 쉽게 사용자 이름을 위조할 수 있습니다.

이게 먹힐지도 몰라.서비스로 실행할 때 그들이 어떻게 행동하는지 모르겠어요.휴대할 수 있는 건 아니지만os.name그리고.if진술은 다음과 같습니다.

win32api.GetUserName()

win32api.GetUserNameEx(...) 

참조: http://timgolden.me.uk/python/win32_how_do_i/get-the-owner-of-a-file.html

유저의 홈 디어를 취득하기 위해서 이것이 필요한 경우는, 이하를 표준 라이브러리의 일부인 포터블(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]           

출력:

Windows:

사용자의 홈 Dir: C:\Users\myuser

사용자 이름: myuser

Linux:

사용자의 홈 Dir: /root

사용자 이름: root

모듈이나 확장을 설치할 필요가 없습니다.

합쳐진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()

psutil은 다음과 같은 환경 변수를 사용하지 않는 휴대용 방법을 제공합니다.getpass솔루션.보안 문제가 발생하기 쉬우므로 현재로선 일반적으로 받아들여지고 있는 답변이 될 것입니다.

import psutil

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

후드 아래에는, 이 조합이 있습니다.getpwuidunix 및 unix 기반 메서드GetTokenInformation메서드를 사용합니다.

UNIX의 경우 적어도 이 방법은...

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

edit: 방금 검색했는데 Windows 및 UNIX에서 작동합니다.

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

UNIX에서는 사용자 이름을 반환하지만 Windows에서는 사용자 그룹인 슬래시를 반환합니다.

--

예.

UNIX 반환: "username"

Windows에서 반환되는 항목: "domain/username"

--

" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "os.system가 있었기 , Linux에 있습니다.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 libs만 사용:

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

Windows(C 드라이브인 경우), Mac 또는 Linux에서 작동

또는 즉시 호출된 행을 1개 삭제할 수도 있습니다.

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

얼마 전 UNIX와 Windows에서 사용자 이름을 휴대할 수 있도록 하기 위해 plx 모듈을 작성했습니다.http://www.decalage.info/en/python/plx

사용방법:

import plx

username = plx.get_username()

(Windows에서 win32 확장 필요)

ctypes FFI(GetCurrentProcessOpenProcess)를 통해 호출하는 것은 다소 번거롭지만 Windows API를 통해 Windows에서 현재 사용자 이름을 얻을 수 있습니다.토큰GetTokenInformationLookupAccountSid).

Python getuser.py 에서 바로 할 수 있는 작은 모듈을 작성했습니다.사용방법:

import getuser
print(getuser.lookup_username())

와 합니다(후자는 를 합니다).*nix 는 Windows 를 사용합니다).pwd이치노

위 중 어느 것도 제 경우에는 효과가 없었습니다(실제 솔루션으로 스크롤 다운).
는 명령어를 할 때 입니다.sudo:

  • psutil★★★★★★★★★★★★★★★★★★:
$ 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!
  • getpass★★★★★★★★★★★★★★★★★★:
$ 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!
  • pwd+os.getuid★★★★★★★★★★★★★★★★★★:
$ 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!
  • os.getlogin동작은 조금 다르지만, 아직 잘못되어 있습니다.
$ 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!
  • os.getenv 수 있습니다.
$ 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 python3discloss.discloss.case.

실제 솔루션(휴대용 외)

솔루션은 조금 까다롭고 기본 루트 홈 디렉토리 위치에 의존하지만 다음과 같은 모든 경우에 작동합니다.

$ 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!

이거면 돼요.

import os
os.cmd("whoami")
print (os.cmd("whoami"))

언급URL : https://stackoverflow.com/questions/842059/is-there-a-portable-way-to-get-the-current-username-in-python

반응형