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


154

Tôi có một phiên bản Linux mà tôi đã thiết lập trước đây. Khi tôi kích hoạt nó và đăng nhập vì rootcó 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_rcvà tất cả các kịch bản khởi động.
  • Tôi đã chạy findgrepvô ích.

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?


6
/etc/environmentlà một cái khác
derobert

8
/etc/env.d/*các tập tin. Nhưng làm grep -R "YOUR_VARIABLE" /etc/có lẽ là cách tốt nhất để tìm hiểu.
rozcietrzewiacz


@rozcietrzewiacz cách đơn giản nhất ... nếu biến thực sự nằm ở đâu đó dưới / etc / (như trong trường hợp của tôi); nếu bạn đăng nó dưới dạng câu trả lời, tôi sẽ upvote;)
Dòng

Câu trả lời:


55

Nếu bạn sử dụng envlệnh để hiển thị các biến, chúng sẽ hiển thị đại khái theo thứ tự 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 trong quá trình 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 setexportsẽ sắp xếp các biến của chúng theo thứ tự bảng chữ cái, để việc liệt kê không hữu ích.


1
Điều đó thật tuyệt ... ngoại trừ tôi đang cố gắng tìm hiểu những gì đang xóa biến môi trường (được đặt trong / etc / môi trường). :-) (Và vâng, ban đầu nó được đặt ... Tôi đang thêm các dòng trong các tập lệnh khác nhau để ghi lại nơi nó bị xóa ...)
Michael Scheper

128

Nếu zshlà vỏ đă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 cùng zsh) cùng với tên của tệp hiện đang được diễn giải.

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 scriptlệnh để giúp bạn lưu trữ toàn bộ đầu ra phiên shell hoặc cho bashcách tiếp cận, sử dụng 7> file.logthay vì 7>&2lưu trữ xtraceđầu ra file.logthay 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/environmenthoặ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ụ bắt đầu đăng nhập của bạn quản lý hoặc thậm chí sớm hơn trong một số kịch bản khởi động. Sau đó, find /etc -type f -exec grep -F THE_VAR {} +có thể giúp đỡ.


4
Ấn tượng và hữu ích, cảm ơn bạn. Đối với chúng tôi n00bs, bạn sẽ giải thích thêm một chút về chế độ và làm thế nào để chúng tôi thoát khỏi chế độ này đưa chúng tôi vào? Ví dụ, chúng ta không thể đơn giản chuyển grep đầu ra này.
Geoffrey Hale

5
@GeoffreyHale nếu bạn zsh -xl 2>&1, tức là hợp nhất các thông số stderr và stdout, bạn có thể grep như bình thường.
Rakesh

1
Có cách nào để làm điều này với fishvỏ?
Nick Sweeting

Ngay cả khi tôi sử dụng zsh -xl 2>&1, bằng cách nào đó tôi không thể grep bình thường. Rõ ràng đầu ra không chứa các dòng mới phù hợp hoặc một cái gì đó.
Xerus

Tôi nghĩ bạn chỉ có thể sử dụng PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), sau đó grep trên tệp ngẫu nhiên đó.
bd1251252

51

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

Hệ thống rộ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, 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

Người dùng cụ thể

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

31

@Cian đúng. Ngoà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ế VARIABLEbằng biến thích hợp bạn đang tìm kiếm:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
Thật đáng ngạc nhiên khi một câu trả lời có nội dung 'bạn không thể', được bao quanh bởi các câu trả lời 'có thể bạn có thể', thậm chí còn có rất nhiều ý kiến ​​trái chiều.
Michael Scheper

Tôi không thấy bất kỳ câu trả lời nào thực sự đưa ra cách xác định WHERE một biến đã được đặt. Có một số manh mối hữu ích, nhưng không có ai có thể thực hiện công việc.
Andrew Wagner

Điều này đã giải quyết thời gian của tôi. Thanx.
Hassan Raza

@MichaelScheper "bạn không thể" làm điều đó mà không tìm thấy / grep. sau này trong "bạn có thể" được mô tả cách thực hiện SỬ DỤNG grep
Dòng

23

Nếu bạn đặt set -xở của bạn .profilehoặc .bash_profile, tất cả các lệnh shell tiếp theo sẽ được đăng nhập để sai số chuẩn và bạn có thể thấy nếu một trong số họ đặt các biến này. Bạn có thể đặt set -xở trên cùng /etc/profileđể theo dõi nó là tốt. Đầ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ư thế exec 2>/tmp/profile.log.

Nếu hệ thống của bạn sử dụng PAM, hãy tìm các pam_envyêu cầu tải trong /etc/pam.confhoặ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.conftrê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 dòng bắt đầu bằng ENV_).


5

Kiểm tra tập lệnh khởi động của bạn để biết các tệp mà 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 bên cạnh /etc$HOME.


2

Đối với zshngười dùng, 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 một cái gì đó.

zsh -o SOURCE_TRACE

0

các 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


1
Các biến môi trường không được lưu trữ trong /etc/profile, bạn có thể định nghĩa chúng ở đó toàn hệ thống, ví dụ như bashkhi được sử dụng làm vỏ đăng nhập. Chúng được lưu trữ bởi tiến trình shell sau khi đọc các định nghĩa từ các tệp và / hoặc dòng lệnh.
Anthon

-2

Ví dụ: nếu bạn muốn tìm biến HISTFILE và giá trị của nó hoặc muốn biết biến nào được xác định về lịch sử thì bạn sẽ nhập biến này vào trình bao:

set | grep HIST
env | grep HIST
printenv | grep HIST

nếu bạn đã biết tên, tại sao không : echo "$HISTFILE"?
Jeff Schaller

bởi vì, chúng tôi muốn tìm trong đó biến $ HISTFILE được xác định. Ngoài ra nếu tôi muốn biết biến nào được xác định lịch sử abou
Vusal Aliyev

2
Thật không may, setkhông cho bạn biết tập tin nào xác định biến.
Jeff Schaller
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.