Подтвердить что ты не робот

Как получить случайную строку из 32 шестнадцатеричных цифр через командную строку?

Я бы хотел собрать команду, которая выведет строку из 32 шестнадцатеричных цифр. У меня есть Python script, который работает:

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

Это генерирует вывод, например:

6EF6B30F9E557F948C402C89002C7C8A 

Это то, что мне нужно.

На Mac я могу даже это сделать:

uuidgen | tr -d '-'

Однако у меня нет доступа к более сложным языкам сценариев ruby ​​и python, и я не буду на Mac (так что uuidgen не будет). Мне нужно придерживаться более bash 'ish инструментов, таких как sed, awk,/dev/random, потому что я на ограниченной платформе. Есть ли способ сделать это?

4b9b3361

Ответ 1

Если у вас есть hexdump то:

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

должен сделать работу.

Объяснение:

  • -n 16 чтобы использовать 16 байтов ввода (32 шестнадцатеричных числа = 16 байтов).
  • 4/4 "%08X" для итерации четыре раза, потребляйте 4 байта за итерацию и печатайте соответствующее 32-битное значение в виде 8 шестнадцатеричных цифр, с ведущими нулями, если необходимо.
  • 1 "\n" чтобы закончить одной новой строкой.

Примечание: это решение использует /dev/random но может также использовать /dev/urandom. Выбор между ними является сложным вопросом и выходит за рамки этого ответа. Если вы не уверены, посмотрите, возможно, на этот другой вопрос.

Ответ 2

Есть три способа, которыми я знаю:

#!/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

Используйте один, запишите два других.

Ответ 3

Вот еще несколько вариантов, все из которых имеют приятное свойство обеспечить очевидный и простой способ прямого выбора длины выходной строки. Во всех приведенных ниже случаях изменение "32" на нужную длину строки - это все, что вам нужно сделать.

#works in bash and busybox, but not in ksh
tr -dc 'A-F0-9' < /dev/urandom | head -c32

#works in bash and ksh, but not in busybox
tr -dc 'A-F0-9' < /dev/urandom | dd status=none bs=1 count=32

#works in bash, ksh, AND busybox! w00t!
tr -dc 'A-F0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null

EDIT: Протестировано в разных оболочках.

Ответ 4

Если вы ищете одну команду и у вас установлен openssl, см. Ниже. Генерация случайных 16 байтов (32 шестнадцатеричных символа) и кодирование в шестнадцатеричном формате (также поддерживается -base64).

openssl rand -hex 16