2010-08-19 25 views
77

Nếu tôi tạo ra các kịch bản conatining /root/bin/whoami.sh:xác định người sử dụng trong một kịch bản bash gọi bằng sudo

#!/bin/bash 
whoami 

Và kịch bản này được gọi bởi một người dùng với một sudo cấu hình đúng cách, nó sẽ cho biết

root 

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

TIA, Bert

Trả lời

44

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

#!/bin/bash 
echo $SUDO_USER 
whoami 
+1

Điều lạ: 'sudo env' hiển thị' SUDO_USER' nhưng 'sudo echo $ SUDO_USER' không in được gì ... – Job

+0

@ Job khi gọi sudo? Bởi vì nó không có ý nghĩa khác ... –

+15

công việc, điều này không phải là lạ, nó dự kiến. trong 'sudo echo $ SUDO_USER', bash đang đánh giá $ SUDO_USER ** trước khi thực thi sudo. thử kịch bản được đăng trong giải pháp này, nó hoạt động. –

0

Rất tiếc, hệ thống phân biệt giữa real and effective UIDs, nhưng tôi không thể tìm thấy chương trình nào xuất ở cấp độ vỏ.

-3

thử:
id -urn

+0

điều này trả về gốc khi chạy với sudo, đó là toàn bộ vấn đề OP đang cố gắng giải quyết – Nathan

96

$ 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 $SUDO_USER.

Thay vì lệnh whoami sử dụng who am i. Điều này chạy lệnh who đượ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, làm được điều này để có được chỉ là người sử 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ó cũng giống như tuyên bố 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 tác phẩm này bất kể sudo hoặc sudo su [whatever]. Nó cũng hoạt động bất kể số lần susudo được gọi.

+2

Có, +1, 'ai là i' là câu trả lời ở đây. –

+28

Thay thế cho 'ai là i' là' người mẹ thích'. Lựa chọn của bạn. – wchargin

+2

'who' trả về 2 dòng cho tôi, cả hai đều chứa tên của tôi, và' ai là i' không trả về gì cả. Bất kỳ giúp đỡ? –

7

Sau đây là cách để có được tên người dùng của người được gọi là kịch bản không có vấn đề nếu 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` 
+5

thậm chí ngắn hơn: 'user = $ {SUDO_USER: - $ (whoami)}' hoặc ['user = $ (logname)'] (http://stackoverflow.com/a/4597929/321973) –

2

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

Các vấn đề liên quan