ルート権限なしでdmidecode情報を取得する方法は?


16

さまざまなシステム情報を表示するプログラムを作成しています(CentOSシステム上)。たとえば、プロセッサのタイプと速度(から/proc/cpuinfo)、最後のブート時間(から計算/proc/uptime)、IPアドレス(ifconfig出力から)、インストールされているプリンターのリスト(lpstat出力から)。

現在、dmidecodeプログラムからいくつかのデータが取得されています。

  • プラットフォームの種類(dmidecode -s system-product-name
  • BIOSバージョン(dmidecode -s bios-version
  • 物理メモリの量(dmidecode -t17 | grep Size

これらは、プログラムがルートとして実行されている場合にのみ使用可能です(そうでない場合、dmidecodeサブプロセスは/dev/mem: Permission deniedエラーで失敗します)。通常のユーザーがアクセスできる、この情報を取得する別の方法はありますか?

回答:


4

CentOS 5システムで確認したところ-後:

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

dmidecodeを動作させることはまだ不可能です-グループkmemには/ dev / memの読み取り権しかありません-BIOS情報を取得するために書き込みが関係しているようです。

他のオプション:

  1. sudoを使用
  2. 他の情報ソースを使用します(例/ proc / meminfo)
  3. dmidecodeの静的出力を誰でも読み取り可能なファイルに書き込むinit-scriptを使用します

6

が提示する情報の一部dmidecodeはで入手できます/sys/devices/virtual/dmi/id

他の情報は、解析することによって得ることができる/proc/cpuinfo/proc/meminfoまたは/sys/system/node/node0/meminfo


1
+1 /sys/devices/virtual/dmi/id。プラットフォーム固有の情報がたくさんあります。便利なスクリプトについては、unix.stackexchange.com / questions / 75750 /…を参照してください。システム情報については、他の文も適切です。ユーティリティのようなたくさんのがありますfreeかさえもhtop何をしたいあなたを得ることができます。
マイクS

6
  1. 私は、ユーザーとしてDMI情報を読み取ることができます/sys/class/dmi/id/。シリアル番号は含まれません(読み取りにはルート権限が必要です)。

    これは、プライバシーを意識したカーネル開発者が意図した動作だと思います。

  2. dmesg:に関してdmesgは、カーネルリングバッファにアクセスするためのコマンドです。リングバッファは、バッファが「オーバーフロー」しているときに、古い情報が新しい情報によって上書きされることを意味します。また、これはカーネルモジュールのデバッグ出力を読み取っていますが、これは解析可能なものではありませんでした。

  3. systemdrunでカーネル出力にアクセスするには:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. デビッド・ホーマーのNILS'答え:ファイルは/dev/mem、単純にメモリ情報を与えるものではありませんが、ユーザー空間に全体の物理メモリをマッピングします。したがって、それを介してDMIメモリアドレスにアクセスできます(さらに多くの厄介なことを行います)。

  5. chgrpchmod g+sdmidecodeNILS'答え:意図したとおりにGIDを保存するので、私は、これではないでしょう仕事を推測するchmod g+sことはありませんdmidecode、それは新しい特権だ利用を。dmidecodesetegidアクセスする前に、有効なグループIDを設定するために呼び出す必要があります/dev/mem。そのソースコードから判断すると、それdmidecodeはしません。


1
3.への追加:systemd読み取りのみを行わずに、システム上のカーネル出力にアクセスします/var/log/kern.log。システムがまだ使用している間にそのようなファイルがない場合syslogdkern.*エントリ/etc/syslog.confを探してその場所を見つけてみてください。
ルスラン

5

dmesgを試してください。通常のユーザーアカウントを使用して、この方法で必要な情報を取得できました。


なぜあなたは投票されなかったのか分かりません。誰でも見ることができるように、ソリューションに基づいてより詳細な応答を配置しました。あなたの解決策は素晴らしいと思います。
ウォーリー14

4

DMIDecodeを使用して、リモートLinuxシステムから情報を読み取りますが、これに対する回避策はまだ見つかりません。私はこれについて尋ねるdmidecodeホームページで呼び出しを記録しました...

コマンドdmidecode -t systemを使用すると、「/ dev / mem:Permission denied」というエラーが表示されます。これは、メモリ情報(製造元、モデル、シリアル番号のみ)が不要なため問題です。

SunOSで実行されているsmbiosコマンドは、root権限を必要とせずにこの情報に対して正常に機能することに気付きました。

今のところ、「最低限必要な特権を持つ特定のアカウントを使用する」というドキュメントを「ユーザールート認証情報」に置き換えます。


4

lshal 同じ情報が多く含まれており、ルート権限は必要ありません。


私はそれは私が必要な正確な情報与え、それをgrepを、必ずなぜこれが否決されたじゃないlshal | grep system.productとシステム名のために、さらにはDellのサービスタグをlshal | grep smbios.system.serial
マーク・ブース

2
@MarkBoothは、おそらくHALが非推奨であり、最新のディストリビューションでは出荷されていないためです。
ルスラン

lshal最終的にRHEL7で完全に消滅sudo cat /sys/devices/virtual/dmi/id/chassis_serialし、Dellサービスタグを取得するために使用していますが、これはcatsudoers を介してアクセスできる場合にのみ機能します。
マークブース

4

@mtneagleが投票された理由は定かではありません。

OPが望んだ3つのアイテムは次のとおりです。

プラットフォームの種類(dmidecode -s system-product-name
BIOSバージョン(dmidecode -s bios-version
物理メモリの量(dmidecode -t17 | grep Size

これらのそれぞれをこのようにして取得できます。

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'

(または少なくとも、私が持っている4つの異なるハードウェアサーバーで動作し、XenゲストのBIOSまたはサーバータイプについては何も返されません。)

明らかな何かを見逃していませんか?


更新:見逃したことを指摘してくれた@Ruslanに感謝します。

引用:

はいあなたが持っています。カーネルメッセージはリングバッファに保存されます。印刷された行が多すぎると、最初の行が削除されます。

そのため、マシンが数週間稼働しており、少なくとも毎日それを中断/再開した場合、ここでgrepを実行した情報がバッファーに存在しなくなる可能性が高くなります。

(私はここで18日間の稼働時間でこのような状況にあります。) /var/log/kern.log

何かのようなもの grep DMI: /var/log/kern.log | tail -n1


3
はいあなたが持っています。カーネルメッセージはリングバッファに保存されます。印刷された行が多すぎると、最初の行が削除されます。そのため、マシンが数週間稼働しており、少なくとも毎日それを中断/再開した場合grep、ここでの情報がバッファになくなる可能性が高くなります。(ここで18日の稼働時間でこのような状況にあります。)を調べる方が良いかもしれません/var/log/kern.log。のようなものgrep DMI: /var/log/kern.log | tail -n1
ルスラン

ありがとう-あなたが気にしないことを願っています、私は私の答えにあなたのコメントを含めました(クレジット付き)。
ウォーリー

2

物理メモリの総量を取得するには、解析することができ/proc/meminfofreevmstatそれは0時間でそれを語ることから、などまた、カーネルメッセージバッファを解析することができます。

BIOSバージョンはもっと難しく、これが非rootユーザーとして可能だとは思わないが、間違っているかもしれない。/sys/または(またはシステム製品名)がどこかで公開されている可能性があります(おそらくまたは/proc/)ですが、何も見つかりません。


2
BIOSについても言及されているので、カーネルログを参照するかdmesg、ログがいっぱいになっていないかどうかを調べてください。例の行:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
9:40にLekensteyn

cat /sys/devices/virtual/dmi/id/bios_version...ボイラ!しかし、YMMV。すべてのアーキテクチャにこのパスがあるわけではありません。x86_64 Intelが必要です。
マイクS

2

Linuxサービスはrootとして実行されません。RPMのインストール後スクリプト(rootとして実行されます)で、/ etc / sudo.dファイルをインストールし、いくつかの実行可能ファイル(ネットワークブロードキャスト特権など)をsetcapします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.