Piszę program, który wyświetla różne informacje o systemie (w systemie CentOS). Na przykład typ i szybkość procesora (od /proc/cpuinfo
), czas ostatniego uruchomienia (obliczony na podstawie /proc/uptime
), adres IP (z ifconfig
wyjścia) oraz lista zainstalowanych drukarek (z lpstat
wyjścia).
Obecnie z dmidecode
programu pozyskuje się kilka danych :
- Typ platformy (
dmidecode -s system-product-name
) - Wersja systemu BIOS (
dmidecode -s bios-version
) - Ilość pamięci fizycznej (
dmidecode -t17 | grep Size
)
Są one dostępne tylko wtedy, gdy mój program jest uruchomiony jako root (ponieważ w przeciwnym razie dmidecode
podproces nie powiedzie się z /dev/mem: Permission denied
błędem). Czy istnieje alternatywny sposób uzyskania tych informacji, do których normalny użytkownik może uzyskać dostęp?
źródło
/sys/devices/virtual/dmi/id
. Dostępnych jest tam wiele informacji dotyczących konkretnej platformy. Przydatny skrypt można znaleźć na stronie unix.stackexchange.com/questions/75750/… . Jeśli chodzi o informacje o systemie, drugie zdanie również jest dobre. Istnieje wiele narzędzi, takich jakfree
lub nawet,htop
które mogą zapewnić ci to, czego chcesz.Mogę odczytać informacje DMI jako Użytkownik pod
/sys/class/dmi/id/
. Bez numerów seryjnych (które wymagają uprawnień roota do odczytu).Sądzę, że jest to zamierzone zachowanie programistów jądra świadomych prywatności.
Odnośnie
dmesg
:dmesg
to polecenie dostępu do bufora pierścienia jądra. Bufor pierścieniowy oznacza, że starsze informacje są zastępowane nowszymi, gdy bufor jest „przepełniony”. Odczytuje to również wyjście debugowania modułu jądra, które nigdy nie miało być analizowalne.Aby uzyskać dostęp do danych wyjściowych jądra za pomocą polecenia
systemd
run:Odnośnie odpowiedzi Davida-homera i nilsa : plik
/dev/mem
nie tylko podaje informacje o pamięci, ale mapuje całą pamięć fizyczną do przestrzeni użytkownika. Dlatego można za jego pośrednictwem uzyskać dostęp do adresów pamięci DMI (i robić o wiele bardziej paskudne rzeczy).Odnośnie
chgrp
ichmod g+s
stanowidmidecode
w Nils' odpowiedź: myślę, że to nie będzie działać zgodnie z przeznaczeniem, bo oszczędności z GIDchmod g+s
nie czynidmidecode
wykorzystywać to nowe przywileje.dmidecode
musi zadzwonić,setegid
aby ustawić efektywny identyfikator grupy, zanim będzie mógł uzyskać dostęp/dev/mem
. Sądząc z kodu źródłowego,dmidecode
nie robi tego.źródło
systemd
odczytu/var/log/kern.log
. Jeśli nie ma takiego pliku, gdy system nadal korzystasyslogd
, spróbuj wyszukaćkern.*
wpisy w/etc/syslog.conf
celu ustalenia jego lokalizacji.Wypróbuj dmesg. W ten sposób udało mi się uzyskać potrzebne informacje na zwykłym koncie użytkownika.
źródło
Używamy kodu DMID do odczytu informacji ze zdalnych systemów Linux i jeszcze nie znaleźliśmy rozwiązania tego problemu. Zalogowałem połączenie na stronie głównej dmidecode, pytając o to ...
Użycie polecenia dmidecode -t system daje błąd „/ dev / mem: Permenie denied”, który jest problemem, ponieważ nie chcemy informacji o pamięci (tylko producent, model i numer seryjny).
Zauważam, że polecenie smbios działające w systemie SunOS działa dobrze dla tych informacji bez konieczności posiadania uprawnień roota.
Na razie zamierzam zastąpić naszą dokumentację stwierdzającą, że „używaj określonego konta z najmniej wymaganym przywilejem” na „poświadczenia użytkownika root”.
źródło
lshal
zawiera wiele takich samych informacji i nie wymaga uprawnień administratora.źródło
lshal | grep system.product
dla nazwy systemu, a nawet tagu usługi Dell zlshal | grep smbios.system.serial
lshal
ostatecznie zniknął całkowicie w RHEL7 i teraz używamsudo cat /sys/devices/virtual/dmi/id/chassis_serial
do uzyskania tagu serwisowego Dell, ale działa to tylko, ponieważ mam dostęp docat
sudoers.Nie jestem pewien, dlaczego @mtneagle został odrzucony.
Trzy elementy, których chciał PO, to:
Typ platformy (
dmidecode -s system-product-name
)Wersja systemu BIOS (
dmidecode -s bios-version
)Ilość pamięci fizycznej (
dmidecode -t17 | grep Size
)W ten sposób możemy uzyskać każdy z nich:
(A przynajmniej te działają na 4 różnych serwerach sprzętowych, które mam, i czysto nie zwróciły niczego dla BIOSu lub typu serwera dla gościa Xen.)
Czy przegapiłem coś oczywistego?
Aktualizacja: Podziękowania dla @Ruslan za wskazanie oczywistych rzeczy, za którymi tęskniłem.
Cytowanie:
źródło
grep
tu znajdziesz, nie będą już przechowywane w buforze. (Mam taką sytuację z 18-dniowym czasem bezczynności.) Lepiej się przyjrzeć/var/log/kern.log
. Coś jakgrep DMI: /var/log/kern.log | tail -n1
.Aby uzyskać całkowitą ilość pamięci fizycznej, można analizować
/proc/meminfo
,free
,vmstat
, itd. Można też analizować bufor komunikatów jądra, ponieważ mówi o nim w czasie 0.Wersja systemu BIOS jest trudniejsza, nie sądzę, że jest to możliwe jako użytkownik inny niż root, ale mogę się mylić. Możliwe, że to (i nazwa produktu systemowego) jest gdzieś ujawnione, może w
/sys/
lub/proc/
, ale nic nie mogę znaleźć.źródło
dmesg
jeśli nie został zbyt mocno wypełniony. Przykładowa linia:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila! Ale YMMV. Nie wszystkie architektury mają tę ścieżkę. x86_64 Intel powinien.Nasze usługi Linux nie działają jako root. W skrypcie poinstalacyjnym RPM (który MUSI działać jako root) instalujemy plik /etc/sudo.d i ustawiamy kilka plików wykonywalnych (np. W przypadku uprawnień do transmisji sieciowych).
źródło