[apache]cronで指定時刻になったら.htaccessのbasic認証を解除する


cronを使って指定時間になったらbasic認証を解除したいと思い調べてやってみました。

.htaccessとcronが使えるサーバが必要になります。

まずは下準備。

.htaccess にbasic認証設定を記述

AuthUserFile /home/sample/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType Basic

require valid-user

<Files ~ "^.(htpasswd|htaccess)$">
   deny from all
</Files>

この状態でサイトにアクセスするとbasic認証がかかります。

次はsedを使って特定行をコメントアウトするのを検証してみます。

以下のコマンドで1~6行目の行頭に「#」をつけることができます。

まずはコマンドを実行してbasic認証部分をコメントアウトされることを確認。

sed -i '' "1,6s/^/#/g" .htaccess

sed -i.orig "1,6s/^/#/g" .htaccess
#.htaccess.origとしてバックアップを残す場合はこちら

コメントアウトされている部分を元に戻して、cron設定を行います。

  • crontab用のファイルを作成
vi ~/crontab

# 9/17 22:00にbasic認証をコメントアウト
0 22 17 9 * sed -i '' "1,6s/^/#/g" /Project/xxxx/public/.htaccess
  • crontabで外部ファイルを読み込ませる
crontab ~/crontab

これで指定時間になるとbasic認証が解除されます。

本来はデプロイツールを使って本番化を行うのが通常だと思いますが、お手軽本番化として使えるかもしれないですね。

9/21追記

@tkuchiki にアドバイスいただき、atコマンドでも同様のことが実現できることを知りました。

  • basic_comment.sh というシェルスクリプトを用意
#!/bin/sh
sed -i -e "1,6s/^/#/g" /Project/xxxx/public/.htaccess

-iに空文字を渡さず、
-i “1,6s/^/#/g”
としたところ
command a expects \ followed by text
のエラーが発生したのですが
-i -e “1,6s/^/#/g”
とeオプションを明示的に書けばうまく変換できました。

  • 実行権限追加
chmod 701 basic_comment.sh
  • atコマンド実行
# 9/17 22:00に実行(日付の指定方法に注意)
at -f ~/basic_comment.sh "22:00 17.09.14"
  • 指定時刻前にatqコマンドを実行するとキューに保存されているのが確認できます
atq

cronだと定期実行になるので実行後に消して置く必要がありましたがatなら1回限りなので、今回のような用途にはatのほうがよさそうですね。

@tkuchiki ありがとうございます。

参考