Я пишу программу, которая отображает различную системную информацию (в системе CentOS). Например, тип процессора и скорость (от /proc/cpuinfo
), время последней загрузки (рассчитывается из /proc/uptime
), IP-адрес (из ifconfig
вывода) и список установленных принтеров (из lpstat
вывода).
В настоящее время из dmidecode
программы получено несколько фрагментов данных :
- Тип платформы (
dmidecode -s system-product-name
) - Версия BIOS (
dmidecode -s bios-version
) - Объем физической памяти (
dmidecode -t17 | grep Size
)
Они доступны только в том случае, если моя программа запускается от имени пользователя root (поскольку в противном случае dmidecode
подпроцесс завершается с /dev/mem: Permission denied
ошибкой). Есть ли альтернативный способ получения этой информации, к которому может обратиться обычный пользователь?
источник
/sys/devices/virtual/dmi/id
. Много информации о платформе доступно там. Для удобного сценария см. Unix.stackexchange.com/questions/75750/… . Для системной информации, ваше другое предложение тоже хорошо. Есть много утилит, таких какfree
или даже,htop
которые могут получить то, что вы хотите.Я могу читать информацию DMI под пользователем
/sys/class/dmi/id/
. Не включая серийные номера (для чтения которых требуются права суперпользователя).Я предполагаю, что это намеренное поведение разработчиков ядра, осведомленных о конфиденциальности.
Относительно
dmesg
:dmesg
это команда для доступа к кольцевому буферу ядра. Кольцевой буфер подразумевает, что более старая информация перезаписывается более новыми, когда буфер «переполняется». Также это чтение отладочного вывода модуля ядра, который никогда не предназначался для разбора.Чтобы получить доступ к выводу ядра с помощью команды
systemd
run:Относительно ответов Дэвида Гомера и Нилса : файл
/dev/mem
не просто дает информацию о памяти, но отображает всю физическую память в пространство пользователя. Поэтому через него можно получить доступ к адресам памяти DMI (и делать гораздо более неприятные вещи).Что касается
chgrp
иchmod g+s
изdmidecode
в NILS' ответ: Я думаю , это не будет работать , как задумано, потому что сохранение GID сchmod g+s
не делаетdmidecode
использовать его новые привилегии.dmidecode
должен вызвать,setegid
чтобы установить его эффективный идентификатор группы, прежде чем он сможет получить доступ/dev/mem
. Судя по исходному коду,dmidecode
не делает этого.источник
systemd
просто чтения/var/log/kern.log
. Если такого файла нет во время использования системыsyslogd
, попробуйте найтиkern.*
записи,/etc/syslog.conf
чтобы узнать его местоположение.Попробуйте dmesg. Я смог получить информацию, которую я хотел таким образом, с помощью обычной учетной записи пользователя.
источник
Мы используем DMIDecode для чтения информации из удаленных систем Linux и пока не нашли обходного пути. Я зарегистрировал звонок на домашней странице dmidecode с вопросом об этом ...
При использовании команды dmidecode -t система выдает ошибку "/ dev / mem: Permission denied", которая является проблемой, поскольку нам не нужна информация о памяти (только производитель, модель и серийный номер).
Я заметил, что команда smbios, работающая в SunOS, прекрасно работает с этой информацией, не требуя привилегий root.
Сейчас я собираюсь заменить нашу документацию, гласящую «использовать конкретную учетную запись с наименьшими необходимыми привилегиями», на «учетные данные пользователя root».
источник
lshal
содержит много той же информации и не требует привилегий root.источник
lshal | grep system.product
для имени системы, и даже тег обслуживания dell сlshal | grep smbios.system.serial
lshal
в конечном итоге полностью исчез в RHEL7, и теперь я используюsudo cat /sys/devices/virtual/dmi/id/chassis_serial
для доступа к метке обслуживания Dell, но это работает только потому, что у меня есть доступcat
через sudoers.Я не уверен, почему @mtneagle получил отрицательное голосование.
Три предмета, которые хотел ОП:
Тип платформы (
dmidecode -s system-product-name
)Версия BIOS (
dmidecode -s bios-version
)Объем физической памяти (
dmidecode -t17 | grep Size
)Мы можем получить каждый из них таким образом:
(Или, по крайней мере, те, которые работают на 4 разных аппаратных серверах, которые у меня есть, и ничего не возвращали для BIOS или типа сервера на гостевой системе Xen.)
Я что-то упустил очевидное?
Обновление: Спасибо @Ruslan за указание на очевидное, что я пропустил.
Цитирование:
источник
grep
здесь найдете, больше не будет в буфере. (У меня такая ситуация с временем безотказной работы 18 дней.) Может быть, лучше разобраться/var/log/kern.log
. Нечто подобноеgrep DMI: /var/log/kern.log | tail -n1
.Для того, чтобы получить общий объем физической памяти, вы можете разобрать
/proc/meminfo
,free
,vmstat
и т.д. Вы можете также разобрать буфер сообщений ядра, так как он говорит об этом в 0 раз.Версия BIOS более сложная, я не верю, что это возможно для пользователя без полномочий root, но я могу ошибаться. Возможно, что оно (и название системного продукта) где-то раскрыто, может быть, в
/sys/
или/proc/
, но я ничего не могу найти.источник
dmesg
если он не был заполнен слишком много. Пример строки:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila "! Но YMMV. Не все архитектуры имеют этот путь. x86_64 Intel должна.Наши сервисы Linux не запускаются с правами root. В сценарии после установки RPM (который запускается как root) мы устанавливаем файл /etc/sudo.d и устанавливаем несколько наших исполняемых файлов (например, для привилегий сетевого вещания).
источник