루트 권한없이 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

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
일에 대한 /sys/devices/virtual/dmi/id. 많은 플랫폼 별 정보가 제공됩니다. 편리한 스크립트는 unix.stackexchange.com/questions/75750/…를 참조하십시오 . 시스템 정보는 다른 문장도 좋습니다. 같은 유틸리티가 많이 있습니다 free또는 htop당신이 원하는 무엇을 얻을 수는.
Mike S

6
  1. 에서 사용자로 DMI 정보를 읽을 수 있습니다 /sys/class/dmi/id/. 일련 번호는 포함되지 않습니다 (읽기 위해 루트 권한이 필요함).

    이것은 개인 정보 보호 커널 개발자가 의도 한 동작이라고 생각합니다.

  2. 관련 dmesg: dmesg커널 링 버퍼에 액세스하기위한 명령입니다. 링 버퍼는 버퍼가 "오버플로"될 때 최신 정보가 이전 정보를 덮어 씁니다. 또한 이것은 구문 분석이 불가능한 커널 모듈 디버그 출력을 읽고 있습니다.

  3. 다음을 systemd실행 하여 커널 출력에 액세스하려면 다음을 수행하십시오.

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. david-homer 's and nils ' 답변 과 관련하여 : 파일 /dev/mem은 단순히 메모리 정보를 제공하는 것이 아니라 전체 실제 메모리를 사용자 공간에 매핑합니다. 따라서 DMI 메모리 주소를 통해 DMI 메모리 주소에 액세스 할 수 있습니다.

  5. 에 관한 chgrpchmod g+sdmidecode에서 NILS ' 대답 : 나는대로이하지 않습니다 일을 추측 의도와 GID를 저장하기 때문에 chmod g+s하지 않습니다 dmidecode그것은 새로운 권한의 사용합니다. dmidecodesetegid액세스하기 전에 효과적인 그룹 ID를 설정 하려면 호출 해야합니다 /dev/mem. 소스 코드에서 판단하면 그렇게 dmidecode하지 않습니다.


1
3에 추가 : systemd읽기 없이 시스템의 커널 출력에 액세스합니다 /var/log/kern.log. 시스템이 여전히을 사용하는 동안 해당 파일이 없으면 위치를 찾기 syslogd위해 kern.*항목 /etc/syslog.conf을 찾아 보십시오 .
Ruslan

5

dmesg를 사용해보십시오. 일반 사용자 계정으로이 방법으로 원하는 정보를 얻을 수있었습니다.


왜 투표를했는지 모르겠습니다. 모든 사람이 볼 수 있도록 귀하의 솔루션을 기반으로 더 자세한 답변을 작성했습니다. 나는 당신의 해결책이 좋다고 생각합니다.
wally September

4

원격 Linux 시스템에서 정보를 읽는 데 DMIDecode를 사용하고 있으며 아직 이에 대한 해결 방법을 찾지 못했습니다. dmidecode 홈 페이지에서 이에 대해 묻는 통화를 기록했습니다 ...

dmidecode -t system 명령을 사용하면 "/ dev / mem : Permission denied"오류가 발생하는데 메모리 정보를 원하지 않기 때문에 문제가됩니다 (제조업체, 모델 및 일련 번호).

SunOS에서 실행되는 smbios 명령은 루트 권한이 없어도이 정보에 적합합니다.

지금은 "최소한 권한을 가진 특정 계정 사용"과 "사용자 루트 자격 증명"이 포함 된 문서를 대체 할 것입니다.


4

lshal 동일한 정보를 많이 포함하며 루트 권한이 필요하지 않습니다.


나는 그것이 나에게 내가 필요 정확히 정보를 준을 grepping 반드시 이유가 부결 된 아니에요 lshal | grep system.product와 시스템 이름, 심지어 델 서비스 태그lshal | grep smbios.system.serial
마크 부스

2
@MarkBooth는 HAL이 더 이상 사용되지 않으며 최신 배포판으로 제공되지 않기 때문일 수 있습니다.
Ruslan

lshal결국 RHEL7에서 완전히 사라졌고 지금 sudo cat /sys/devices/virtual/dmi/id/chassis_serial은 Dell 서비스 태그를 얻는 데 사용 하고 있지만 catsudoers 를 통해 액세스 할 때만 작동합니다 .
마크 부스

4

@mtneagle이 다운 투표를 한 이유는 확실하지 않습니다.

OP가 원하는 세 가지 항목은 다음과 같습니다.

플랫폼 유형 ( 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.
Ruslan

감사합니다-괜찮습니다. 답변에 크레딧을 포함 시켰습니다.
wally

2

실제 메모리의 전체 양을 얻으려면, 당신은 구문 분석 할 수 /proc/meminfo, free, vmstat는 0시에 대해 이야기하기 때문에, 등 또한, 커널 메시지 버퍼를 구문 분석 할 수있다.

BIOS 버전이 더 어려워 루트가 아닌 사용자로 가능하다고 생각하지 않지만 잘못되었을 수 있습니다. (및 시스템 제품 이름)이 어딘가 /sys/또는에 노출되어있을 가능성이 /proc/있지만 아무것도 찾을 수 없습니다.


2
BIOS도 언급되었으므로 커널 로그를 참조하거나 dmesg너무 많이 채워지지 않은 경우 참조하십시오 . 예시 라인 :[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
Lekensteyn

cat /sys/devices/virtual/dmi/id/bios_version... 보일라! 그러나 YMMV. 모든 아키텍처에이 경로가있는 것은 아닙니다. x86_64 인텔이해야합니다.
Mike S

2

Linux 서비스는 루트로 실행되지 않습니다. RPM 설치 후 스크립트 (DOES가 root로 실행 됨)에서 /etc/sudo.d 파일을 설치하고 실행 파일 중 일부를 설정합니다 (예 : 네트워크 브로드 캐스트 권한).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.