カレントディレクトリから再帰的に下位の全てのディレクトリをたどって、検索したいことがないだろうか。

これって、ぼくは頻繁に使いたくなるのだが、なぜか解説しているサイトがほとんど見つからなかった。

Grep で特定の拡張子のファイルのみ対象・除外する」の説明を見て、

$ grep -r 検索パターン --include='*.foo'

とすると、拡張子 "foo" のファイルのみ検索対象として、パターンを検索できるのが分かった。

それでも普段ついつい、

$ grep -r 検索パターン *.foo

としてしまう。

他のコマンドでは、指定ファイルのみ対象にしたいとき、このように指定するからだ。

例えば ls の場合、

$ ls *.c

とすると、拡張子が ".c" のファイルのみの一覧を返してくれるのだ。

どうしてこの形式で統一して、 grep でも指定拡張子のみからの検索ができるようにならないのだろう。面倒だ。

・・・と思ったのだが、多分これって、上の "*.c" という指定の結果が展開されるのが、「指定した1つのディレクトリのファイルだけ」だからではないか。

つまり、動作としては、シェル上でコマンドを入力し、その中に、ワイルドカードを使ったファイル名の指定があった場合、そのパターンにマッチするファイル名がシェルによって全て展開され、コマンドに渡される。ただし、当然だが、それは指定した1つのディレクトリのみが対象であり、複数のディレクトリを1つのワイルドカードで指定する方法はない、と。

例えば、 grep -r "foo" ~/bar/baz/*.sh は、 ~/bar/baz/ ディレクトリにある "*.sh" というパターンにマッチするファイルを対象として検索してくれる。ただし、 -r を指定していることの意味はなくなってしまい、 ~/bar/baz/ の下にディレクトリがあっても、それらは検索対象とならない。なぜなら、シェルが ~/bar/baz/*.sh を展開しファイルの一覧をコマンドに渡す結果、対象がそのファイルのあるディレクトリのみに限定されてしまうからだ。

また、 grep -r "foo" ~/bar/*/*.sh などとしてみても、それは ~/bar/ とその下の全てのディレクトリを対象とする、という意味にはならない。

ここまで検証してみて思ったのだが、 find コマンドの場合、

$ find /home/ -name "*.c"

のようにしてやると、指定のディレクトリ /home/ とその下の全てのディレクトリを対象として、 "*.c" というパターンにマッチするファイル名を全て検索してくれる。

grep の場合も、同様に第1オプションで検索を開始するディレクトリを指定するという方法であれば、現在の「 -r 指定により下位のディレクトリも検索できるが、『カレントディレクトリから下位』としか指定できない」という問題も解決できるのだが、どうだろうか。

他の方法としては、

$ sudo cat `sudo find /home/ -name *.c` | grep "foo"

のようにすることで、指定のディレクトリ以下にある指定の拡張子のファイルのみを対象として grep で検索ができる。

さらに他の方法として、

コマンド find ファイル名・タイムスタンプ・ファイルサイズなどを元に、ファイル・ディレクトリを検索する。」によると、

$ grep "foo" `find /home/ -name "*.c"`

のようにすることでも、指定のディレクトリ以下にある指定の拡張子のファイルのみを対象として grep で検索ができる。


ベーシック認証の設置方法 2019-08-10 (土) 11:13:52+09:00

メモ

ネットで検索すると .htaccess と .htpasswd というファイルを作るという説明が多数あった。

まず .htaccess について。

いきなり、認証をかけたい url に .htaccess を用意して、

    AuthType Basic

AuthName "Input your ID and Password."

AuthUserFile /url/.htpasswd

require valid-user

のように書けばよい、と書いてあるサイトがあるが、間違いだ。

ベーシック認証を許可するには、ベーシック認証を実行したい url で AuthType, AutoName, Require, AuthUserFile などの認証処理に必要なディレクティブが許可されていなければいけないのだ。

その方法は2つある。

1つ目は、上記の通り .htaccess を用意する方法だが、その url でベーシック認証に必要なディレクトリ群を使用許可していなければいけないので、 httpd.conf (以前書いた通り ubuntu の apace2 では apache2.conf)にて、

<Directory "/設定したい url /">

AllowOverride AuthConfig

</Directory>

のようにして、ベーシック認証に必要なディレクティブの実行を許可しておく必要がある。

<Directory "/設定したい url /">

AllowOverride None

</Directory>

などとなっている場合もあるので、 httpd.conf ( apache2.conf ) をよく見て修正する必要がある。

2つ目は、 httpd.conf ( apache2.conf ) に直接、

<Directory /ベーシック認証したいurl/>

AuthType Basic

AuthName "Auth"

AuthUserFile .htpasswd

Require valid-user

</Directory>

のように記述する方法だ。

これらの方法で、ベーシック認証を行いたい url での認証許可や認証に使うファイルを指定しておく。

次は .htpasswd についてだ。

多くのサイトでの .htpasswd の作り方の紹介内容が問題だ。多くのサイトが、自分のページに、「暗号化されたパスワード文字列を生成するツール」を用意していて、それを使って作るように書いてある。

それは、あぶなくて使えない。

ネットのセキュリティを構築するためのパスワードなのに、どこの誰かも分からないサイトに、大事なユーザ名とパスワードを渡してしまえば、暗号化されたパスワードまで知られてしまう。

セキュリティはゼロになる。

暗号化されたパスワードは、自分で作れる。

apache2 のパッケージの中に htpasswd というコマンドがあるので、それで作るとよい。

ubuntu の場合、htpasswd コマンドは apache2-utils パッケージの中に含まれていて、 /usr/bin/ にインストールされる。

使い方は、「ApacheでBasic認証をするhtpasswdのコマンド」にも書かれているが、こちらの解説はユーザ名を指定して .htpasswd ファイルを作るとしか書かれていないので不十分である。

参考サイトに書かれているように

htpasswd -c ファイル名 ユーザ名

と入力したらどうなるかというと、そのユーザ名のためのパスワードを聞かれる。そして、決めたパスワードを入力すると、指定したファイル名でベーシック認証用のファイル(通常は .htpasswd )が作成される。

htpasswd -bc ファイル名 ユーザ名 パスワード

とすると、パスワードまで指定してコマンドを実行し、指定のファイル名でベーシック認証用のファイルを作成できる。

より詳しい使い方は htpasswd --help で自分で確かめてほしい。

おまけ:

アクセス制限ベーシック認証 ~パスワードでページを守ろう~」では、 perl のスクリプトでパスワードの暗号化を行う例が示されている。