2008-09-18 45 views
5

Tôi đang cố gắng tìm tệp ảo chứa id người dùng hiện tại. Tôi đã nói rằng tôi có thể tìm thấy nó trong thư mục proc, nhưng không hoàn toàn chắc chắn rằng tập tin.Thư mục Unix Proc

Trả lời

8

Bạn thực sự muốn /proc/self/status, sẽ cung cấp cho bạn thông tin về quy trình hiện được thực hiện.

Dưới đây là một ví dụ:

$ cat /proc/self/status 
Name: cat 
State: R (running) 
Tgid: 17618 
Pid: 17618 
PPid: 3083 
TracerPid:  0 
Uid: 500 500 500 500 
Gid: 500 500 500 500 
FDSize: 32 
Groups: 10 488 500 
VmPeak:  4792 kB 
VmSize:  4792 kB 
VmLck:   0 kB 
VmHWM:  432 kB 
VmRSS:  432 kB 
VmData:  156 kB 
VmStk:  84 kB 
VmExe:  32 kB 
VmLib:  1532 kB 
VmPTE:  24 kB 
Threads: 1 
SigQ: 0/32268 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 0000000000000000 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
Cpus_allowed: 00000003 
Mems_allowed: 1 
voluntary_ctxt_switches: 0 
nonvoluntary_ctxt_switches: 3 

Bạn có thể muốn nhìn vào những con số đầu tiên trên dòng UID và GID. Bạn có thể tra cứu các số uid nào ánh xạ tới tên người dùng nào bằng cách xem /etc/passwd hoặc gọi các hàm có liên quan để ánh xạ uid thành tên người dùng bằng bất kỳ ngôn ngữ nào bạn đang sử dụng.

Lý tưởng nhất, bạn chỉ cần gọi hệ thống gọi getuid() để tra cứu thông tin này, thực hiện bằng cách xem /proc/ là phản tác dụng.

+1

Bạn không nên phân tích/etc/passwd vì hầu hết các hệ thống hiện đại đều sử dụng PAM và trong trường hợp đó, cơ sở dữ liệu người dùng có thể không phải là/etc/passwd, mà thay vào đó là NIS, máy chủ LDAP hoặc thứ gì đó hoàn toàn khác nhau. – jfs

3

Tôi không chắc chắn rằng có thể được tìm thấy trong /proc. Bạn có thể thử sử dụng hàm getuid() hoặc biến môi trường $USER.

6

Tại sao không chỉ sử dụng "id -u"?

2

Rất có thể, bạn muốn kiểm tra biến môi trường $USER. Các tùy chọn khác bao gồm getuidid -u, nhưng tìm kiếm /proc chắc chắn không phải là phương pháp hành động tốt nhất.

3

Theo như tôi biết, /proc dành riêng cho Linux, không có trong UNIX nói chung. Nếu bạn thực sự chỉ muốn UID hiện tại, hãy sử dụng hàm getuid() hoặc geteuid().

Nếu bạn biết bạn sẽ chỉ sử dụng Linux, bạn có thể khám phá cấu trúc phân cấp dưới /proc/self/*, nó chứa nhiều thông tin khác nhau về quy trình hiện tại. Hãy nhớ rằng /proc là "huyền diệu", đó là hệ thống tệp ảo mà hạt nhân phân phát và nội dung được tạo động tại thời điểm bạn yêu cầu. Do đó nó có thể trả về thông tin cụ thể cho quy trình hiện tại.

Ví dụ, hãy thử lệnh này: cat /proc/self/status

1

Trong /proc/process_id/status (ít nhất là trên Linux), bạn sẽ tìm thấy một dòng như sau:

Uid:  1000 1000 1000 1000

này cho bạn biết uid của người sử dụng mà theo tài khoản quá trình đang chạy.

Tuy nhiên, để tìm ra id quá trình của quy trình hiện tại, bạn sẽ cần một cuộc gọi hệ thống và sau đó bạn cũng có thể gọi getuid để nhận trực tiếp uid.

Chỉnh sửa: ah, /proc/self/status ... học điều gì đó mới mỗi ngày!

0

Những thứ bạn đang tìm kiếm có thể nằm trong các biến môi trường. Bạn cần phải cẩn thận về những gì bạn đang sử dụng shell khi bạn kiểm tra các biến môi trường. bash sử dụng "UID" trong khi tcsh sử dụng "uid" và trong trường hợp quan trọng là *nix. Tôi cũng thấy rằng tcsh đặt "gid" nhưng tôi không thể tìm thấy biến phù hợp trong bash.

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