Jak uzyskać numer seryjny?

69

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

Alex Chamberlain
źródło
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
Alex Chamberlain
źródło
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.

Dennis Williamson
źródło
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
ps-rpi
źródło
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);

}
M. Martins
źródło
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
użytkownik14752
źródło
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}'
Imię
źródło
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
Colater
źródło
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.

szum
źródło
1
Mój linijka do usuwania zer wiodących:sed -n 's/^Serial\s*: 0*//p' /proc/cpuinfo
Thomas