it-swarm-vi.com

Làm thế nào để xác định một biến môi trường đến từ đâu?

Tôi có một phiên bản Linux mà tôi đã thiết lập cách đây một thời gian. Khi tôi kích hoạt nó và đăng nhập với tên root có một số biến môi trường mà tôi đã thiết lập nhưng tôi không thể nhớ hoặc tìm thấy chúng đến từ đâu.

  • Tôi đã kiểm tra ~/.bash_profile, /etc/.bash_rc và tất cả các tập lệnh khởi động.
  • Tôi đã chạy findgrep nhưng không có kết quả.

Tôi cảm thấy mình phải quên đi việc nhìn vào một nơi nào đó rõ ràng. Có một mẹo để tìm ra điều này?

177
Joel

Nếu bạn sử dụng lệnh env để hiển thị các biến, chúng sẽ hiển thị đại khái theo thứ tự mà chúng được tạo. Bạn có thể sử dụng điều này như một hướng dẫn nếu chúng được hệ thống thiết lập từ rất sớm khi khởi động hoặc bởi một tệp .profile hoặc tệp cấu hình khác sau này. Theo kinh nghiệm của tôi, các lệnh setexport sẽ sắp xếp các biến của chúng theo thứ tự bảng chữ cái, do đó việc liệt kê không hữu ích.

63
Ben Combee

Nếu zsh là Shell đăng nhập của bạn:

zsh -xl

Với bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Điều đó sẽ mô phỏng Shell đăng nhập và hiển thị mọi thứ đã được thực hiện (ngoại trừ trong các khu vực nơi stderr được chuyển hướng với zsh) cùng với tên của tệp hiện đang được giải thích.

Vì vậy, tất cả những gì bạn cần làm là tìm tên của biến môi trường trong đầu ra đó. (bạn có thể sử dụng lệnh script để giúp bạn lưu trữ toàn bộ đầu ra phiên Shell hoặc cho phương pháp bash, sử dụng 7> file.log thay vì 7>&2 để lưu trữ đầu ra xtrace thành file.log thay vì trên thiết bị đầu cuối).

Nếu biến của bạn không có trong đó, thì có lẽ Shell đã kế thừa nó khi khởi động, vì vậy nó đã được đặt trước như trong cấu hình PAM, trong ~/.ssh/environment hoặc những thứ được đọc khi khởi động phiên X11 của bạn (~/.xinitrc, ~/.xsession) hoặc đặt theo định nghĩa dịch vụ đã khởi động trình quản lý đăng nhập của bạn hoặc thậm chí sớm hơn trong một số tập lệnh khởi động. Rồi một find /etc -type f -exec grep -F THE_VAR {} + có thể giúp.

158
Stéphane Chazelas

Một số nơi để tìm kiếm đầu tiên:

Toàn hệ thống

  • /etc/environment: đặc biệt có nghĩa là cho các biến môi trường
  • /etc/env.d/*: biến môi trường, được chia thành nhiều tệp
  • /etc/profile: tất cả các loại tập lệnh khởi tạo
  • /etc/profile.d/*: tập lệnh khởi tạo
  • /etc/bashrc, /etc/bash.bashrc: có nghĩa là cho các hàm và bí danh

Cụ thể người dùng

  • ~/.bash_profile: khởi tạo để đăng nhập (bash-) shell
  • ~/.bashrc: khởi tạo cho tất cả các shell (bash-) tương tác
  • ~/.profile: được sử dụng cho tất cả các vỏ
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: tương tự cho các vỏ không bash
65
beetstra

@Cian đúng. Khác với việc sử dụng findgrep, bạn không thể làm gì nhiều để khám phá nơi nó đến. Biết rằng đó thực sự là một biến môi trường, tôi sẽ cố gắng tập trung tìm kiếm của bạn trong/etc/và thư mục chính của bạn. Thay thế VARIABLE bằng biến thích hợp bạn đang tìm kiếm:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Nếu bạn đặt set -x Trong .profile Hoặc .bash_profile, Tất cả các lệnh Shell tiếp theo sẽ được ghi vào lỗi tiêu chuẩn và bạn có thể xem liệu một trong số chúng có đặt các biến này không. Bạn có thể đặt set -x Ở đầu /etc/profile Để theo dõi nó. Đầu ra có thể rất dài dòng, vì vậy bạn có thể muốn chuyển hướng nó đến một tệp có nội dung như exec 2>/tmp/profile.log.

Nếu hệ thống của bạn sử dụng PAM, hãy tìm các yêu cầu tải pam_env Trong /etc/pam.conf Hoặc /etc/pam.d/*. Mô-đun này tải các biến môi trường từ các tệp được chỉ định hoặc từ mặc định của hệ thống nếu không có tệp nào được chỉ định (/etc/environment/etc/security/pam_env.conf Trên Debian và Ubuntu). Một tệp khác có định nghĩa biến môi trường trên Linux là /etc/login.defs (Tìm kiếm các dòng bắt đầu bằng ENV_).

Kiểm tra tập lệnh khởi động của bạn để biết các tệp chúng nguồn bằng cách sử dụng . (dấu chấm) hoặc source. Những tập tin đó có thể nằm trong các thư mục khác ngoài /etc$HOME.

Đối với người dùng zsh, việc theo dõi các tệp được truy cập (trong khi khởi động) có thể hữu ích, chúng không quá nhiều và người ta có thể xem qua từng cái một để tìm nơi xác định thứ gì đó.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

biến môi trường được lưu trữ trong tập tin/etc/profile, vì vậy hãy thực hiện thêm/etc/profile và chỉ cần kiểm tra các biến env bạn muốn và nếu/etc/profile không có thì lokk cho tệp .profile trong thư mục chính của bạn

0
Sarvesh Pawar