มีวิธีพกพาในการรับชื่อผู้ใช้ปัจจุบันใน Python หรือไม่?


597

มีวิธีการพกพาเพื่อรับชื่อผู้ใช้ปัจจุบันใน Python (เช่นที่ทำงานภายใต้ Linux และ Windows อย่างน้อย) มันจะทำงานเช่นos.getuid:

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

ฉัน googled ไปรอบ ๆ และรู้สึกประหลาดใจที่จะไม่หาคำตอบที่ชัดเจน (แม้ว่าบางทีฉันอาจเป็นเพียง googling ไม่ดี) pwdโมดูลให้เป็นวิธีที่ค่อนข้างง่ายที่จะประสบความสำเร็จภายใต้นี้บอกว่าลินุกซ์ แต่มันก็ไม่ได้อยู่บน Windows ผลการค้นหาบางส่วนชี้ให้เห็นว่าการได้รับชื่อผู้ใช้ภายใต้ Windows อาจมีความซับซ้อนในบางสถานการณ์ (เช่นทำงานเป็นบริการของ Windows) แม้ว่าฉันจะยังไม่ได้ยืนยันก็ตาม


มันไม่ทำงานบนกล่อง Linux ของฉัน!
Riccardo

5
import pwd, os; print pwd.getpwuid(os.getuid()).pw_gecosหรือimport pwd, os; print pwd.getpwuid(os.getuid()).pw_name
chown

getusername () ไม่ใช่วิธีที่ถูกต้องในโมดูล os Python: docs.python.org/2.7/library/os.html
Matt Bruzek

17
@ MattBruzek นั่นคือประเด็นของ OP ที่นั่น เขาจินตนาการว่าฟังก์ชั่นดังกล่าวสามารถเรียกใช้ถ้ามีอยู่
กระตุ้น

คำตอบ:


836

ดูโมดูลgetpass

import getpass
getpass.getuser()
'kostya'

มีจำหน่าย: Unix, Windows


ps ต่อความคิดเห็นด้านล่าง " ฟังก์ชั่นนี้ดูที่ค่าของตัวแปรสภาพแวดล้อมต่าง ๆ เพื่อกำหนดชื่อผู้ใช้ดังนั้นฟังก์ชั่นนี้ไม่ควรใช้เพื่อจุดประสงค์ในการควบคุมการเข้าถึง (หรืออาจเป็นวัตถุประสงค์อื่นใด ). "


100
ปรากฏว่าฟังก์ชั่นนี้ดูค่าของตัวแปรสภาพแวดล้อมต่างๆเพื่อกำหนดชื่อผู้ใช้ ดังนั้นจึงไม่ควรใช้ฟังก์ชันนี้เพื่อจุดประสงค์ในการควบคุมการเข้าถึง (หรืออาจเป็นเพื่อวัตถุประสงค์อื่นเนื่องจากจะอนุญาตให้ผู้ใช้ทำการแอบอ้างเป็นบุคคลอื่น)
Greg Hewgill

25
ไม่มีอะไรผิดปกติกับ getpass.getuser () เนื่องจากไม่ได้อ้างสิทธิ์ในการตรวจสอบสิทธิ์ผู้ใช้ วัตถุประสงค์ของฟังก์ชั่นนี้คือการกำหนดว่าใครเป็นผู้ใช้ที่อ้างว่าเป็นโดยไม่ถามผู้ใช้โดยตรง
Walker Hale IV

7
ที่ไม่ทำงานถ้าคุณทำ su $ echo $ USER hithwen $ su julia รหัสผ่าน: $ echo $ USER julia $ python >>> นำเข้า getpass >>> getpass.getuser () 'hithwen'
hithwen

6
@GregHewgill ยกระดับจุดที่ดีมาก แต่แน่นอนว่าการค้นหาชื่อผู้ใช้ด้วยวิธีที่ไม่ได้รับการพิสูจน์ตัวตนอย่างง่ายเช่นนี้มีแอปพลิเคชั่นบางตัว กรณีการใช้งานปัจจุบันของฉัน: ติดแท็กทรัพยากรการทดสอบที่ใช้ร่วมกันบางส่วนด้วยชื่อผู้ใช้เพื่อให้ล้างได้ง่ายในภายหลัง (ดังนั้นจึงง่ายกว่าที่จะคิดว่าใครเป็นระเบียบอยู่ที่ไหน)
เลื่อนลอย

16
และฉันเห็นด้วยกับ @GregHewgill สำหรับจุดประสงค์ในการควบคุมการเข้าถึง แต่ไม่เห็นด้วยกับ 'จุดประสงค์อื่น' โดยสิ้นเชิง - นั่นก็เหมือนกับการพูดว่า "อย่าใช้ $ USER ในเชลล์สคริปต์" จุดที่ดีเกี่ยวกับการควบคุมการเข้าถึง แต่มีการใช้งานอื่น ๆ อีกมากมายที่ไม่เกี่ยวข้องกับการตรวจสอบสิทธิ์
nevelis

119

ทางออกที่ดีที่สุดของคุณคือการรวมos.getuid()กับpwd.getpwuid():

