Làm thế nào để có được thông tin dmidecode mà không có quyền root?


16

Tôi đang viết một chương trình hiển thị thông tin hệ thống khác nhau (trên hệ thống CentOS). Ví dụ: loại bộ xử lý và tốc độ (từ /proc/cpuinfo), thời gian khởi động cuối cùng (được tính từ /proc/uptime), địa chỉ IP (từ ifconfigđầu ra) và danh sách các máy in được cài đặt (từ lpstatđầu ra).

Hiện tại, một số dữ liệu được lấy từ dmidecodechương trình:

  • Loại nền tảng ( dmidecode -s system-product-name)
  • Phiên bản BIOS ( dmidecode -s bios-version)
  • Dung lượng bộ nhớ vật lý ( dmidecode -t17 | grep Size)

Chúng chỉ khả dụng nếu chương trình của tôi chạy dưới quyền root (vì nếu không thì quá dmidecodetrình con bị /dev/mem: Permission deniedlỗi). Có cách nào khác để lấy thông tin này mà người dùng bình thường có thể truy cập không?

Câu trả lời:


4

Tôi vừa kiểm tra trên hệ thống CentOS 5 của mình - sau:

chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode

Vẫn không thể để dmidecode hoạt động - nhóm kmem chỉ có quyền đọc cho / dev / mem - có vẻ như có một văn bản liên quan để lấy thông tin BIOS.

Vì vậy, một số tùy chọn khác:

  1. Sử dụng sudo
  2. Sử dụng các nguồn thông tin khác (ví dụ / Proc / meminfo)
  3. Sử dụng tập lệnh init ghi đầu ra tĩnh của dmidecode vào tệp có thể đọc được trên thế giới

6

Một số thông tin được trình bày bởi dmidecodecó sẵn tại /sys/devices/virtual/dmi/id.

Thông tin khác có thể thu được bằng cách phân tích /proc/cpuinfo, /proc/meminfohoặc /sys/system/node/node0/meminfo.


1
+1 cho /sys/devices/virtual/dmi/id. Rất nhiều thông tin cụ thể nền tảng có sẵn ở đó. Để biết một tập lệnh tiện dụng, hãy xem unix.stackexchange.com/questions/75750/ . Đối với thông tin hệ thống, câu khác của bạn là tốt quá. Có rất nhiều tiện ích như freehoặc thậm chí htopcó thể mang lại cho bạn những gì bạn muốn.
Mike S

6
  1. Tôi có thể đọc thông tin DMI với tư cách là Người dùng /sys/class/dmi/id/. Không bao gồm số sê-ri (yêu cầu quyền root để đọc).

    Tôi đoán đây là hành vi dự định của các nhà phát triển nhân nhận thức về quyền riêng tư.

  2. Về dmesg: dmesglà một lệnh để truy cập bộ đệm vòng kernel. Bộ đệm vòng ngụ ý thông tin cũ hơn được ghi đè bởi những cái mới hơn khi bộ đệm "tràn". Ngoài ra, đây là đọc đầu ra gỡ lỗi mô-đun hạt nhân mà không bao giờ có thể được phân tích cú pháp.

  3. Để truy cập đầu ra kernel với systemdrun:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. Về câu trả lời của david-homernils : Tệp /dev/memkhông chỉ đơn giản cung cấp thông tin bộ nhớ mà còn ánh xạ toàn bộ bộ nhớ vật lý vào không gian người dùng. Do đó, người ta có thể truy cập các địa chỉ bộ nhớ DMI thông qua nó (và làm những điều khó chịu hơn nhiều).

  5. Về chgrpchmod g+scủa dmidecodetrong nils' câu trả lời: Tôi đoán sẽ không làm việc này như dự định, do việc lưu gid với chmod g+skhông làm cho dmidecodesử dụng đó là đặc quyền mới. dmidecodephải gọi setegidđể đặt id nhóm hiệu quả trước khi có thể truy cập /dev/mem. Đánh giá từ mã nguồn của nó, dmidecodekhông làm điều đó.


1
Ngoài 3: Để truy cập đầu ra kernel trên các hệ thống mà không systemdcần đọc /var/log/kern.log. Nếu không có tệp nào trong khi hệ thống vẫn đang sử dụng syslogd, hãy thử tìm kiếm kern.*các mục /etc/syslog.confđể tìm vị trí của nó.
Ruslan

5

Hãy thử dmesg. Tôi đã có thể nhận được thông tin tôi muốn theo cách này với tài khoản người dùng thông thường.


Không chắc chắn tại sao bạn đã bỏ phiếu xuống. Tôi đã đặt một phản hồi dài dòng hơn dựa trên giải pháp của bạn cho mọi người xem. Tôi nghĩ rằng giải pháp của bạn là tốt.
wally

4

Chúng tôi đang sử dụng DMIDecode để đọc thông tin từ các hệ thống Linux từ xa và chưa tìm thấy cách giải quyết nào cho vấn đề này. Tôi đã đăng nhập một cuộc gọi trên trang chủ dmidecode hỏi về điều này ...

Sử dụng lệnh dmidecode -t system sẽ báo lỗi "/ dev / mem: Quyền bị từ chối", đây là một vấn đề vì chúng tôi không muốn thông tin bộ nhớ (chỉ nhà sản xuất, kiểu máy và số sê-ri).

