2011-12-13 38 views
6

trong môi trường Linux (trong trường hợp của tôi là XUbuntu), có cách nào để tìm ra biến môi trường nào được truy cập bằng lệnh được chạy từ bảng điều khiển?Tìm hiểu biến môi trường nào được sử dụng bởi lệnh

Có thể tìm hiểu về các biến này, vì ai đó phải cung cấp các giá trị cho chương trình. Nhưng có một số phương pháp mặc định để làm điều này?

Chương trình được đề cập ở đây là xprintidle.

Cảm ơn trước, Jost

Trả lời

7

Giả sử bạn muốn biến thực sự được sử dụng bởi một số quá trình chạy một lệnh, bạn có thể sử dụng ltrace và tìm kiếm các cuộc gọi đến getenv

Tất nhiên, lập luận để getenv thể được tính toán (vì vậy bạn không thể dự đoán được nó).

Tuy nhiên, một số ứng dụng (cũ hoặc lạ) có thể sử dụng số toàn cầu environ hoặc đối số tùy chọn thứ ba cho main; và một số ứng dụng thậm chí thay đổi môi trường của chúng bằng cách sử dụng putenv, setenv hoặc unsetenv (tất cả 3 là các chức năng libc, không phải là nội trang hệ vỏ).

nhưng xprintidle chủ yếu tương tác với máy chủ Xorg. Tôi ngạc nhiên vì bạn đang mong đợi nó sử dụng nhiều biến môi trường (ngoại trừ DISPLAY).

+0

Một cái gì đó như thế này có vẻ là con đường để đi, nhưng có một vấn đề: Không có cuộc gọi đến getenv, nhưng tôi biết chắc chắn rằng một biến môi trường được truy cập (trong một cuộc gọi thư viện). Tuy nhiên, bằng cách sử dụng strace tôi nhận được "execve ("/usr/bin/xprintidle ", [" xprintidle "], [/ * 41 vars * /])" là cuộc gọi đầu tiên. Điều đó có nghĩa là, các biến không được tìm nạp thông qua getenv? – Jost

+1

Không - 'execve()' luôn là cách các chương trình được thực thi ('execl()' và bạn bè chỉ là trình bao bọc), và đối số thứ ba của nó là một mảng con trỏ của tất cả các biến môi trường. Bạn sẽ thấy cuộc gọi này trong mỗi và mọi strace của một chương trình thực hiện. – fge

+0

Tôi đã đề cập ** ltrace ** not * strace *; Chúng không giống nhau! –

3

Bạn có thực sự truy cập hoặc biến môi trường được xác định cho một quy trình không?

Đối với môi trường được xác định, bạn có thể sử dụng:

perl -pe 's,\00,\n,g' /proc/xxxx/environ

nơi xxxx là PID của tiến trình của bạn.

Đối với các biến được truy cập, bạn sẽ phải sử dụng một số thứ như ltrace và kiểm tra các cuộc gọi đến getenv().

+0

' ltrace' sẽ không giúp bạn, vì thực sự không có lý do gì để gọi 'getenv()' –

+0

Eh? Nếu bạn muốn truy cập vào giá trị của một biến môi trường, bạn * phải * gọi 'getenv()'! – fge

+0

hầu hết các chương trình truy cập môi trường bằng cách sử dụng 'getenv' để' ltrace'-ing nó thường (nhưng không phải luôn luôn) hữu ích. Xem câu trả lời của tôi. Một số chương trình có thể nhận được biến môi trường bằng cách sử dụng 'environ' hoặc đối số thứ ba cho' main'. Rất ít chương trình làm điều đó trong thực tế! –

0

Nếu bạn muốn danh sách các biến môi trường, thì được thực hiện bằng env

Nhưng việc xác định các biến được truy cập bởi các chương trình là không thể, bởi tất cả đều trôi qua như họ đang có.

0

Bạn có thể xem các biến môi trường được chuyển đến chương trình của mình bằng cách sử dụng lệnh printenv. Một cách mà chương trình có thể xem xét môi trường của họ là sử dụng cuộc gọi getenv, vì vậy bạn có thể sử dụng chương trình truy tìm hoặc mẹo LD_PRELOAD để kết thúc cuộc gọi đó và tìm ra những gì họ đang tìm kiếm.

Tuy nhiên, không phải tất cả các chương trình đều sử dụng getenv để xem môi trường của chúng. Nếu chương trình sử dụng sau định dạng (không phổ biến) cho chính, nó có thể nhìn vào các biến môi trường thông qua con trỏ envp:

int main(int argc, char *argv[], char *envp[]) { 
    /* ... */ 
} 

Ngoài ra, chương trình có thể được tiếp cận với môi trường thông qua các biến environ.

Có thể bạn sẽ có may mắn bằng cách truy tìm các cuộc gọi getenv, nhưng nó không đảm bảo --- nó khác nhau tùy theo chương trình.

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