Jak czytać N losowych znaków z / dev / urandom?

50
read /dev/urandom 3

Powyższe nie działa .. Jak mogę odczytać losowe bajty /dev/urandomw bash?

linux
źródło

Odpowiedzi:

44
random="$(dd if=/dev/urandom bs=3 count=1)"
Flimzy
źródło
1
@ Flimzy, jak $()działa?
linux
2
Traktuje dane wyjściowe polecenia jak zmienną. Uwaga: to jest bashism. Jeśli nie używasz bash, może być konieczne użycie `` zamiast tego. `` jest bardziej uniwersalny, ale myślę, że $ () jest łatwiejszy do odczytania.
Flimzy
@Flimzy, It treats the output of a command like a variable.naprawdę masz na myśli ciąg, prawda?
linux
2
Zmienna może być ciągiem ... lub liczbą. Traktuje to jako zmienną ... następnie w zależności od kontekstu jest traktowane jak ciąg znaków lub liczba.
Flimzy
1
$()jest dość uniwersalny, nie jest specyficzny dla bash. Przy okazji, uważaj, aby nie napotkać ograniczeń na to, jakie znaki powłoka może przechowywać w zmiennych - na przykład wersja bash, którą przetestowałem, z pominięciem wartości null (\ x00) z łańcucha.
Gordon Davisson,
44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Jeśli chcesz dosłownych znaków myślnika, znak myślnika musi znajdować się na końcu łańcucha, tak jak powyżej, w przeciwieństwie do *-_).

I aby wyjaśnić, co robi się z powodu powyższego zestawu poleceń:

  1. head -c 500 /dev/urandom: Uzyskaj od pierwszych 500 znaków (bajtów) /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Usuń wszystkie znaki oprócz określonych w 'a-zA-Z0-9~!@#$%^&*_-'danych wyjściowych pierwszego polecenia.
  3. fold -w 3: Sformatuj dane wyjściowe drugiego polecenia, tak aby zawierało 3 znaki w wierszu.
  4. head -n 1: Wyświetla pierwszy wiersz wyniku trzeciego polecenia stdout.
ADM
źródło
1
Szuka 3 bajtów ...
Chris S
1
3 plus dokładny wzór
ADM
To jest wspaniałe.
Danijel-James W
3
Wspaniały! Istnieją również nazwy klas char ([: graph | print | etc:]) dostępne dla funkcji trc, i można je jeszcze uprościć, zastępując fold -w 3 | head -n 1je znakiem, head -c 3jeśli nowy znak linii nie jest potrzebny na końcu.
Zimmi
5
Jeśli domyślnym kodowaniem systemu jest wielobajtowy (np. UTF-8), to tr nie powiedzie się z Illegal byte sequencebłędem. Aby to naprawić, użyj kodowania „C”; zmień polecenie na:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff,
33

Proszę sprawdzić man od.

Możesz użyć na przykład

od -vAn -N4 -tu4 < /dev/urandom

do generowania liczb losowych 4 bajtów bez znaku dziesiętnego.

Ekrem Aksoy
źródło
1
Ekrem, witamy w SF. Zwykle nie lubię nowych odpowiedzi na długo akceptowane pytania, ale to naprawdę różni się od wszystkich poprzednich odpowiedzi i ma pewne realne zalety - fajnie! +1 ode mnie i mam nadzieję, że pozostaniesz przy SF i przyczynisz się do tego przez jakiś czas.
MadHatter
19

Oto jeden, który tworzy ciągi base64, zauważ, że chociaż są one ograniczone do ciągów base64, dopełnienie jest z nich usuwane, więc nie możesz ich odkodować, prawdopodobnie i tak nie będziesz go potrzebował.

 cat /dev/urandom | base64 | head -c 5

Zamień 5na dowolną liczbę znaków.

Jeśli jednak z jakiegoś powodu musisz je zdekodować, przejdź base64na koniec potoku. Następnie zbierze 5 znaków z urandom i base64 zakoduje go odpowiednim dopełnieniem, ale końcowy ciąg może być dłuższy niż to, co chciałeś ze względu na dopełnienie.

cat /dev/urandom | head -c 5 | base64
Umur Kontacı
źródło
To nie jest dokładnie to, o co pytało pytanie. Twoja odpowiedź może być nadal przydatna, ale pytanie nie ma wystarczającego kontekstu, aby powiedzieć na pewno.
kasperd
1
@kasperd Pytanie pyta (w tytule), jak odczytać N losowych znaków z / dev / urandom, ale w treści prosi o odczytanie bajtów. Zgadzam się, że istnieje niespójność. Przyszedłem do tego pytania od Google za czytanie znaków i myślę, że może to pomóc przyszłym użytkownikom jako opcję.
Umur Kontacı
Myślę, że twoja odpowiedź jest najprostsza, ale najłatwiejsza do zrozumienia. Dzięki!
Robert
1
Użycie catspowoduje odczytanie znacznie więcej niż podanej liczby Nznaków i może wyczerpać entropię. Nieprzydatna odpowiedź.
Dr Beco,
1
Chociaż dr Beco jest prawdą, że to jest nadużyciem cat, ponieważ oba base64i headmoże przyjmować jako argument nazwę pliku, w tym przypadku to działa i nie powinna wyczerpywać entropii. Zobacz stackoverflow.com/questions/10031344/…
J.Money
11

Spróbuj tego: dd if=/dev/urandom bs=1 count=3

Jeśli chcesz umieścić wynik w zmiennej $:

variable=`dd if=/dev/urandom bs=1 count=3`

Pamiętaj, że prawdopodobnie nie będzie można go wydrukować.

Eduardo Ivanec
źródło
Czy polecenie może być również użyte do odczytu 3 losowych bajtów danych binarnych?
Dimitrios Desyllas
6

Najłatwiejsze rozwiązanie byłoby tak proste, jak:

$ head -cN /dev/urandom
Spack
źródło
2
Co to dodaje do już udzielonych odpowiedzi?
MadHatter,
5
prostsze wywołanie
m.kocikowski