2015-12-17 4 views
9

Mi piacerebbe mettere insieme un comando che stamperà una stringa di 32 cifre esadecimali. Ho uno script Python che funziona:Come ottenere una stringa casuale di 32 cifre esadecimali tramite la riga di comando?

python -c 'import random ; print "".join(map(lambda t: format(t, "02X"), [random.randrange(256) for x in range(16)]))' 

Questo genera output come:

6EF6B30F9E557F948C402C89002C7C8A 

Che è quello che mi serve.

Su un Mac, posso anche fare questo:

uuidgen | tr -d '-' 

Tuttavia, non ho accesso al più sofisticati linguaggi di scripting Ruby e Python, e non sarò su un Mac (così no uuidgen). Ho bisogno di usare altri strumenti bash come sed, awk,/dev/random perché sono su una piattaforma limitata. C'è un modo per fare questo?

+2

'head -c16 Biffen

risposta

21

Se avete hexdump allora:

hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random 

dovrebbe fare il lavoro.

Spiegazione:

  • -n 16 di consumare 16 byte di ingresso (32 cifre esadecimali = 16 byte).
  • 4/4 "%08X" per iterare quattro volte, consumare 4 byte per iterazione e stampare il valore corrispondente a 32 bit come 8 cifre esadecimali, con zeri iniziali, se necessario.
  • 1 "\n" terminare con una nuova riga singola.
+1

Giusto. E '% 08X' è ancora meglio se sono necessarie esattamente 32 cifre esadecimali quando ci sono zeri iniziali. Ho modificato la mia risposta di conseguenza. –

+0

Ancora meglio. Avrei cambiato di nuovo se potessi. – Biffen

+0

@Renauld_Pacalet Come potrei fare la stessa cosa e produrre un esagono di 32 cifre come questo da un codice Python. Quando lo faccio su riga di comando funziona veloce prima volta, poi dopo ci vogliono 30 secondi o più per qualche motivo. –

4

Ci tre modi che io conosca:

#!/bin/bash 

n=16 

# Read n bytes from urandom (in hex): 
xxd -l "$n" -p     /dev/urandom | tr -d " \n" ; echo 
od -vN "$n" -An -tx1    /dev/urandom | tr -d " \n" ; echo 
hexdump -vn "$n" -e ' /1 "%02x"' /dev/urandom ; echo 

Utilizzare uno, commentare le altre due.

+0

Nella mia esperienza 'od' è il più comune. MacOS aveva 'hexdump',' xdd' e 'od'. Git Bash (MinGW) aveva 'xxd' e' od'. L'immagine del Docker basata su Alpine Linux aveva 'od' (e' tr', ovviamente). E tutte e tre le piattaforme avevano '/ dev/urandom'. Quindi, se stai cercando il più portatile, allora rimani con il sapore 'od'. –