Я большой пользователь https://www.grc.com/passwords.htm, чтобы получить надежные пароли. Тем не менее, необходимость заходить на сайт и вручную копировать пароль каждый раз, когда быстро стареет, поэтому я решил сделать небольшой сценарий, чтобы сделать это для меня. Каждый раз, когда вы перезагружаете страницу, она представляет вам новые пароли в виде простого текста, так что это сценарий.

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

Поскольку нет идентифицирующих классов или идентификаторов, я получаю страницу через curl , перенаправляю ее на grep чтобы получить нужную строку («63 произвольных печатаемых символа ASCII:»), а затем использую sed для удаления всего, вплоть до пароля, так как ну и все после него, наконец, копирование в буфер обмена с помощью pbcopy .

Все это прекрасно работает, за исключением одной маленькой детали. Строка, которую я получаю в конце, всегда должна быть длиной 63 символа, но это не так. Обычно она колеблется между 64, 67, 70 и 73, и я понятия не имею, почему.

Кто-нибудь может пролить свет на это?

4 ответа4

2

Это может быть связано с кодировкой HTML, где, например, символ < в 63 символах фактически представлен как объект &lt; в источнике, делая вашу строку немного длиннее.

1

Как уже сказал Мусио , проблема заключается в кодировании HTML некоторых специальных символов.

Perl может конвертировать их надежно и легко:

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

Вот что вам нужно учесть - результирующая строка вашего скрипта может часто содержать определенные символы, которые не экранируются должным образом в операциях sed.

Например, эти символы могут быть подозрительными: скобки, одинарные и двойные кавычки, фигурные скобки, восклицательные знаки, прямая и обратная косая черта, а также звездочки.

Я попытался бы убрать один из этих символов из возвращенной строки в серии тестов, сравнивая результаты, чтобы увидеть, приведет ли удаление одного из любого числа этих символов к 63.

0

Исходя из вашего комментария к mousio, ваша цепочка grep/sed ... может быть уменьшена до одной команды:

Perl обычно устанавливается по умолчанию

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'

Не все sed понимают этот синтаксис

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .