Làm cách nào tôi có thể có được tên người dùng hiện tại trong Bash?


321

Tôi đang viết một chương trình ở Bash cần lấy tên người dùng.

Tôi đã nghe nói về một thứ được gọi whoami, nhưng tôi không biết nó làm gì hoặc sử dụng nó như thế nào.

Tôi sử dụng lệnh nào để có được tên người dùng hiện tại?


Dường như không có phương pháp nào được đề xuất cho đến nay hoạt động mà không dựa vào $ USER hoặc gọi một quy trình riêng biệt. Không có bash dựng sẵn để có được tên người dùng mà không cần gọi một quy trình riêng biệt?
ColinM

9
Khi bạn đã nghe một lệnh nhưng không chắc chắn cách sử dụng nó, kiểm tra man whoamithường là điểm dừng đầu tiên tốt để kiểm tra tài liệu.
Mark Stosberg

Câu trả lời:


470

Trên dòng lệnh, nhập

whoami

hoặc là

echo "$USER"

Để lưu các giá trị này vào một biến, hãy làm

myvariable=$(whoami)

hoặc là

myvariable=$USER

Tất nhiên, bạn không cần phải tạo một biến vì đó là những gì $USERbiến đó dành cho.


53
Chỉ cần lưu ý nhanh rằng $ USER và whoami trả về các giá trị khác nhau nếu bạn chạy lệnh thông qua ssh với tư cách là người dùng khác. whoami trả về người dùng hệ điều hành và $ USER trả về người dùng ssh.
Billman

4
@BillMan, điều đó có nghĩa là gì? Bạn có thể cung cấp một ví dụ?
Dejay Clayton

17
Trong một số trường hợp, $USERkhông được thiết lập ở tất cả. Tồi tệ hơn, nó chỉ là một biến môi trường, do đó người dùng có thể bị ghi đè:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif Bạn đề xuất giải pháp nào cho vấn đề này?
SethMMorton

3
@SethMMorton Tôi nhận ra rằng tôi đã làm cho vấn đề trở nên tồi tệ hơn bình thường. Tuy nhiên, để trả lời câu hỏi, sử dụng whoami(như bạn đề xuất) sẽ loại bỏ hoàn toàn vấn đề, giả sử các biến môi trường bị ghi đè là một vấn đề tiềm năng trong ngữ cảnh của bạn.
sitaktif

81

Một thay thế cho whoamiid -u -n.

id -usẽ trả về id người dùng (ví dụ 0 cho root ).


5
Trừ khi tôi nhầm đây sẽ là cách để đi nếu tính di động là mối quan tâm vì idlệnh -u-ncờ là một phần của posix

3
Đây thực sự nên là câu trả lời được chấp nhận. "${USER}"whoamicả hai đều phụ thuộc vào cách bạn đăng nhập. Cụ thể, shell đăng nhập và sudo sẽ đặt $ USER và whoamixem người dùng được đính kèm với stdin. Tuy nhiên, nếu bạn đang chạy một công việc hàng loạt từ cron hoặc bạn đang chạy một tập lệnh khởi động với tư cách là một người dùng khác với root, thì những thứ này sẽ xuất ra người dùng sai (root) hoặc không có gì cả. Câu trả lời này sẽ trả về giá trị chính xác bất kể bằng cách xem ID người dùng của quy trình.
Asfand Qazi

Điều này không hữu ích nếu bạn muốn tên người dùng thay vì id
Jonathan

3
nếu bạn đã thử lệnh trước khi thêm nhận xét sai sự thật, bạn sẽ thấy -nđối số in tên người dùng, giống như câu hỏi ban đầu được hỏi. xem phần sau: id -u -nbản in brett- ngay cả trên darwin.
Brett

20

Sử dụng lệnh Unix / Linux / BSD / MacOS tiêu chuẩn lognameđể truy xuất người dùng đã đăng nhập. Điều này bỏ qua môi trường cũng như sudo, vì đây là những phóng viên không đáng tin cậy. Nó sẽ luôn in tên người dùng đã đăng nhập và sau đó thoát. Lệnh này đã có từ khoảng năm 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Một bản hack mà tôi đã sử dụng trên Solaris 9 và Linux và hoạt động tốt cho cả hai:

ps -o user= -p $$ | awk '{print $1}'

Đoạn mã này in tên của người dùng với EUID hiện tại.

LƯU Ý: bạn cần Bash làm thông dịch viên ở đây.

Trên Solaris bạn có vấn đề với các phương thức, được mô tả ở trên:

  • idkhông chấp nhận -u-ntham số (vì vậy bạn sẽ phải phân tích đầu ra)
  • whoami không tồn tại (theo mặc định)
  • who am I chủ sở hữu in của thiết bị đầu cuối hiện tại (bỏ qua EUID)
  • $USERbiến chỉ được đặt chính xác sau khi đọc tệp hồ sơ (ví dụ /etc/profile:)

