/ Dev / urandom'dan N rastgele karakterlerle nasıl okunur?


50
read /dev/urandom 3

Yukarıdaki çalışmıyor. Bash'tan rastgele baytları nasıl okuyabilirim /dev/urandom?

Yanıtlar:


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

1
@ Flimzy, nasıl $()çalışır?
linux

2
Bir komutun çıktısını değişken gibi ele alır. Not: Bu bir bashism. Bash kullanmıyorsanız, bunun yerine `` kullanmanız gerekebilir. `` daha evrensel, ancak bence $ () okumak daha kolay.
Flimzy

@Flimzy, It treats the output of a command like a variable.aslında string olarak demek istiyorsun, değil mi?
linux

2
Bir değişken olabilir bir dize ... ya bir numara olmak. Değişken olarak algılar ... sonra içeriğe bağlı olarak, bir dize veya bir sayı gibi davranılır.
Flimzy

1
$()bash-özgü değil, oldukça evrensel. BTW, kabuğun değişkenlerde hangi karakterleri saklayabileceğine dair kısıtlamalar yaşamadığınıza dikkat edin - örneğin, test ettiğim bash sürümü dizgiden null (\ x00) bırakıyor.
Gordon Davisson

44
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1

(Değişmez çizgi karakterleri istiyorsanız, çizgi karakterinin tersine, dizenin sonuna gitmesi gerekir *-_.

Ve yukarıdaki komutlardan dolayı neler yapıldığını açıklamak:

  1. head -c 500 /dev/urandom: İlk 500 karakteri (bayt) 'dan alın /dev/urandom.
  2. tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Kaldır ancak tüm belirtilen karakterlerin 'a-zA-Z0-9~!@#$%^&*_-'ilk komutunun çıkışından.
  3. fold -w 3: İkinci komutun çıktısını, her satırda 3 karakter olacak şekilde biçimlendirin.
  4. head -n 1: Üçüncü komut sonucunun ilk satırını açık olarak göster stdout.

1
3 byte arıyor ...
Chris S

1
3 artı kesin desen
ADM

Bu mükemmel.
Danijel-James W.

3
Harika! Tr func için kullanılabilir olan char sınıfı isimleri ([: graph | print | etc:]) de vardır ve sonunda yeni satır karakterine gerek duyulmazsa, fold -w 3 | head -n 1a ile değiştirilerek daha da basitleştirilebilir head -c 3.
Zimmi

5
Sistemin varsayılan kodlaması çok baytlıysa (örn. UTF-8), tr bir Illegal byte sequencehatayla başarısız olur . Bunu düzeltmek için "C" kodlamasını kullanın; komutu şu şekilde değiştirin:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
devstuff

33

Lütfen kontrol et man od.

Örneğin kullanabilirsiniz

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

işaretsiz ondalık bayt rasgele sayılar oluşturmak için.


1
Ekrem, SF'ye hoş geldiniz. Normalde uzun süredir kabul edilen sorulara yeni cevaplar istemiyorum, ancak bu gerçekten önceki tüm cevaplardan gerçekten farklı ve bazı gerçek avantajları var - güzel! +1 benden ve umarım SF etrafında kalır ve bir süre daha böyle buna katkıda bulunursunuz.
MadHatter

19

İşte base64 dizeleri yaratan bir tane var, bunlara rağmen base64 dizeleriyle sınırlı olsalar da, dolgu malzemelerinin onlardan çıkarıldığını, bu yüzden onların kodunu çözemeyeceğinizi unutmayın, muhtemelen yine de ihtiyacınız olmayacak.

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

5İstediğiniz karakter sayısı ile değiştirin .

Ancak bir nedenden dolayı onları çözmeniz base64gerekirse, borunun sonuna gidin. Daha sonra, urandom ve base64'ten 5 karakter toplayacaktır, onu doğru dolgu ile kodlayın, ancak son dize dolgu nedeniyle istediğinizden daha uzun olabilir.

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

Sorunun tam olarak sorduğu şey bu değil. Cevabınız hala yararlı olabilir, ancak sorunun kesin olarak söyleyecek yeterli bağlamı yok.
kasperd

1
@kasperd Soru (başlıkta) / dev / urandom'dan N rastgele karakterin nasıl okunacağını ancak vücutta bayt okumak için sorar. Bir tutarsızlık olduğuna katılıyorum. Bu soruya Google’dan karakter okumak için geldim ve bunun gelecekteki ziyaretçilere bir seçenek olarak yardımcı olabileceğini düşünüyorum.
Umur Kontacı,

Bence cevabın en basit ama anlaşılması en kolay şey. Teşekkürler!
Robert

1
Kullanmak cat, verilen miktardan çok daha fazlasını okuyacak Nve entropiyi tüketebilir. Faydalı cevap yok.
Dr Beco,

1
Beco doğru olsa da, cather ikisinin de kötüye kullanımı olduğu base64ve headsavı olarak bir dosya adı alabileceği doğru olsa da , bu durumda işe yarar ve entropiyi tüketmemelidir. Bkz. Stackoverflow.com/questions/10031344/…
J.Money

11

Bunu dene: dd if=/dev/urandom bs=1 count=3

Sonucu $ değişkenine koymak istiyorsanız:

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

Muhtemelen yazdırılabilir olmayacağını unutmayın.


Komut ayrıca 3 rastgele baytlık ikili veriyi okumak için de kullanılabilir mi?
Dimitrios Desyllas

6

En kolay çözüm, aşağıdaki kadar basit olurdu:

$ head -cN /dev/urandom

2
Bu daha önce verilen cevaplara ne ekler?
MadHatter

5
basit çağırma
m.kocikowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.