Коллега предложил создать случайный ключ с помощью следующей команды:
tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs
Это дало мне ошибку:
tr: недопустимая последовательность байтов
Я обеспокоен тем, что у меня нет /dev/urandom
в моей системе. Я попытался поискать в Google, чтобы выяснить, как установить этот файл, но у меня ничего не получилось. Я пытался locate urandom
и тоже пришел пустой. (ну, на самом деле, он нашел справочную страницу, но это не помогает)
Как сделать urandom
доступным в моей системе Mac OSX? (Лев)
xargs
...Ответы:
Судя по полученному вами сообщению об ошибке, я не думаю, что проблема заключается в / dev / urandom. Если бы это было так, я бы ожидал ошибку типа «нет такого файла или каталога».
Я искал сообщение об ошибке, которое вы получили, и обнаружил, что оно может иметь отношение к вашей проблеме: http://nerdbynature.de/s9y/2010/04/11/tr-Illegal-byte-sequence
По сути, укажите локаль, добавив
tr
команду с помощьюLC_CTYPE=C
:источник
urandom
илиrandom
? Это особые магические «файлы», которых нет в реальной файловой системе? (Также я предложил изменить, чтобы помочь смягчить гниение ссылок)locate
что не ищет непосредственно вашу файловую систему, а скорее ищет ваш запрос, используя предварительно созданную базу данных. Эта база данных, скорее всего, настроена на игнорирование / dev / и других «специальных» файловых систем./dev
. Пойди разберись. Но еще раз спасибо за помощь.LC_ALL=C
делает трюкtr
информацию.Ваши
tr
попытки интерпретировать его ввод как текст в кодировке UTF-8. Таким образом, он будет жаловаться и прерываться на первой последовательности байтов, которая не является допустимой UTF-8. Приставкаtr
сLC_ALL=C
илиLC_CTYPE=C
будет экспортировать эту переменную в окружающую средуtr
, тем самым изменяя его идею локального набора символов в стандарте C, то есть все это просто последовательность байтов непрозрачными.Кстати, последовательность
\)-+
в вашей команде преднамеренная? Это включает*
в себя также, что вы уже включили, но не включает-
себя, как вы, возможно, хотели. Лучше написать один из них вместо этого:источник
Как уже отмечали другие, ваша проблема не в том, что
/dev/urandom
отсутствует, а скорее в том, какtr
работает на OS X. Вместо того, чтобы возиться с enviournment varialbes, используйтеperl
вместоtr
:Это имеет преимущество в переносимости через OS X, Redhat и Ubuntu.
(Я также удалил канал
xargs
, заменяя ведьмуecho
, чтобы получить новую строку в конце вывода.)источник
binmode ":utf8"
стандарт, и в этот момент ваше решение Perl будет иметь ту же проблему, чтоtr
и.Во-первых, вы намеревались включить
-
или*
в список допустимых символов? Параметр, которыйtr
включает последовательность,)-+
которая означает «диапазон байтов, начинающийся с)
и заканчивающийся+
, который на самом деле)*+
.Во-вторых, вместо того, чтобы читать много килобайт из пула энтропии ядра (и, следовательно, помечать весь пул как незащищенный, что повлияет на любые другие процессы, которым требуется безопасная энтропия), рассмотрите чтение только того количества бит, которое вам необходимо: используйте
head -c...
в качестве первого шага, а затем переводить, а не отбрасывать нежелательных символов.Эта конкретная версия проблемы немного необычна, поскольку использует 76 различных символов; большинству просто нужны буквенно-цифровые символы, поэтому, если вы будете удовлетворены только 64 символами, использование
base64
утилиты сведет к минимуму потребление пула энтропии (обратите внимание, что 24 равно 6/8 из 32):источник
Кодировка символов вашей локали (которую вы можете сказать
locale charmap
) - многобайтовая на символ.Наиболее распространенным в настоящее время является UTF-8, где символы могут быть закодированы от 1 до 4 байтов. Не все последовательности байтов образуют допустимые символы в UTF-8. Каждый не ASCII-символ в UTF-8 начинается с одного байта, в котором установлены два старших бита, и сообщает, сколько байтов следует за старшим (но не вторым старшим) битом.
/dev/urandom
содержит случайный поток байтов.tr
транслитерирует символ, поэтому он должен декодировать эти байты как символы. Все символы ASCII в вашем диапазоне кодируются одним символом в UTF-8, ноtr
все же необходимо декодировать все символы. Есть, например, другие многобайтовые кодировки, где некоторые символы, кроме,A
содержат байт 0x41 (код дляA
).Поскольку этот случайный поток байтов должен содержать недопустимые последовательности (например, сам по себе байт 0x80 является недопустимым в UTF-8, так как не-ASCII-символ должен начинаться с байта, большего чем 0xc1 (0xc0 и 0xc1 отсутствуют в UTF- 8 символов)), поэтому
tr
возвращается с ошибкой, когда это происходит.Здесь вы хотите рассмотреть этот поток байтов как символы в кодировке, которая имеет один байт на символ. Какой бы вы выбрали, не важно , так как все эти символы в вашем диапазоне (предполагая , что от AZ, вы имели в виду ABCDEFGHIJKLMNOPQRSTUVWXYZ и не такие вещи , как
Ý
,Ê
) являются частью портативного набора символов так быть закодированы то же самое во всех кодировок , поддерживаемых в системе.Для этого, нужно установить
LC_CTYPE
переменную локализации , которая является тот , который решает , какой набор символов используется и то , что такие вещи , какblank
,alpha
символьные классы содержат. Но для определения диапазона AZ вы также захотите установитьLC_COLLATE
переменную (ту, которая решает порядок строк).C
АкаPOSIX
локаль одно , что гарантирует символы в одиночные байты и AZ является АБВГДЕЖЗИКЛМНОПРСТУФХЧШЭЮЯ. Вы могли бы сделать:(здесь перемещение
-
до конца, в противном случае,)-+
будет восприниматься как диапазонA-Z
)Но обратите внимание, что
LC_ALL
переменная переопределяет все остальныеLC_*
иLANG
переменные. Таким образом, еслиLC_ALL
иное уже определено, вышеприведенное не будет иметь никакого эффекта. Так что вместо этого вы можете просто сделать:Это повлияет на другие вещи, такие как язык сообщений об ошибках, но в любом случае изменение LC_CTYPE уже могло быть проблемой для сообщений об ошибках (например, нет способа выразить русские или японские сообщения об ошибках в кодировке локали C).
источник
Согласно справочной странице , / dev / random, вероятно, будет достаточно для ваших нужд. Возможно, Apple перестала создавать / dev / urandom, потому что в этом нет необходимости?
источник
/dev/random
.