import os
import pwd

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

อ้างถึงเอกสาร pwd สำหรับรายละเอียดเพิ่มเติม:

http://docs.python.org/library/pwd.html


51
หรืออีกวิธีหนึ่ง pwd.getpwuid(os.getuid()).pw_name(เล็กน้อยดีกว่าการอ่าน):
Brian M. Hunt

6
Windows ทำอะไรได้บ้าง บางทีเราอาจลองทำสิ่งนี้และหากล้มเหลวให้ถอยกลับไปที่เมธอด 'getpass / env var' ที่เส็งเคร็ง
Jonathan Hartley

2
นี่เป็นวิธีที่ถูกต้องหากคุณจำเป็นต้องได้รับชื่อผู้ใช้ทั้งที่มีและไม่มีการลงชื่อเข้าใช้
Derrick Zhang

5
@JonathanHartley:ImportError: No module named pwd
Justin

1
วิธีนี้เป็นวิธีในระบบยูนิกซ์เหมือนมากดีกว่าคำตอบที่คอนสแตนติ Tenzin เพราะมันจะจัดการกับsudoกรณีที่ถูกต้อง (ฉันรู้ว่า OP didn '; ไม่ขอ ssytems เหมือนยูนิกซ์)
halloleo

86

คุณยังสามารถใช้:

 os.getlogin()

29
บน linux นั้น getlogin () จะส่งคืนชื่อของ "ผู้ใช้ที่ล็อกอินบนเทอร์มินัลการควบคุมของกระบวนการ" ดังนั้นจึงล้มเหลวเมื่อไม่มีเทอร์มินัลการควบคุมเช่นในแอปพลิเคชัน mod_python
Vebjorn Ljosa

23
ไม่พร้อมใช้งานสำหรับ Windows
Walker Hale IV

3
หากคุณใช้ su สิ่งนี้จะไม่ส่งคืนผู้ใช้ปัจจุบัน แต่เป็นผู้ใช้ที่ล็อกอินในตอนแรก
Trevor Allred

4
ทำงานบน windows ... Python 3.4.1 (v3.4.1: c0e311e010fc, 18 พฤษภาคม 2014, 10:38:22) [MSC v.1600 32 บิต (Intel)] บน win32 ประเภท "ช่วย", "ลิขสิทธิ์", "เครดิต" หรือ "ใบอนุญาต" สำหรับข้อมูลเพิ่มเติม >>> ระบบปฏิบัติการนำเข้า; os.getlogin () 'jrb'
Naib

5
มีเฉพาะใน Windows สำหรับ Python 3.x
Zitrax

71

คุณอาจใช้:

os.environ.get('USERNAME')

หรือ

os.environ.get('USER')

แต่มันจะไม่ปลอดภัยเพราะตัวแปรสภาพแวดล้อมสามารถเปลี่ยนแปลงได้


18
os.getenv(...)os.environ[...]จะเลิกในความโปรดปรานของ
Mike Graham

11
ไม่ควรเป็น USER แทนที่จะเป็น USERNAME
Karl Bartel

7
@MikeGraham os.getenvดูเหมือนจะไม่คัดค้าน ..
dbr

4
ใช่ USER vs USERNAME เป็นสิ่งที่ไม่สามารถพกพาได้ดังนั้นจึงไม่มีคำตอบที่ถูกต้อง
Peter M

2
USERNAME สำหรับ Windows USER ใช้สำหรับ Linux
Sabrina

22

สิ่งเหล่านี้อาจใช้ได้ ฉันไม่รู้ว่าพวกเขาจะทำงานอย่างไรเมื่อทำงานเป็นบริการ พวกเขาไม่ได้พกพา แต่นั่นคือสิ่งที่os.nameและifคำสั่งสำหรับ

win32api.GetUserName()

win32api.GetUserNameEx(...) 

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


30
คำตอบนี้มีประโยชน์อย่างน้อยกับคำตอบ unix-only upvoted 25 คะแนนที่ไร้ประโยชน์
Tom B

3
> "อย่างน้อยก็มีประโยชน์" เห็นด้วย สันนิษฐานว่าคำตอบที่ถูกต้องคือการรวมกันของทั้งสอง
Jonathan Hartley

หากคุณติดกับ python 2 บน Windows นี่เป็นวิธีเดียวที่จะปลอดภัย วิธีอื่นทั้งหมดสามารถถูกหลอกได้ด้วยการรันSET USERNAME=FAKEก่อนคำสั่ง python ของคุณ
CodeKid

21

หากคุณต้องการสิ่งนี้เพื่อให้ได้ผู้ใช้ตามบ้านด้านล่างอาจถือว่าเป็นอุปกรณ์พกพา (อย่างน้อย win32 และ linux อย่างน้อย) ส่วนหนึ่งของห้องสมุดมาตรฐาน

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

นอกจากนี้คุณยังสามารถแยกสตริงดังกล่าวเพื่อรับส่วนประกอบเส้นทางสุดท้ายเท่านั้น (เช่นชื่อผู้ใช้)

ดู: os.path.expanduser


9
โฮมไดเรกทอรีของใครบางคนไม่ได้สะท้อนชื่อผู้ใช้ของพวกเขาเสมอไป
dreamlax

สิ่งนี้ใช้ได้กับทั้ง Linux และ Windows
Sabrina

น่าเสียดายถ้าคุณตั้งค่าตัวแปร HOME ใน Windows สิ่งนี้จะคืนค่านั้น
GLRoman

15

สำหรับฉันแล้วการใช้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

ลินุกซ์:

บ้านของผู้ใช้ Dir: / root

ชื่อผู้ใช้: ราก

ไม่จำเป็นต้องติดตั้งโมดูลหรือส่วนขยายใด ๆ


16
วิธีนี้เป็นวิธีที่ฉลาด แต่มีข้อสันนิษฐานบางอย่างที่ไม่จริงเสมอไป ไม่มีข้อ จำกัด ที่ต้องการให้ชื่อผู้ใช้ปรากฏในเส้นทาง homedir บน Linux มันเกิดขึ้นเป็นกรณีส่วนใหญ่ แต่ดูแลระบบสามารถกำหนด homedir ของผู้ใช้สิ่งที่พวกเขาต้องการ
Joe Holloway

การตั้งค่าตัวแปร HOME เอาชนะสิ่งนี้
GLRoman

11

รวมกัน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()

9

สำหรับ UNIX อย่างน้อยก็ใช้งานได้ ...

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

แก้ไข: ฉันเพิ่งค้นหามันและทำงานบน Windows และ UNIX:

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

ใน UNIX จะคืนชื่อผู้ใช้ของคุณ แต่สำหรับ Windows จะส่งคืนกลุ่มผู้ใช้ของคุณทับชื่อผู้ใช้ของคุณ

-

IE

UNIX ส่งคืน: "ชื่อผู้ใช้"

Windows ส่งคืน: "domain / ชื่อผู้ใช้"

-

มันเป็นเรื่องที่น่าสนใจ แต่อาจจะไม่เหมาะถ้าคุณไม่ทำอะไรในเทอร์มินัลอยู่ดี ... ซึ่งในกรณีนี้คุณอาจจะใช้os.systemเพื่อเริ่มต้นด้วย ตัวอย่างเช่นเมื่อไม่นานมานี้ฉันต้องการเพิ่มผู้ใช้ของฉันลงในกลุ่มดังนั้นฉันจึงทำได้

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


1
WIndows ส่งคืนสินค้าdomain/user ไม่ได้group/user
RealHow ถึง

4
โมดูลคำสั่งไม่ทำงานบน Windows มันเป็นโมดูลเฉพาะ UNIX (ดูdocs.python.org/2/library/commands.html ) ตอนนี้เลิกใช้แล้วและแนะนำให้ใช้กระบวนการย่อยแทน user = subprocess.check_output("whoami").replace("\r\n", "")
ConnectedSystems

k; จากนั้นใช้กระบวนการย่อย ... jeez
dylnmc

2 ข้อสังเกต command.whoami ทำได้ดีมากแม้ในบริบทของบริการที่ใช้งานภายใต้ชื่อผู้ใช้อื่น คือมี chpst -u nobody python ./manage.py celerycam --pidfile=/var/run/celerycam/celerycam.pid ผมได้ไม่มีใคร ประการที่สองuser = subprocess.check_output("whoami").strip() เป็นแบบพกพามากขึ้นกว่าแทนที่สายฟีดด้านบน commandsvs subprocessดูเหมือนว่า nitpicky แต่คำสั่งหายไปจาก python 3
JL Peyret

5

ฉันเขียนโมดูล plx เมื่อไม่นานมานี้เพื่อรับชื่อผู้ใช้แบบพกพาใน Unix และ Windows (เหนือสิ่งอื่นใด): http://www.decalage.info/en/python/plx

การใช้งาน:

import plx

username = plx.get_username()

(ต้องใช้ส่วนขยาย win32 บน Windows)


4

ใช้ libs หลามมาตรฐานเท่านั้น:

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"])()

1
getpass ยังเป็น lib มาตรฐาน
jodag

ไม่ทำงานสำหรับฉันใน win10, python3.7.4 มันบ่นเกี่ยวกับ 'USER' ไม่พบในตัวแปรสภาพแวดล้อมที่ฉันเดา ฉันเดาว่า getpass เป็นทางเลือกที่ดีกว่าอยู่ดี
Rika

3

คุณสามารถรับชื่อผู้ใช้ปัจจุบันบน Windows ได้โดยไปที่ Windows API ถึงแม้ว่ามันจะค่อนข้างยุ่งยากในการเรียกใช้ผ่าน ctypes FFI ( GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid )

ผมเขียนโมดูลขนาดเล็กที่สามารถทำตรงนี้จากงูหลามgetuser.py การใช้งาน:

import getuser
print(getuser.lookup_username())

มันทำงานได้ทั้งบน Windows และ * ระวัง (หลังใช้pwdโมดูลตามที่อธิบายไว้ในคำตอบอื่น ๆ )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.