Nhận biến môi trường của người dùng khác [đã đóng]


23

Có cách nào để tôi có thể thấy biến môi trường của người dùng khác không? Tôi muốn làm điều đó với quyền root, vì vậy quyền sẽ không phải là vấn đề tôi đoán.

Đối với bản thân người dùng, tôi sử dụng echo $PATHhoặc set | grep PATH(hoặc setkhi tôi không nhớ tên biến). Điều gì sẽ là một hướng dẫn tương tự cho một người dùng khác?

Đối với những gì nó có giá trị, tôi trên Ubuntu Server 13.04.


4
Người dùng không có biến môi trường, quy trình làm. Các quy trình được thực thi bởi một người dùng không phải tất cả đều có cùng một môi trường. Vấn đề gì bạn đang cố gắng giải quyết?
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles chẳng hạn, tôi muốn biết thư mục MAIL mà người dùng có. Tôi có thể đăng nhập như người dùng đó, sau đó làm echo $MAIL, nhưng tôi nghĩ có thể có một phím tắt.

3
Điều đó vẫn không xác định câu hỏi hữu ích (và ví dụ: câu trả lời bạn đã chấp nhận có thể hoặc không hoạt động tùy thuộc vào rất nhiều yếu tố). Bạn đang tìm kiếm vị trí hộp thư mặc định? Bạn đang tìm kiếm vị trí mà người dùng thực sự nhận được thư cục bộ của mình (có thể khác và có thể không tồn tại, nếu người dùng có a .forward)? Người dùng thường đặt một vài biến trong .profiletệp cấu hình của họ hoặc các tệp khác và không có cách nào để liệt kê tất cả chúng một cách đáng tin cậy. Một lần nữa, vấn đề gì bạn đang cố gắng giải quyết?
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


20

Một lựa chọn khác là sử dụng env. Chạy cái này như root:

sudo -Hiu $user env | grep $var

Ví dụ

sudo -Hiu terdon env | grep HOME
HOME=/home/terdon

1
Khi tôi đăng nhập bằng root và thực thi lệnh này cho tên người dùng chuẩn của mình, tôi nhận được HOME=/root. Đó là thư mục gốc của root, nhưng nó không phải là thư mục nhà chuẩn của tôi. Nếu bạn muốn biết môi trường mà một người dùng cụ thể sẽ nhận được khi anh ta đăng nhập, bạn phải chạy các kịch bản khởi động của vỏ đăng nhập của người dùng cụ thể này (và hãy nhớ rằng vỏ đăng nhập của anh ta có thể khác với vỏ đăng nhập của bạn).
Uwe

@Uwe trên hệ thống gì? Việc này ổn với tôi. Bạn có nghĩa là bạn đăng nhập như roottừ trình quản lý đăng nhập? Nó hoạt động tốt nếu tôi thả xuống một tty và đăng nhập như root.
terdon

Tôi đang sử dụng máy Debian. Tôi đăng nhập như uwe, mở một xterm, chạy env | grep HOMEvà nhận HOME=/home/uwe; Tôi thực hiện suvà sau đó một lần nữa env | grep HOMEvà nhận được HOME=/root, sau đó tôi chạy sudo -u uwe env | grep HOMEvà vẫn nhận được HOME=/root.
Uwe

@uwe lạ. Tôi cũng đang sử dụng máy Debian (LMDE), tôi đã thực hiện chính xác quy trình mà bạn đã mô tả (thậm chí được sử dụng xtermthay vì thiết bị đầu cuối thông thường của tôi) và nhận được kết quả mong đợi.
terdon

Theo hướng dẫn, chỉ sudođặt biến HOME nếu -Htùy chọn có mặt hoặc nếu mục nhập tương ứng /etc/sudoersđược đặt. Có vẻ như các tập tin sudoers của chúng tôi khác nhau. Dù sao, nó có lẽ là một ý tưởng tốt để sử dụng -Hở đây, và có thể cũng có -i.
Uwe

2

Đối với một người dùng, bạn có thể làm như thế này:

su - <username> -c '. ~/.profile; echo $PATH'

Liệt kê $ PATH của tất cả người dùng:

for user in $(cat /etc/passwd | awk -F: '{print $1}'); do
  su - $user -c '. ~/.profile; printf "%s\n" "$PATH"'
done

@Camil Staps

. ~/.profiledo đó, đây là một mẹo tôi học được từ người yêu thích của tôi, Peteris Krumins. Ông giải thích mánh khóe ở đây . Có thể phiên bản bash sau này đã được xây dựng với tùy chọn NON_INTERACTIVE_LOGIN_SHELLS.


Cảm ơn! Đối với $PATHnó cũng hoạt động mà không có . ~/.profile; phần - nó để làm gì?

@CamilStaps Ý của bạn là "nó hoạt động" là gì? Có, bạn nhận được một giá trị $PATHngay cả khi không tìm nguồn cung ứng ~/.profile, nhưng gần như chắc chắn đó không phải là giá trị mà bạn muốn (= giá trị mà người dùng này sẽ thấy khi đăng nhập). Ngay cả nguồn cung cấp ~/.profilekhông hoàn toàn đáng tin cậy, vì người dùng có thể sử dụng shell có tệp khởi động khác với ~/.profile.
Uwe

@ Chúng tôi có cùng một đầu ra mà không có, nhưng tôi đoán đó chỉ là sự trùng hợp ngẫu nhiên.

Bạn đang cho rằng người dùng không sử dụng csh.
glenn jackman

@CamilStaps Câu hỏi đầu tiên là liệu người dùng cụ thể đó có sửa đổi PATH của mình không ~/.profile. Nhưng trong mọi trường hợp, hành vi của sudocó thể được cấu hình khá nhiều /etc/sudoers(xem thảo luận của tôi với terdon), vì vậy khi hệ thống của chúng tôi hoạt động khác đi, điều đó có thể do sự khác biệt trong các tệp cấu hình.
Uwe

0

từ root bạn có thể su -đến người dùng và sau đó grep biến môi trường mà bạn muốn xem:

su - <username> -c 'echo $PATH'


vì một số lý do, điều này không phù hợp với tôi, ngay cả khi lệnh được thực thi như một người dùng khác. Tôi đã kết thúc bằng cách sử dụng "env", vì vậy sth như runuser -l <username> -c "env | grep <var>" | cut -d '=' -f 2hoạt động tốt cho tôi. Nếu bạn không root, cần phải có tiền tố lệnh sudo.
Andrei-Niculae Petre
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.