Jak uzyskać numer seryjny?


69

Gdzie mogę znaleźć numer seryjny Raspberry Pi, którego obecnie używam?


2
czy numer seryjny jest wydrukowany na urządzeniu, czy jest dostępny tylko za pośrednictwem oprogramowania? Widzę, że na urządzeniu jest naklejka, ale nie sądzę, aby była związana z numerem seryjnym. Byłoby miło poznać identyfikator urządzenia bez konieczności włączania go i podłączania.
Scoop,

3
@AlexisK Jest dostępny tylko w oprogramowaniu.
Alex Chamberlain,

2
Prawidłowo, wydaje się, że nie ma żadnego związku z naklejką i numerem seryjnym. Przeczytałem naklejkę z liczbą Pi i próbowałem ją rozszyfrować. Chociaż Raspberry prawdopodobnie ma wewnętrzne listy łączące oba, nie wydaje się, że istnieje sposób na obliczenie z niego numeru seryjnego lub MAC.
EDP

Odpowiedzi:


78

Numer seryjny można znaleźć w /proc/cpuinfo; na przykład,

 pi@raspberrypi:~$ cat /proc/cpuinfo
 Processor       : ARMv6-compatible processor rev 7 (v6l)
 BogoMIPS        : 697.95
 Features        : swp half thumb fastmult vfp edsp java tls
 CPU implementer : 0x41
 CPU architecture: 7
 CPU variant     : 0x0
 CPU part        : 0xb76
 CPU revision    : 7

 Hardware        : BCM2708
 Revision        : 1000002
 Serial          : 000000000000000d

Grzmotnąć

Możesz użyć bardzo podstawowego orurowania bash

cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2

Ponieważ tabulatory są używane po lewej stronie dwukropka, wycięcie znaku spacji niezawodnie uchwyci tylko numer seryjny.

Poprzednie wersje tej odpowiedzi obejmowały dwukropek, który tworzył wiodącą przestrzeń w zmiennej. Ta wiodąca przestrzeń nie jest usuwana podczas przypisywania zmiennych, jak wcześniej sugerowano.

Bash / Perl

W Bash bardzo łatwo jest wyodrębnić ... przy użyciu Perla. Posługiwać się

cat /proc/cpuinfo | perl -n -e '/^Serial\s*:\s([0-9a-f]{16})$/ && print "$1\n"'

Na przykład,

$ cat /proc/cpuinfo | perl -n -e '/^Serial\s*:\s([0-9a-f]{16})$/ && print "$1\n"'
000000000000000d

Pyton

Raspberry Spy stanowi bardzo przydatny przykład Pythona.

def getserial():
  # Extract serial from cpuinfo file
  cpuserial = "0000000000000000"
  try:
    f = open('/proc/cpuinfo','r')
    for line in f:
      if line[0:6]=='Serial':
        cpuserial = line[10:26]
    f.close()
  except:
    cpuserial = "ERROR000000000"

  return cpuserial

Bibliografia

  1. Strony produktu z kluczem licencyjnym
  2. Raspberry Spy: uzyskiwanie numeru seryjnego Raspberry Pi przy użyciu języka Python

6
Perl zaakceptuje nazwy plików jako argumenty. Nie jest konieczne użycie cat.
Dennis Williamson,

3
ostatnie 6 cyfr mojego numeru seryjnego jest takie samo jak ostatnie 6 cyfr mojego adresu MAC. Czy to prawda dla ciebie?
Scoop

6
<przekierowanie również działa, więc jest to bezużyteczne użycie kota.
XTL,

3
Czy jest jakiś sposób, aby uzyskać te informacje fizycznie? Mam na myśli na płycie, więc nie muszę uruchamiać każdego pi, aby uzyskać te informacje.
Zeezer

3
Czy to jest wyjątkowe? wydaje się trochę krótki ... w moim serialu wykorzystano tylko 4 bajty, wszystkie pozostałe są zerami
Flash Thunder

11

Bash / Grep

Używanie grep:

grep -Po '^Serial\s*:\s*\K[[:xdigit:]]{16}' /proc/cpuinfo

Grzmotnąć

Używanie czystego Basha bez użycia zewnętrznych narzędzi:

pattern='^Serial.*([[:xdigit:]]{16})$'
while read -r line
do
    if [[ $line =~ $pattern ]]
    then
        echo "${BASH_REMATCH[1]}"
    fi
done < /proc/cpuinfo

Wynik jednego z powyższych jest taki sam.


