Seriennummer der Linux-Festplatte als Nicht-Root

15

Zunächst möchte ich mich für den Titel entschuldigen, der keine Hardwaredetails enthält. Das liegt daran, dass ich einen Befehl suche, der in allen Linux-Distributionen funktioniert.

Frage:

Ich bin sehr neu in Linux und weiß nicht viel. Es ist jedoch möglich, die Seriennummer der Festplatte abzurufen, die nicht als Root ausgeführt wird. Mir ist bekannt, dass Befehle zum Abrufen dieser Informationen mit sudo verfügbar sind. Ich benötige jedoch eine Möglichkeit, diese Informationen abzurufen, ohne als sudo ausgeführt zu werden.

Anregungen wäre sehr dankbar.

Mit freundlichen Grüßen,

Mustafa

mustafa
quelle

Antworten:

19

Bei den meisten aktuellen Distributionen sind Festplatten-Seriennummern in der udev-Datenbank gespeichert, die ohne Root-Berechtigungen abgefragt werden können:

/sbin/udevadm info --query=property --name=sda

(Achten Sie darauf ID_SERIAL, ID_SERIAL_SHORTes gibt auch /dev/disk/by-id/ata-*Symlinks für ATA-Laufwerke, die auf diesen Werten basieren.)

udisksBietet eine übergeordnete Schnittstelle zu diesen Daten und mehr (es ermöglicht auch den Zugriff auf SMART-Attribute, ohne dass Root-Berechtigungen erforderlich sind, die zum smartctldirekten Aufrufen erforderlich wären ).

Sergey Vlasov
quelle
Sie haben Recht, nur ausprobiert udisks --show-info.__ Aber es muss beachtet werden, dass im Batch-Modus oder allgemein in Skripten udisksWEGE langsamer ist als udevadm.
Syntaxfehler
6

Ein anderer Weg, der normalerweise funktioniert, ist:

ls -l /dev/disk/by-id/

Hier ist ein Einzeiler, der Ihnen eine schnelle Aufzählung von Laufwerk und Modell- / Seriennummer gibt:

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'  

Oder für entfernte Maschinen:

ssh $host "ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print \$NF \" \" \$(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'"

Diese Ausgabe können Sie dann weiterverarbeiten. Bei den meisten Laufwerkstypen lautet die zweite Zeichenfolge pro Zeile MODEL_SERIAL.

Chriswall
quelle
2

Wie bereits erwähnt, können Sie dies nicht erreichen, ohne Root-Zugriff oder root-ähnliche Berechtigungen für einen bestimmten Prozess zu erteilen. Da Sie jedoch sagen, dass Sie ein Neuling sind, möchte ich Sie auf einen praktischen Befehl hinweisen, der aufgerufen wird lshw.

Janne Pikkarainen
quelle
Vielen Dank an Womble und dich, sehr geschätzt. Ich werde den von Ihnen erwähnten Befehl untersuchen.
1

Sie können dies nicht erreichen, ohne einem Prozess root-ähnliche Berechtigungen zu erteilen. Selbst als Root können Sie dies bei einigen Hardwarekonfigurationen nicht tun.

womble
quelle
Danke für deine schnelle Antwort Womble. Ich werde es versuchen.
Mustafa
0

Die Links unter / dev / disk / by-id werden von udev erstellt. In /etc/udev/rules.d/50-udev.rules finden Sie folgende Zeilen:

KERNEL=="sd*[!0-9]|sr*", SYSFS{ieee1394_id}=="*", ENV{ID_SERIAL}="$sysfs{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/usb_id -x"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -s %p -d $tempnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}=="", IMPORT{program}="/lib/udev/scsi_id -g -x -a -s %p -d $tempnode"
KERNEL=="nst[0-9]*|st*|sd*[!0-9]|sr*|dasd*[!0-9]|cciss?c", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"

Leider ist es nicht trivial, diesen by-idSymlink aus dem Namen des Geräts herauszufinden . Es gibt aber mindestens einen direkten Weg:

$ udevinfo -q path -n /dev/sda
/block/sda
$ udevinfo -q symlink -p /block/sda
disk/by-id/scsi-SATA_KINGSTON_SVP100_31JY100MY5SK disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0

Eine durch Leerzeichen getrennte Liste wird zurückgegeben. So kann der by-idWeg gefunden werden.

Oder Sie können direkt die "zusammengesetzte" Seriennummer erhalten:

$ udevinfo -q env -p /block/sda
ID_VENDOR=ATA
ID_MODEL=KINGSTON_SVP100S
ID_REVISION=CJR1
ID_SERIAL=SATA_KINGSTON_SVP100_31JY100MY5SK
ID_TYPE=disk
ID_BUS=scsi
ID_PATH=pci-0000:00:11.0-scsi-0:0:0:0

Im ID_SERIALnach dem letzten Unterstrich können Sie die Seriennummer abrufen.

Wie ich sehe, kann eine Seriennummer alphanumerische Zeichen und "-" enthalten (ich habe solche SCSI-Festplatten). Kennt jemand eine Einschränkung bezüglich der Seriennummer? Wenn '_' enthalten kann, ist diese Methode nicht kugelsicher.

Der ID_MODELSchlüssel könnte verwendet werden, um den Anfang der Seriennummer genauer zu lokalisieren, da (meiner Meinung nach) die ersten 15 Zeichen zu den ID_SERIAL(durch '_' ersetzten Leerzeichen) hinzugefügt werden .

TrueY
quelle
"udevinfo" hat bei mir hier auf Ubuntu nicht funktioniert. Der folgende Einzeiler hat jedoch genau das getan, was ich wollte: udevadm info -q property -xn sda | awk -F\' '/ID_SERIAL_SHORT/{print $2}'Natürlich -q propertykann der weggelassen werden, aber ich halte es immer für eine Verschwendung von Ressourcen, udevadmzusätzliche Zeilen ausgeben zu lassen , die wir überhaupt nicht benötigen.
Syntaxfehler