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ń:
head -c 500 /dev/urandom: Uzyskaj od pierwszych 500 znaków (bajtów) /dev/urandom.
tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Usuń wszystkie znaki oprócz określonych w 'a-zA-Z0-9~!@#$%^&*_-'danych wyjściowych pierwszego polecenia.
fold -w 3: Sformatuj dane wyjściowe drugiego polecenia, tak aby zawierało 3 znaki w wierszu.
head -n 1: Wyświetla pierwszy wiersz wyniku trzeciego polecenia stdout.
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, 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.
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ć.
$()
działa?It treats the output of a command like a variable.
naprawdę masz na myśli ciąg, prawda?$()
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.(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ń:
head -c 500 /dev/urandom
: Uzyskaj od pierwszych 500 znaków (bajtów)/dev/urandom
.tr -dc 'a-zA-Z0-9~!@#$%^&*_-'
: Usuń wszystkie znaki oprócz określonych w'a-zA-Z0-9~!@#$%^&*_-'
danych wyjściowych pierwszego polecenia.fold -w 3
: Sformatuj dane wyjściowe drugiego polecenia, tak aby zawierało 3 znaki w wierszu.head -n 1
: Wyświetla pierwszy wiersz wyniku trzeciego poleceniastdout
.źródło
fold -w 3 | head -n 1
je znakiem,head -c 3
jeśli nowy znak linii nie jest potrzebny na końcu.Illegal byte sequence
błę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
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.
źródło
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ł.
Zamień
5
na dowolną liczbę znaków.Jeśli jednak z jakiegoś powodu musisz je zdekodować, przejdź
base64
na 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.źródło
cat
spowoduje odczytanie znacznie więcej niż podanej liczbyN
znaków i może wyczerpać entropię. Nieprzydatna odpowiedź.cat
, ponieważ obabase64
ihead
może przyjmować jako argument nazwę pliku, w tym przypadku to działa i nie powinna wyczerpywać entropii. Zobacz stackoverflow.com/questions/10031344/…Spróbuj tego:
dd if=/dev/urandom bs=1 count=3
Jeśli chcesz umieścić wynik w zmiennej $:
Pamiętaj, że prawdopodobnie nie będzie można go wydrukować.
źródło
Najłatwiejsze rozwiązanie byłoby tak proste, jak:
źródło