![Texto simples de análise de script, o que há de errado aqui?](https://rvso.com/image/1344712/Texto%20simples%20de%20an%C3%A1lise%20de%20script%2C%20o%20que%20h%C3%A1%20de%20errado%20aqui%3F.png)
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 grep
para obter a linha que desejo ("63 caracteres ASCII imprimíveis aleatórios:") e, em seguida, uso sed
para 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 <
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/"/"/g; s/'/'\''/g; s/&/&/g; s/</</g; s/>/>/g; print; exit'
Nem todos os sed entendem esta sintaxe
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'