to jedyny, który dla mnie
zadziałał

To nie działa: „P” jest niepoprawną opcją. Przynajmniej w pcpAudioCore
theking2

1
@ theking2: Obawiam się, że nie znam pcpAudioCore. -P(Perl regex) jest opcją nowoczesnych wersji GNU grep.
Dennis Williamson

7

Bash / Awk

Ponieważ okazało się to pewnego rodzaju „ile sposobów można uzyskać serial” tutaj jest wersja awk

  awk '/ ^ Serial \ s *: \ s / {print $ 3}' / proc / cpuinfo

6

NodeJS

Dla każdego zainteresowanego jest sposób na uzyskanie numeru seryjnego Raspberry za pomocą NodeJS:

function getserial(){

   var fs = require('fs');

   var content = fs.readFileSync('/proc/cpuinfo', 'utf8');

   var cont_array = content.split("\n");

   var serial_line = cont_array[cont_array.length-2];

   var serial = serial_line.split(":");

   return serial[1].slice(1);

}

Z jakiegokolwiek powodu content_array.length-2 nie zawsze działa dla mnie. Czasami daje mi „Raspberry Pi 4 Model B Rev 1.1”, który jest linią „Model” tuż za linią „Serial”. Więc dla pewności zmieniłem twoją funkcję na (patrz następny komentarz).
fivedogit

funkcja getserial () {var fs = wymagany ('fs'); var content = fs.readFileSync ('/ proc / cpuinfo', 'utf8'); var cont_array = content.split ("\ n"); var x = 0; var serial_line = ""; while (x <cont_array.length) {serial_line = cont_array [x]; if (serial_line.startsWith („Serial”)) {return serial_line.split (":") [1] .slice (1); } x ++; }}
fivedogit,

4
grep -i serial /proc/cpuinfo | cut -d : -f2

1
programowanie gry w golfa nie jest zalecane na stronie internetowej, ponieważ bardzo trudno jest podążać za odpowiedzią dla początkujących, szczególnie jeśli nie napiszesz żadnych wyjaśnień ani szczegółowych komentarzy.
lenik

1
Nie chciałbym nazywać tej odpowiedzi „programowaniem golfa” w porównaniu do jeszcze bardziej tajemniczej, takiej jak „Bash / Awk”. Właściwie chciałem podnieść tę odpowiedź ze względu na równość, ale po uruchomieniu jej na moim PI i porównaniu z inną wersją, nie zrobię tego, ponieważ muszę przyznać, że ta odpowiedź nie daje dokładnego wyniku poprzez wstawienie dodatkowej wiodącej przestrzeni. PS: Ja też tego nie pomniejszę
Van Jone

4

Używanie awk:

cat /proc/cpuinfo | grep Serial | awk ' {print $3}'

6
To dobry przykład UUOC . Można to po prostu napisaćawk '/Serial/{print $3}' /proc/cpuinfo
ripat

1

Tak. Rzeczywiście jest to sposób na zdobycie go.

To zabawne, że mój Pi0 ma te same dane (szeregowe) jak w powyższym przykładzie. Nie ma rozróżnienia między moim numerem seryjnym PI0 a tym opublikowanym przez Alexa Chamberlaina

Za PI3 masz 4 procesory

#cat /proc/cpuinfo

processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt                                                                                                                      vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt                                                                                                                      vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt                                                                                                                      vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt                                                                                                                      vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

Hardware        : BCM2709
Revision        : a02082
Serial          : 000000003d1d1c36

1

Najkrótsza i najprostsza nie została jeszcze podana jako odpowiedź. To w sed:

sed -n '/^Serial/{s/.* //;p}' /proc/cpuinfo

znaczenie:

  • sed -n - uruchom edytor strumieniowy bez drukowania każdej linii
  • /^Serial/- dopasuj tylko wiersze rozpoczynające się od słowa „Seryjny”
  • s/.* //;- zamień wszystko do ostatniego miejsca na nic (wyrażenia regularne są zachłanne , przy okazji)
  • p - wydrukuj wynik.

sed czasami otrzymuje złą nazwę, ponieważ jest trudny w użyciu i tajemniczy, ale jest dostępny i działa w ten sam sposób (pod warunkiem przestrzegania konwencji POSIX) na wielu typach systemów Linux i Unix.


1
Mój linijka do usuwania zer wiodących:sed -n 's/^Serial\s*: 0*//p' /proc/cpuinfo
Thomas
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.