Odpowiedzi:
random="$(dd if=/dev/urandom bs=3 count=1)"
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.
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
.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.
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ń 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.
cat /dev/urandom | head -c 5 | base64
cat
spowoduje odczytanie znacznie więcej niż podanej liczby N
znaków i może wyczerpać entropię. Nieprzydatna odpowiedź.
cat
, ponieważ oba base64
i head
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 $:
variable=`dd if=/dev/urandom bs=1 count=3`
Pamiętaj, że prawdopodobnie nie będzie można go wydrukować.
Najłatwiejsze rozwiązanie byłoby tak proste, jak:
$ head -cN /dev/urandom
$()
działa?