TR neden OSX’de / dev / urandom’dan okuyamıyor?


35

Bir meslektaşım aşağıdaki komutu kullanarak rastgele bir anahtar oluşturmayı önerdi:

tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs

Bana hata verdi:

tr: Yasadışı bayt sırası

/dev/urandomBenim sistemimde olmadığı için endişeliyim . Bu dosyanın nasıl kurulacağını bulmak için googling'i denedim, ancak boş kaldım. Denedim locate urandomve boş geldi. (aslında, man sayfasını buldu, ama bu yardımcı olmuyor)

urandomMac OSX sistemimde nasıl kullanılabilir hale getiririm? (Aslan)


3
İlginç kullanımı xargs...
sendmoreinfo 16:13

Yanıtlar:


49

Aldığınız hata iletisine göre, sorun olduğunu sanmıyorum / dev / urandom. Olsaydı, "böyle bir dosya veya dizin yok" gibi bir hata beklerdim.

Aldığınız ve bulduğunuz hata mesajını aradım, bu da sorununuzla ilgili olabilir gibi görünüyor: http://nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-sequence

Temel olarak, trkomutu ile hazırlayarak yerel ayarları belirtin LC_CTYPE=C:

LC_CTYPE=C tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs

Teşekkürler, bu gerçekten hile yaptı. Neden bulamadığımı urandomveya bir fikrim var randommı? Onlar gerçek dosya sisteminde bulunmayan özel büyülü "dosyalar" mı? (Ayrıca bağlantı çürüklüğünü hafifletmek için bir düzenleme önerdim)
Kirk Woll

1
locateDoğrudan dosya sisteminizde arama yapmadığına inanıyorum , ancak sorgunuzu önceden oluşturulmuş bir veritabanı kullanarak arar. Bu veritabanı büyük olasılıkla / dev / ve diğer 'özel' dosya sistemlerini yoksaymak üzere yapılandırılmıştır.
lk

yeterince adil, fakat doğrudan baktığımda göremiyorum /dev. Git figürü. Ama yardımın için tekrar teşekkürler.
Kirk Woll,

1
10.9 üzerinde çalışmak görünmüyor; hala aynı hata mesajıyla başarısız oluyor. LC_ALL=Chile tho mu.
Erik Allik

1
Lütfen bu bağlantıyı , bilgileri içermeyen en son blog sayfasına işaret ettiği gibi nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-sequence olarak değiştirin tr.
Jeroen Wiert Pluimers,

11

Kişisel trgirişimleri UTF-8 kodlamasında metin olarak onun girişini yorumlamak. Bu nedenle, geçerli olmayan UTF-8 olmayan ilk bayt sırasına şikayet eder ve iptal eder. Prefixing trile LC_ALL=Cveya LC_CTYPE=Cbir ortama o değişkeni ihraç edecek trböylece C standardına yerel karakter kümesine onun fikrini değiştirerek, yani her şey opak yalnızca bir bayt dizisidir.

Bu arada, \)-+emrindeki emir kasıtlı mı? Bu *, daha önce dahil ettiğiniz, ancak -istediğiniz gibi kendisini içermez . Bunun yerine bunlardan birini yazmak daha iyi:

LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()\-+=' < /dev/urandom
LC_CTYPE=C tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)\\-+= < /dev/urandom

6

Diğerleri belirtildiği gibi, senin sorunun değil mi /dev/urandomeksik ziyade nasıl tryerine enviornment ile karıştırmasını OS X'te eserler kullanımını varialbes perlyerine tr:

perl -pe 'binmode(STDIN, ":bytes"); tr/A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+=//dc;' < /dev/urandom | head -c 32; echo

Bu, OS X, Redhat ve Ubuntu'da taşınabilir olma avantajına sahiptir.

( Çıktının sonunda yeni bir satır elde etmek için xargs, cadıyı değiştirerek boruyu da çıkardım echo.)


Er ya da geç, Perl'in binmode ":utf8"standart olmasını beklerim , bu noktada Perl çözümünüz de aynı problemi tryaşar.
Mark

Mark'ın kod örneğine binmode (STDIN, ": bytes") ekleyerek kaygıları giderildi.
Trenton

2

Öncelikle, dahil etmek niyetinde mi -yoksa *geçerli karakterler listesinde? Parametre trdizisi içeren )-+bayt aralığı ile başlayan" anlamına gelir )ve ile sona eren +aslında olan )*+.

İkincisi, çekirdek entropi havuzundan birçok kilobayt okumak yerine (ve böylece tüm havuzu güvenli entropi gerektiren diğer işlemleri etkileyebilecek güvensiz olarak işaretlemek yerine), yalnızca istediğiniz kadar bit okumayı düşünün: ilk adım head -c...olarak kullanın , ve sonra istenmeyen karakterleri silmek yerine çeviri yapın.

