Texto simples de análise de script, o que há de errado aqui?

Texto simples de análise de script, o que há de errado aqui?

Sou um grande usuário dehttps://www.grc.com/passwords.htmpara obter senhas fortes. Porém, ter que ir ao site e copiar manualmente a senha toda vez fica cansativo rapidamente, então decidi fazer um pequeno script para fazer isso para mim. Cada vez que você recarrega a página, ela apresenta novas senhas em texto simples, então este é o script.

curl 'https://www.grc.com/passwords.htm' | grep '63 random printable ASCII characters:' | sed 's/^.*size=2>//' | sed 's/<\/font>.*$//' | pbcopy

Como não há classes ou IDs de identificação, eu pego a página curl, canalizo-a greppara obter a linha que desejo ("63 caracteres ASCII imprimíveis aleatórios:") e, em seguida, uso sedpara excluir tudo, até a senha, bem como tudo depois disso, finalmente copiando para a área de transferência com pbcopy.

Tudo isso funciona bem, exceto por um pequeno detalhe. A string que recebo no final deve sempre ter 63 caracteres, mas não tem. Geralmente varia entre 64, 67, 70 e 73 e não faço ideia do porquê.

Alguém pode lançar alguma luz sobre isso?

Responder1

Comomousiojá dito, o problema é a codificação HTML de alguns caracteres especiais.

Perl pode convertê-los de maneira confiável e fácil:

curl 'https://www.grc.com/passwords.htm' | \
    grep 'ASCII characters:' \
    perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'

Responder2

Pode ter a ver com a codificação HTML, onde, por exemplo, a <nos 63 caracteres é realmente representado como a entidade &lt;na fonte, tornando sua string um pouco mais longa.

Responder3

Aqui está algo para você considerar - a string resultante do seu script pode muitas vezes conter certos caracteres que não estão sendo escapados corretamente nas operações sed.

Por exemplo, esses caracteres podem ser suspeitos: colchetes, aspas simples e duplas, chaves, pontos de exclamação e barras invertidas e asteriscos.

Eu tentaria retirar um desses caracteres da string retornada em uma série de testes, comparando os resultados para ver se a remoção de um de qualquer número desses caracteres levará a contagem para 63.

Responder4

Com base no seu comentário ao mousio, sua cadeia de grep/sed... pode ser reduzida a um comando:

Perl geralmente é instalado por padrão

perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/&/g; s/&lt;/</g; s/&gt;/>/g; print; exit'

Nem todos os sed entendem esta sintaxe

sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/\&/g; s/&lt;/</g; s/&gt;/>/g; p;q}'

informação relacionada