Um colega sugeriu a criação de uma chave aleatória por meio do seguinte comando:
tr -dc A-Za-z0-9_\!\@\#\$\%\^\&\*\(\)-+= < /dev/urandom | head -c 32 | xargs
Isso me deu o erro:
tr: sequência de bytes ilegal
Estou preocupado que eu não tenho /dev/urandom
no meu sistema. Tentei pesquisar no Google para descobrir como instalar esse arquivo, mas acabei vazio. Eu tentei locate urandom
e também vim vazio. (na verdade, ele encontrou a página de manual, mas isso não ajuda)
Como urandom
disponibilizo no meu sistema Mac OSX? (Leão)
xargs
...Respostas:
Com base na mensagem de erro que você recebe, não acho que / dev / urandom seja o problema. Se assim fosse, esperaria um erro como "nenhum arquivo ou diretório".
Procurei a mensagem de erro que você recebeu e a encontrou, o que parece ser relevante para o seu problema: http://nerdbynature.de/s9y/2010/04/11/11/tr-Illegal-byte-sequence
Basicamente, especifique o código do idioma acrescentando o
tr
comando comLC_CTYPE=C
:fonte
urandom
ourandom
? Eles são "arquivos" mágicos especiais que não existem no sistema de arquivos real? (Também sugeri uma edição para ajudar a mitigar link-rot)locate
que não pesquisa diretamente seu sistema de arquivos, mas consulta sua consulta usando um banco de dados pré-criado. Este banco de dados provavelmente está configurado para ignorar o / dev / e outros sistemas de arquivos 'especiais'./dev
. Vai saber. Mas obrigado novamente pela ajuda.LC_ALL=C
faz o truque tho.tr
informações.Suas
tr
tentativas de interpretar sua entrada como texto na codificação UTF-8. Portanto, ele irá reclamar e interromper a sequência de primeiro byte que não é válida UTF-8. Prefixartr
comLC_ALL=C
ouLC_CTYPE=C
vai exportar essa variável no ambiente detr
, mudando assim a sua ideia do conjunto de caracteres local para o padrão C, ou seja, tudo é apenas uma seqüência de bytes opacos.A propósito, a sequência
\)-+
em seu comando é intencional? Isso inclui*
também o que você já incluiu, mas não inclui a-
si próprio como você poderia ter planejado. Melhor escrever um destes:fonte
Como outros já indicaram, seu problema não é o que
/dev/urandom
está faltando, mas comotr
funciona no OS X. Em vez de brincar com o ambiente varialbes, useperl
no lugar detr
:Isso tem a vantagem de ser portátil no OS X, Redhat e Ubuntu.
(Também removi o tubo para
xargs
, substituindo o bruxoecho
, para obter uma nova linha no final da saída.)fonte
binmode ":utf8"
padrão; nesse momento, sua solução Perl terá o mesmo problema quetr
ele.Em primeiro lugar, você pretendia incluir
-
ou*
na lista de caracteres válidos? O parâmetro paratr
inclui a sequência,)-+
que significa "o intervalo de bytes que começa)
e termina com+
, o que é realmente)*+
.Em segundo lugar, em vez de ler muitos kilobytes do pool de entropia do kernel (e, assim, marcar todo o pool como inseguro, o que afetará qualquer outro processo que precise de entropia segura), considere ler apenas quantos bits forem necessários: use
head -c...
como a primeira etapa, e depois traduza em vez de descartar caracteres indesejados.Essa versão específica do problema é um pouco incomum, pois usa 76 símbolos diferentes; a maioria quer apenas alfanuméricos; portanto, se você estiver satisfeito com apenas 64 símbolos, o uso do
base64
utilitário minimizará o consumo do pool de entropia (observe que 24 é 6/8 de 32):fonte
A codificação de caracteres da localidade (com a qual você pode contar
locale charmap
) é de vários bytes por caractere.Atualmente, o mais comum é o UTF-8, onde os caracteres podem ser codificados com mais de 1 a 4 bytes. Nem todas as seqüências de bytes formam caracteres válidos em UTF-8. Todo caractere não ASCII do UTF-8 começa com um byte com os dois bits mais altos definidos e informa quantos bytes com o conjunto de bits mais alto (mas não o segundo mais alto) a seguir.
/dev/urandom
contém um fluxo aleatório de bytes.tr
translitera caracteres, portanto, é necessário decodificar esses bytes como caracteres. Esses caracteres ASCII no seu intervalo são todos codificados em um caractere em UTF-8, mastr
ainda precisam decodificar todos os caracteres. Por exemplo, existem outras codificações de vários bytes em que alguns caracteres que nãoA
contêm o byte 0x41 (o código paraA
).Como esse fluxo aleatório de bytes deve conter sequências inválidas (por exemplo, um byte de 0x80 é inválido em UTF-8, pois um caractere não ASCII deve iniciar com um byte maior que 0xc1 (0xc0 e 0xc1 não possui UTF- 8 caracteres)), então
tr
retorna com um erro quando isso acontece.O que você deseja aqui é considerar esse fluxo de bytes como caracteres em uma codificação que possui um byte por caractere. Seja qual você escolher não é importante como todos os personagens em sua faixa (assumindo por AZ, você significou ABCDEFGHIJKLMNOPQRSTUVWXYZ e não coisas como
Ý
,Ê
) fazem parte do conjunto de caracteres portátil para ser codificado o mesmo em todos os conjuntos de caracteres suportados no sistema.Para isso, você deve definir a
LC_CTYPE
variável localização, que é a que decide qual charset é usado eo que coisas comoblank
,alpha
classes de personagens conter. Mas para a definição do intervalo AZ, você também desejará definir aLC_COLLATE
variável (a que decide a ordem das strings).O
C
código dePOSIX
idioma aka é aquele que garante que os caracteres sejam bytes únicos e AZ é ABCDEFGHIJKLMNOPQRSTUVWXYZ. Você poderia fazer:(aqui, mover o
-
para o final, caso contrário,)-+
seria aceito como um intervaloA-Z
)Mas observe que a
LC_ALL
variável substitui todas as outrasLC_*
eLANG
variáveis. Portanto, seLC_ALL
já estiver definido de outra forma, o acima não terá efeito. Então, você pode simplesmente fazer:Isso afetará outras coisas, como o idioma das mensagens de erro, mas, de qualquer maneira, alterar LC_CTYPE já pode ter sido um problema para mensagens de erro (por exemplo, nenhuma maneira de expressar mensagens de erro em russo ou japonês no conjunto de caracteres do código de idioma C).
fonte
De acordo com a página de manual , / dev / random provavelmente será suficiente para suas necessidades. Talvez a Apple tenha deixado de criar o / dev / urandom porque é desnecessário?
fonte
/dev/random
.