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


Odpowiedzi:


44
random="$(dd if=/dev/urandom bs=3 count=1)"

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.

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.


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

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ć.


Czy polecenie może być również użyte do odczytu 3 losowych bajtów danych binarnych?
Dimitrios Desyllas

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.