私は大のユーザーです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
識別クラスや ID がないため、 を通じてページを取得しcurl
、 にパイプしてgrep
必要な行 ("63 個のランダムな印刷可能な ASCII 文字:") を取得し、 を使用してsed
パスワードまでのすべてとそれ以降のすべてを削除し、最後に を使用してクリップボードにコピーしますpbcopy
。
1 つの小さな詳細を除いて、すべて正常に動作します。最終的に取得する文字列は常に 63 文字の長さになるはずですが、そうではありません。通常は 64、67、70、73 の間で変化しますが、その理由はわかりません。
誰かこれについて何か説明できますか?
答え1
としてマウスすでに述べたように、問題はいくつかの特殊文字の HTML エンコードにあります。
Perl はこれらを確実かつ簡単に変換できます。
curl 'https://www.grc.com/passwords.htm' | \
grep 'ASCII characters:' \
perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
答え2
これは HTML エンコーディングに関係している可能性があります。たとえば、<
63 文字の a は実際にはソース内のエンティティとして表され<
、文字列が少し長くなります。
答え3
ここで考慮すべきことがあります。スクリプトの結果の文字列には、sed 操作で適切にエスケープされていない特定の文字が含まれることがよくあります。
たとえば、括弧、一重引用符と二重引用符、中括弧、感嘆符、スラッシュとバックスラッシュ、アスタリスクなどの文字が疑わしい場合があります。
一連のテストで返された文字列からこれらの文字の 1 つを削除し、結果を比較して、これらの文字の任意の数の 1 つを削除するとカウントが 63 になるかどうかを確認します。
答え4
mousio へのコメントに基づいて、grep/sed のチェーンを 1 つのコマンドに減らすことができます。
Perlは通常デフォルトでインストールされます
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'
すべてのsedがこの構文を理解するわけではない
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'