Tôi nhận thấy rằng lệnh smbios chạy trên SunOS hoạt động tốt cho thông tin này mà không cần quyền root.

Hiện tại tôi sẽ thay thế tài liệu của chúng tôi nói rằng "sử dụng một tài khoản cụ thể với đặc quyền ít bắt buộc nhất" bằng "thông tin gốc của người dùng".


4

lshal chứa nhiều thông tin tương tự và không yêu cầu quyền root.


Tôi không chắc tại sao điều này lại được bình chọn, grepping nó đã cung cấp cho tôi chính xác thông tin tôi cần lshal | grep system.productcho tên hệ thống và thậm chí cả thẻ dịch vụ dell vớilshal | grep smbios.system.serial
Mark Booth

2
@MarkBooth có thể vì HAL không dùng nữa và không được giao trong các bản phân phối hiện đại.
Ruslan

lshalcuối cùng đã biến mất hoàn toàn trong RHEL7 và hiện tôi đang sử dụng sudo cat /sys/devices/virtual/dmi/id/chassis_serialđể lấy thẻ dịch vụ Dell, nhưng điều này chỉ hoạt động khi tôi có quyền truy cập catthông qua sudoers.
Đánh dấu gian hàng

4

Tôi không chắc tại sao @mtneagle lại bị bỏ phiếu.

Ba mục mà OP muốn là:

Loại nền tảng ( dmidecode -s system-product-name)
Phiên bản BIOS ( dmidecode -s bios-version)
Dung lượng bộ nhớ vật lý ( dmidecode -t17 | grep Size)

Chúng ta có thể nhận được từng thứ như vậy:

dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "1"
dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "2"
dmesg | grep "Memory:" | cut -d '/' -f '2-' | cut -d ' ' -f '1'

(Hoặc ít nhất là những máy này hoạt động trên 4 máy chủ phần cứng khác nhau mà tôi có và hoàn toàn không trả lại gì cho BIOS hoặc loại máy chủ trên máy khách Xen.)

Tôi đã bỏ lỡ một cái gì đó rõ ràng?


Cập nhật: Cảm ơn @Ruslan vì đã chỉ ra điều hiển nhiên mà tôi đã bỏ lỡ.

Trích dẫn:

Đúng bạn có. Thông điệp hạt nhân được lưu trữ trong một bộ đệm vòng. Khi quá nhiều dòng đã được in, những dòng đầu tiên sẽ bị xóa.

Vì vậy, nếu máy của bạn đã hoạt động được nhiều tuần và bạn đã tạm dừng / tiếp tục lại ít nhất mỗi ngày, rất có thể thông tin bạn grep cho ở đây sẽ không còn trong bộ đệm.

(Tôi có một tình huống như vậy với thời gian hoạt động là 18 ngày ở đây.) Có lẽ tốt hơn để xem xét /var/log/kern.log

Cái gì đó như grep DMI: /var/log/kern.log | tail -n1


3
Đúng bạn có. Thông điệp hạt nhân được lưu trữ trong một bộ đệm vòng. Khi quá nhiều dòng đã được in, những dòng đầu tiên sẽ bị xóa. Vì vậy, nếu máy của bạn đã hoạt động được nhiều tuần và bạn đã tạm dừng / tiếp tục lại ít nhất mỗi ngày, khả năng cao là thông tin bạn grepcung cấp ở đây sẽ không còn trong bộ đệm. (Tôi có một tình huống như vậy với thời gian hoạt động là 18 ngày ở đây.) Nó có thể tốt hơn để xem xét /var/log/kern.log. Một cái gì đó như grep DMI: /var/log/kern.log | tail -n1.
Ruslan

Cảm ơn - Tôi hy vọng bạn không phiền, tôi đã đưa nhận xét của bạn vào câu trả lời của tôi (có tín dụng).
wally

2

Để có được tổng dung lượng bộ nhớ vật lý, bạn có thể phân tích /proc/meminfo, free, vmstat, vv Bạn cũng có thể phân tích các bộ đệm thông điệp hạt nhân, vì nó nói về nó ở 0 lần.

Phiên bản BIOS khó hơn, tôi không tin đây là người dùng không phải root, nhưng tôi có thể sai. Có thể là nó (và tên sản phẩm hệ thống) được hiển thị ở đâu đó, có thể trong /sys/hoặc /proc/, nhưng tôi không thể tìm thấy bất cứ điều gì.


2
BIOS cũng được đề cập, vì vậy hãy tham khảo nhật ký kernel hoặc dmesgnếu nó không được điền quá nhiều. Dòng ví dụ:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
Lekensteyn

cat /sys/devices/virtual/dmi/id/bios_version... Voila '! Nhưng YMMV. Không phải tất cả các kiến ​​trúc đều có con đường này. x86_64 Intel nên.
Mike S

2

Các dịch vụ Linux của chúng tôi không chạy bằng root. Trong tập lệnh cài đặt bài đăng RPM (DOES chạy dưới quyền root), chúng tôi cài đặt tệp /etc/sudo.d và thiết lập một vài trong số các tệp thực thi của chúng tôi (ví dụ: đối với các đặc quyền phát sóng mạng).

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.