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 1
con un head -c 3
se il nuovo carattere di riga non è necessario alla fine.
Illegal byte sequence
errore. 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 5
con il numero di caratteri che desideri.
Se, tuttavia, è necessario decodificarli per qualche motivo, spostarsi base64
alla 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
cat
leggerà molto più di un determinato numero di N
caratteri e può esaurire l'entropia. Risposta non utile
cat
entrambi base64
e head
può 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?