Sorunun bu özel sürümü 76 farklı sembol kullanan biraz sıra dışı; çoğu sadece alfanümerik istiyor, bu yüzden sadece 64 sembolden memnun kalırsanız, base64yardımcı programı kullanmak entropi havuzunun tüketimini en aza indirecektir (24’ün 6 / 8’i olduğuna dikkat edin):

head -c24 < /dev/random | base64

1

Yerel ayarınızın karakter kodlaması (söyleyebileceğiniz locale charmap) karakter başına çok baytlıktır.

Günümüzde en yaygın olanı, karakterlerin 1 ile 4 bayt arasında kodlanabileceği UTF-8'dir. Tüm bayt dizileri UTF-8'de geçerli karakterler oluşturmaz. UTF-8'deki her ASCII olmayan karakter, en yüksek iki bit kümesine sahip bir baytla başlar ve en yüksek (ancak en yüksek ikinci bit olmayan) bit kümesinin kaç baytı izlediğini söyler.

/dev/urandomrastgele bir bayt akışı içerir. trkarakteri çevirir, bu yüzden bu baytları karakter olarak çözmesi gerekir. Aralığınızdaki ASCII karakterlerinin tümü UTF-8'deki bir karakterde kodlanmıştır, ancak tryine de tüm karakterlerin kodunu çözmesi gerekir. Örneğin A, 0x41 bayt (kod için A) dışında bazı karakterlerin bulunduğu diğer çok baytlı kodlamalar da vardır .

Çünkü bu rastgele bayt akışı geçersiz diziler içerecek şekilde bağlanır (örneğin ASCII olmayan bir karakterin 0xc1'den büyük bir bayt ile başlaması gerektiğinden, UTF-8'de kendi başına bir 0x80 bayt geçersizdir (0xc0 ve 0xc1 UTF 8 karakter)), öyleyse trbu olduğunda bir hata ile döner.

Burada istediğiniz şey, bayt akışını, karakter başına bir bayt olan bir kodlamada karakter olarak düşünmektir. Hangisini seçerseniz seçin sizin aralığında bu karakterlerin tümü kadar önemli değildir (gibi AZ tarafından varsaysak, demek ABCDEFGHIJKLMNOPQRSTUVWXYZ şeylerden değil Ý, Ê) bu yüzden sisteminizde desteklenen tüm chartsets'ten aynı kodlanmış taşınabilir karakter kümesine dahil bulunmaktadır.

Bunun için, belirlersiniz LC_CTYPEkullanılan ve hangi gibi şeyler hangi charset karar biridir yerelleştirme değişkeni blank, alphakarakter sınıfları içerir. Ancak, AZ aralığının tanımı için, LC_COLLATEdeğişkeni de (dize sıralamasına karar veren) ayarlamak isteyeceksiniz .

CAka POSIXyerel bir garanti karakterleri olduğundan tek bayt ve AZ ABCDEFGHIJKLMNOPQRSTUVWXYZ olduğunu. Yapabilirsin:

 LC_CTYPE=C LC_COLLATE=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'

(burada -sonuna kadar hareket etmek , aksi halde, )-+bir menzil gibi olacaktı A-Z)

Ama dikkat bu LC_ALLdeğişken diğer tüm geçersiz kılar LC_*ve LANGdeğişkenleri. Bu nedenle, eğer LC_ALLönceden tanımlanmışsa, yukarıdakilerin hiçbir etkisi olmaz. Yani bunun yerine basitçe yapabilirsiniz:

 LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'

Bu, hata mesajlarının dili gibi diğer şeyleri etkileyecektir, ancak yine de, LC_CTYPE'yi değiştirmek zaten hata mesajları için bir sorun olabilir (örneğin, C yerel ayarında Rusça veya Japonca hata mesajlarını ifade etmenin bir yolu yoktur).


0

Göre adam sayfasında , / dev / random muhtemelen ihtiyaçlarınız için yeterli olacak. Belki de Apple gereksiz olduğundan / dev / urandomu oluşturmaktan vazgeçti?


Bende de yok /dev/random.
Kirk Woll

MacOSX hem / dev / random ve / dev / urandom'a sahip olmalıdır. Belki de Apple artık bu özel dosyaları içermemektedir? Ya da belki sadece orada XCode yüklerseniz var?
jsbillings

1
FWIW, Lion yükseltilmiş dağ aslan iş istasyonumda her iki cihaz da mevcut. Lion'da da bulunduğuna inanıyorum. Düğümler de farklıdır (13,0'a karşı 13,1)
mrb,
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.