hello-world
webエンジニアのメモ。とりあえずやってみる。

[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 ありがとうございます。

参考


Related #apache

[apache].htaccessで日付と時間に応じてリダイレクトさせる

apache使用時に、ある時間になるまでは特定の階層以下にアクセスできないようにしたい場合、RewriteCondに時間を指定することで実現できました。

PHPからrsyncを実行する

「stg環境でアップロードしたファイルを、本番環境へ反映する管理機能が欲しい」という要望があった場合、同一サーバ内であればcpコマンドでファイルをコピーできますが、stg環境と本番環境が分かれている場合はrsyncコマンドでファイルを転送する必要があります。