Texto de análisis de script simple, ¿qué hay de malo aquí?

Texto de análisis de script simple, ¿qué hay de malo aquí?

Soy un gran usuario dehttps://www.grc.com/contraseñas.htmpara obtener contraseñas seguras. Sin embargo, tener que ir al sitio y copiar manualmente la contraseña cada vez se vuelve obsoleto rápidamente, así que decidí hacer un pequeño script para hacerlo por mí. Cada vez que recargas la página, te presenta nuevas contraseñas en texto sin formato, así que este es el script.

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

Como no hay clases de identificación o ID, obtengo la página a través de curl, la canalizo para grepobtener la línea que quiero ("63 caracteres ASCII imprimibles al azar:") y luego borro sedtodo hasta la contraseña, así como todo después de ello, finalmente copiando al portapapeles con pbcopy.

Todo esto funciona bien, excepto por un pequeño detalle. La cadena que obtengo al final siempre debe tener 63 caracteres, pero no lo es. Suele variar entre 64, 67, 70 y 73 y no tengo idea de por qué.

¿Alguien puede aclarar esto?

Respuesta1

ComomusioComo ya hemos dicho, el problema es la codificación HTML de algunos caracteres especiales.

Perl puede convertirlos de forma fiable y sencilla:

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

Respuesta2

Podría tener que ver con la codificación HTML, donde, por ejemplo, a <en los 63 caracteres en realidad se representa como la entidad &lt;en la fuente, lo que hace que la cadena sea un poco más larga.

Respuesta3

Aquí hay algo que debe considerar: la cadena resultante de su secuencia de comandos a menudo puede contener ciertos caracteres que no se escapan correctamente en las operaciones sed.

Por ejemplo, estos caracteres pueden ser sospechosos: corchetes, comillas simples y dobles, llaves, signos de exclamación, barras diagonales y posteriores, y asteriscos.

Intentaría eliminar uno de estos caracteres de la cadena devuelta en una serie de pruebas, comparando los resultados para ver si la eliminación de uno de cualquier número de estos caracteres llevará el recuento a 63.

Respuesta4

Según su comentario a mousio, su cadena de grep/sed... se puede reducir a un comando:

Perl suele instalarse de forma predeterminada

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'

No todos los sed entienden esta sintaxis

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}'

información relacionada