Làm thế nào để có được tên của người dùng đã thực thi một tập lệnh bash là sudo?


17

Tôi muốn tạo một tập lệnh bash phải được thực thi bằng sudo nhưng nên tính đến tên của người dùng không phải sudo đã thực thi nó. Vì vậy, nếu người dùng bobchạy sudo ./myscript.shtôi muốn myscript.shbiết boblà người đã thực hiện nó.

Hãy nhìn vào bên trong myscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

Làm thế nào tôi có thể biết tên của người dùng đã sinh ra quá trình? Cụ thể hơn, tôi nên sử dụng cái gì thay vì whoamiđể có được bobvà không root?


Đó không phải là một kịch bản hợp lệ, tôi nghĩ bạn có ý đó USER=$(whoami). Lưu ý rằng USERđã tồn tại như một biến nội bộ shell. Ngoài ra, nếu đó là tập lệnh bash, đừng chạy nó bằng cách sử dụng shtập hợp các tính năng tương thích POSIX.
nyuszika7h

tại sao không chỉnh sửa? cố định ngay bây giờ
marcio

Điều đó quá tầm thường, các chỉnh sửa cần có ít nhất 6 ký tự, ít nhất là các ký tự được đề xuất.
nyuszika7h

Vâng tôi hiểu. Cảm ơn các mẹo: DI thường đặt một hashbang như thế này #!/usr/bin/env bashtrên các tập lệnh bash của tôi.
marcio

Hashbang bị bỏ qua nếu bạn gọi nó rõ ràng bằng shhoặc một cái gì đó khác.
nyuszika7h

Câu trả lời:


28

Tôi không chắc nó chuẩn như thế nào, nhưng ít nhất trong các hệ thống Ubuntu sudođặt các biến môi trường sau (trong số các biến khác - xem ENVIRONMENTphần của trang sudo):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

ví dụ,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver

Hoạt động như mong đợi trên tất cả các nền tảng tôi đã thử nghiệm: debian, fedora (redhat) và freebsd. Cảm ơn!
marcio

Xác nhận làm việc trên máy Mac.
SiKing

Hoạt động trên Ubuntu là tốt.
Andi Jay

9

Nếu bạn muốn nó hoạt động mà không có sudotốt, sử dụng ${SUDO_USER:-$USER}. Ví dụ:

printf '%s\n' "${SUDO_USER:-$USER}"

Giải trình

${var:-val}sẽ mở rộng sang $var, trừ khi nó không được đặt hoặc trống, trong trường hợp đó, nó sẽ mở rộng sang val.

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.