シェル

[macOS] Terminalでファイルを監視し更新されたら指定の処理をする – fswatch

一言で言えばGulpのようなタスクランナーっぽいことをmacOS上でやりたかったのです。

「Gulp入れればいいじゃん」という話もありますが、今回はファイルが更新されたら特定のコマンドを実行したいだけだったので、わざわざNode.jsの環境を整えてJavaScriptをガリガリ書くのはちょっと面倒だったんですよね。

macOSではファイルが更新されたか監視する際にfswatchを使うのが鉄板のようなので、こちらを利用します。


続きを読む

[Linux] bashで超簡易的な改ざん検知を行いSlackに投げる

小ネタが続いてますが、今回も小ネタですw
Webサイトの改ざん検知を手軽にパパッと行いたい場合、単純にcurlなどで取得したファイルをdiffで比較するだけでも実現できます。

というわけで以下がコード。ここでは最終的にSlackに通知しています。

#!/bin/bash

#
# 簡易的な改ざん検知からのSlack投稿
#

# 対象ページ
TARGET_URL='https://blog.katsubemakito.net/'

# 投稿先のSlack URL
WEB_HOOK_URL='https://hooks.slack.com/services/xxxxxxxx/xxxxxxxx/xxxxxxxxxxxxxxxxxx'

# 保存先ディレクトリ
STORE_DIR='/home/katsube/'


#-----------------------------------
# 最新のHTMLを取得
#-----------------------------------
cd $STORE_DIR
curl -s $TARGET_URL -o current.html

if [ $? -ne 0 ]; then
  echo "Can not get TARGET_URL: $TARGET_URL" >&2
  exit 1
fi

#-----------------------------------
# 前回のファイルと比較する
#-----------------------------------
if [ -f ./prev1.html ]; then
  result=`diff prev1.html current.html`

  if [ -z ${result} ]; then
    text="変化はありません"
  else
    text="<!channel> 変化がありました"
  fi


  # Slackに投げる
  curl -X POST --data-urlencode "payload={\"text\": \"${text}\"}" $WEB_HOOK_URL

  if [ $? -ne 0 ]; then
    echo "Can not post Slack, diff is ${result}" >&2
    exit 1
  fi
fi

#-----------------------------------
# 今回取得したファイルの名称変更
#-----------------------------------
# 1世代残す
if [ -f ./prev1.html ]; then
  mv prev1.html prev2.html
fi
mv current.html prev1.html

非常に簡易的な物ですので、実際に利用する場合は要件に応じてカスタマイズしてください。
続きを読む

[Linux] Bashでlsやfindの実行結果を1件ずつ処理したい

Bashでlsなどコマンドの実行結果を順番に処理したい場合は以下のようにforでぐるぐる回してやるだけです。

#!/bin/bash

for file in `ls /tmp/*.json`; do
  echo "copy ${file} to /home/foo"
  cp $file /home/foo
done

ここでは「/tmp」ディレクトリ配下にある拡張子が.jsonのファイルを順番に指定ディレクトリへコピーしています。対象のファイルが存在しない場合は何もしません。
続きを読む

[Linux] Bashで一定件数以上のファイルを削除する

日次バッチなどを作っていると、例えばバックアップファイルは最新30件だけ保存し、それ以上古いファイルは削除したいといった気持ちになりますよね。そんな時に利用するのが次のワンライナー。

$ cd backup/
$ rm -f `ls -t . | tail -n+31`

これだと30日前の日付を計算して毎回削除するといった処理を書かなくて済みます。厳密にn日分確保する必要がある場合は日付の計算を行った方が良いでしょうが、念の為一定期間取っておきたいくらいのゆるい要件であれば十分でしょう。

  • 保存しておきたいファイル数に「+1」することをお忘れなく。
  • ディレクトリを削除する場合はrmに-rをつけてください。

続きを読む

[Linux] Bashでwgetの戻り値をチェックする

小ネタです。
シェルスクリプトを書いている際にwgetで正常にファイルをダウンロードできた場合のみ処理を継続したい場合には次のようなコードを書きます。

#!/bin/bash

wget 'https://example.com/foo.zip'

if [ $? -ne 0 ]; then
  echo "[ERROR] 正常にダウンロードできませんでした"
  exit 1
fi
  • $?は直前のコマンドの実行結果が自動的に入ります。
  • 比較演算子の-nenot equalの略で、値が等しくない場合に使用します。

続きを読む

bashで知能指数の低いbotを作成する

何らかのAPIを延々と自然な形で叩き続けたいときがありますよね。え?ないw? ←

JMeterのようなテスト用のフレームワークを使っても良いのですがそこまでするのは準備が面倒だし、ApacheBenchのようにDDoS…もとい負荷テストをするわけでもないといった場合にはbashのようなシェルスクリプトをちょちょいと書いてやると簡単に実現できます。

こういった類いのプログラムをゲーム界隈では「bot」や「バッチ」と呼称しています。

続きを読む