Risposte:
random="$(dd if=/dev/urandom bs=3 count=1)"
It treats the output of a command like a variable.intendi davvero come stringa, giusto?
$()è piuttosto universale, non specifico per bash. A proposito, fai attenzione a non incorrere in limitazioni su quali caratteri la shell può memorizzare in variabili - ad esempio, la versione di bash che ho testato lascia nulli (\ x00) dalla stringa.
head -c 500 /dev/urandom | tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
(Se vuoi caratteri di trattino letterali, il carattere di trattino deve andare alla fine della stringa come fatto sopra, al contrario di *-_).
E per spiegare cosa viene fatto grazie al set di comandi sopra:
head -c 500 /dev/urandom: Ottiene i primi 500 caratteri (byte) da /dev/urandom.tr -dc 'a-zA-Z0-9~!@#$%^&*_-': Rimuove tutti i caratteri tranne quelli specificati 'a-zA-Z0-9~!@#$%^&*_-'dall'output del primo comando.fold -w 3: Formatta l'output del secondo comando in modo che contenga 3 caratteri per riga. head -n 1: Visualizza la prima riga del risultato del terzo comando stdout.fold -w 3 | head -n 1con un head -c 3se il nuovo carattere di riga non è necessario alla fine.
Illegal byte sequenceerrore. Per risolvere il problema, utilizzare la codifica "C"; cambia il comando in:head -c 500 /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9~!@#$%^&*_-' | fold -w 3 | head -n 1
Per favore, controlla man od.
Puoi usare, per esempio
od -vAn -N4 -tu4 < /dev/urandom
per generare numeri casuali decimali senza segno di 4 byte.
Eccone uno che crea stringhe base64, nota che sebbene siano limitate alle stringhe base64, il padding viene rimosso da esse, quindi non puoi decodificarle, probabilmente non ti serviranno comunque.
cat /dev/urandom | base64 | head -c 5
Sostituisci 5con il numero di caratteri che desideri.
Se, tuttavia, è necessario decodificarli per qualche motivo, spostarsi base64alla fine della pipe. Quindi raccoglierà 5 caratteri da urandom e base64 lo codificherà con il giusto riempimento, ma la stringa finale potrebbe essere più lunga di quella che volevi a causa del riempimento.
cat /dev/urandom | head -c 5 | base64
catleggerà molto più di un determinato numero di Ncaratteri e può esaurire l'entropia. Risposta non utile
catentrambi base64e headpuò prendere un nome di file come argomento, in questo caso funziona e non dovrebbe esaurire l'entropia. Vedere stackoverflow.com/questions/10031344/...
Prova questo: dd if=/dev/urandom bs=1 count=3
Se vuoi mettere il risultato in $ variabile:
variable=`dd if=/dev/urandom bs=1 count=3`
Nota che probabilmente non sarà stampabile.
La soluzione più semplice sarebbe semplice come:
$ head -cN /dev/urandom
$()funziona?