Xác định người dùng trong tập lệnh Bash được gọi bởi sudo


108

Nếu tôi tạo kịch bản /root/bin/whoami.sh chứa:

#!/bin/bash
whoami

và tập lệnh này được gọi bởi người dùng có sudo được định cấu hình đúng, nó sẽ cho biết

root

Có cách nào nhanh chóng để có được người dùng thực sự trong một tập lệnh hay tôi sẽ phải dùng đến các tham số truyền cùng tên người dùng này?

Câu trả lời:


134

$ SUDO_USER không hoạt động nếu bạn đang sử dụng sudo su -.
Nó cũng yêu cầu nhiều lần kiểm tra - nếu $USER == 'root'sau đó nhận được$SUDO_USER .

Thay vì whoamisử dụng lệnh who am i. Thao tác này chạy wholệnh được lọc cho phiên hiện tại. Nó cung cấp cho bạn nhiều thông tin hơn bạn cần. Vì vậy, hãy làm điều này để chỉ người dùng:

who am i | awk '{print $1}'

Ngoài ra (và đơn giản hơn) bạn có thể sử dụng logname. Nó làm điều tương tự như câu lệnh trên.

Điều này cung cấp cho bạn tên người dùng đã đăng nhập vào phiên.

Những hoạt động này không phụ thuộc vào sudohoặc sudo su [whatever]. Nó cũng hoạt động bất kể bao nhiêu lần susudođược gọi.


2
Có, +1, who am ilà câu trả lời ở đây.
Joe Kearney

43
Thay thế cho who am iwho mom likes. Lựa chọn của bạn.
tiền ký quỹ

3
whotrả về 2 dòng cho tôi, cả hai đều chứa tên tôi và who am ikhông trả về. Bất kỳ giúp đỡ?
Hosh Sadiq

7
Tôi đang sử dụng Ubuntu 16.04 và lệnh who am ikhông làm gì cả, nó có vẻ đơn giản who, vì vậy who | awk '{print $1}'hoạt động như mong đợi;)
daveoncode

1
Chỉ trong trường hợp bạn không có awkcài đặt, bạn cũng có thể sử dụng cut: who mom likes | cut -d' ' -f1 hoặc sedvì một lý do: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez

56

Tôi nghĩ $ SUDO_USER hợp lệ.

#!/bin/bash
echo $SUDO_USER
whoami

1
Điều kỳ lạ: sudo envhiển thị SUDO_USERnhưng sudo echo $SUDO_USERkhông in gì ...
Việc làm

17
công việc, điều này không lạ, nó được mong đợi. trong sudo echo $SUDO_USER, bash đang đánh giá $ SUDO_USER trước khi thực thi sudo. hãy thử tập lệnh được đăng trong giải pháp này, nó hoạt động.

@quadmore: Nếu bạn hài lòng với câu trả lời, đừng quên chấp nhận nó.
Công việc

2
Bạn cũng có thể sử dụng echo ${SUDO_USER:-$USER}để bắt cả hai sudovà không chạy sudo. Nhưng câu trả lời của evan logname có vẻ dễ dàng hơn
Tobias Kienzler

2
@TobiasKienzler - Và như evan đã chỉ ra, $SUDO_USERkhông hoạt động với sudo su -, nhưng lognameluôn hoạt động.
David Harkness

13

Đây là cách lấy tên người dùng của người đã gọi tập lệnh cho dù có sudo hay không:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

hoặc một phiên bản ngắn hơn

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
thậm chí ngắn hơn: user=${SUDO_USER:-$(whoami)}hoặcuser=$(logname)
Tobias Kienzler

3

who am i | awk '{print $1}'không làm việc cho tôi nhưng who|awk '{print $1}'sẽ phục vụ công việc


1
Không có trên máy chủ lưu trữ có nhiều người dùng có phiên
Roman Grazhdan 17/12/18


1

Sử dụng whoami, who am i, who, idhoặc $SUDO_USERkhông phải là ngay tại đây.

Trên thực tế, whokhông bao giờ là một giải pháp cho câu hỏi, vì nó sẽ chỉ liệt kê những người dùng đã đăng nhập, có thể là hàng chục ...

Trong mắt tôi, câu trả lời có giá trị duy nhất là việc sử dụng logname.

Hi vọng điêu nay co ich

Rob


0

Nếu đó là UID bạn đang tìm kiếm (hữu ích cho những trò tai quái về docker), thì điều này sẽ hoạt động:

LOCAL_USER_ID=$(id -u $(logname))
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.