パスワードに使ってはいけない記号
パスワードを推測されにくいものとする、という口実で記号を入れることが推奨されている。ただしどうやら誰かの思いつきを無批判的に踏襲しているようで、なぜなら使ってはいけない記号があることについて誰も述べていない。
パスワードとしては使えるが、実運用では使えないという記号、あるのだ。
;(セミコロン)
である。
セミコロンを含むパスワードに変更は可能である。が、シェルスクリプトはそれを扱ってくれない。シェルは論理的には2行に渡る入力を物理的に1行で受け付ける事ができる。そのとき;(セミコロン)を改行の記号とみなす。つまりシェルへの命令の中に;(セミコロン)があればシェルはそこで2行に分けて取り扱うのだ。
であるからシェルスクリプト中で「パスワードを入れてログイン(リモートなりsuなりで)」している場合、そのパスワードに;(セミコロン)が入っていると、;(セミコロン)までを一つの命令とみなし、つまり間違ったパスワードを入力したと判断するのだ。;(セミコロン)のあとに'del *'があるなんてパスワードでなくて本当に良かった。
実績のあるシェルスクリプトがいきなり止まって!なぜだろう?1分で気がついたことは褒めてくれ、ひょっとしてパスワードに制御文字が入っているのではなかろうか?でもエスケープシーケンスを使えば行けそうな気がするだろ。;(セミコロン)だけはダメみたいだ。コーテーションでくくっても受け付けてもらえない。
ではなぜパスワード変更は受け付けたのか?疑問が湧くよね。簡単だ、シェルを通してないからだ。つまりpasswdコマンドでパスワードを変更しようとすると、そのときターミナル画面に出てくるのは
新しいパスワード:
新しいパスワードを再入力してください:
である。ここで見慣れたプロンプト、つまり(シェルやユーザーによって違いはあるが)
コマンドを打つのはここだよ、と表示される#とか$とかいう文字がパスワード変更では出てこない。つまりシェルを通してないのだ。だからシェルでは行の切れ目とみなされる;(セミコロン)があっても受け付けてくれるわけである。
このくらいのこと誰か警鐘を鳴らしているかと思ったのだが、いない?まあ無意識的に避けるだろうなあ。事実上の素人でなければ。
ということで
&(アンパーサンド), ;(セミコロン)、 `(バックコーテーション)、'(シングルコーテーション)、"(ダブルコーテーション)、\(バックスラッシュ)、|(パイプ)、~(チルダ)、<(リダイレクション)、>(リダイレクション)、{(ブレイス)、}(ブレイス)は避けたほうが無難でしょう。
え、bashのメタ文字はもう1種あるでしょって?
確かに()があるのだが、記号の読みを書く時に使っちゃって・・・これがメタ文字が生まれた理由なのだろうなあ。
これ、UNIXの世界特有のものかもしれません。でもそれ以外の人にも知っといてほしいと思って最後まで伏せておきました。なのでUNIXを使わない人も、パスワードにはそれ以外の記号を使うようにしましょう。(UNIXからWindowsにシェルスクリプトでログインすることはまずないと思いますが。)
それでも*(アスタリスク)を使いたいという人はいなだろうなあ。