1
Tại sao bạn cần bash làm thông dịch viên? Không có gì trong dòng lệnh hiển thị dường như là cụ thể cho bất kỳ shell nào. Trong thực tế, tại sao thậm chí bao gồm các đường ống thông qua awk? Theo như tôi có thể nói, pslệnh của bạn là tất cả mọi thứ cần thiết để hiển thị chủ sở hữu của pid shell hiện tại.
ghoti

Đối với chúng ta là con người coi thường thông tin thừa là điều tự nhiên. Phần awk cô lập dữ liệu mong muốn-- cho các biến hoặc nói chung, máy tính không thể thực hiện các giả định bay ở mức độ thô sơ này.
BradChesney79

Trên Solaris, sử dụng command -p id(từ vỏ POSIX) hoặc /usr/xpg4/bin/id. Nói chung, trên Solaris, bạn muốn sửa đổi môi trường của mình để đặt mình vào môi trường POSIX (với một cái gì đó như PATH=getconf PATH` và chắc chắn chạy /usr/xpg4/bin/sh) để tránh bị mắc kẹt với các lệnh từ thập niên 70/80.
Stephane Chazelas

'ps: tùy chọn không xác định - o'
Anand Rockzz

12

Hai lệnh:

  1. id in id người dùng cùng với các nhóm. Định dạng:uid=usernumber(username) ...

  2. whoami cung cấp tên người dùng hiện tại


1
$ whoami không có sẵn như là một biến trong bash. Bạn cần phải làm $ (whoami) hoặc `whoami` để thực sự thực hiện lệnh whoami!
Rudolf Mayer

@RudolfMayer Tôi đã sửa nó
wjandrea

6

Khi quyền truy cập gốc (sudo) được yêu cầu, thường là 90% + khi sử dụng tập lệnh, các phương thức trong các câu trả lời trước luôn cung cấp cho bạn rootlàm câu trả lời.

Để có được người dùng "đăng nhập" hiện tại chỉ đơn giản như vậy, nhưng nó đòi hỏi phải truy cập các biến khác nhau: $SUDO_UID$SUDO_USER.

Chúng có thể được lặp lại:

echo $SUDO_UID
echo $SUDO_USER

Hoặc được chỉ định, ví dụ:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

Trong hệ điều hành Solaris tôi đã sử dụng lệnh này:

$ who am i     # Remember to use it with space.

Trên Linux- Ai đó đã trả lời điều này trong các bình luận.

$ whoami       # Without space

5

Đối với Bash , KornShell ( ksh), shv.v. Nhiều câu hỏi của bạn nhanh chóng được trả lời bởi:

man [function]

để lấy tài liệu cho hệ thống bạn đang sử dụng hoặc thường thuận tiện hơn:

google "người đàn ông chức năng"

Điều này có thể cho kết quả khác nhau đối với một số thứ mà Linux và Unix có sự khác biệt khiêm tốn.

Đối với câu hỏi này, chỉ cần nhập "whoami" trong vỏ của bạn.

Để kịch bản nó:

myvar=$(whoami)

2

Tên người dùng hiện tại có thể được nhận bằng Bash thuần với phần ${parameter@operator}mở rộng tham số (được giới thiệu trong Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

Các :built-in (từ đồng nghĩa của true) được sử dụng thay vì một biến tạm thời bằng cách thiết lập các đối số cuối cùng, được lưu trữ trong $_. Sau đó chúng tôi mở rộng nó ( \u) như thể nó là một chuỗi nhắc với Ptoán tử.

Điều này tốt hơn so với việc sử dụng $USER, vì $USERnó chỉ là một biến môi trường thông thường; nó có thể được sửa đổi, bỏ đặt, v.v. Ngay cả khi nó không cố ý làm xáo trộn, một trường hợp phổ biến vẫn không chính xác là khi người dùng được chuyển đổi mà không bắt đầu một vỏ đăng nhập ( sumặc định).


1

Trên hầu hết các hệ thống Linux, chỉ cần gõ whoami trên dòng lệnh sẽ cung cấp ID người dùng.

Tuy nhiên, trên Solaris, bạn có thể phải xác định ID người dùng, bằng cách xác định UID của người dùng đã đăng nhập thông qua lệnh bên dưới.

echo $UID

Khi đã biết UID, hãy tìm người dùng bằng cách khớp UID với /etc/passwdtệp.

cat /etc/passwd | cut -d":" -f1,3

mèo / etc / passwd | cắt -d ":" -f1,3 | grep $ UID | cắt -d ":" -f1
Andrew Taylor

-4

Nhận user_struct của tác vụ hiện tại

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
Câu hỏi là làm thế nào để có được tên người dùng trong tập lệnh bash. Câu trả lời này là về cách lấy ID người dùng số (không phải tên người dùng) từ mã C chạy bên trong nhân Linux (chẳng hạn như từ mô-đun hạt nhân Linux tùy chỉnh). Nó không phải là một câu trả lời cho câu hỏi đã được hỏi, nó là một câu trả lời cho một câu hỏi khác.
Simon Kissane
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.