Help us understand the problem. What is going on with this article?

[10分で出来る]シェルスクリプトの結果をslackに投稿

More than 5 years have passed since last update.

はじめに

slack便利ですよね。仕事柄、何かを監視しつつチャットで話すということをよくおこなっているので、監視の結果を別画面ではなくてslackで表示できたら便利だよねという話になりました。やってみると簡単でしたので、こちらで手順を説明します。

サンプルとしてwコマンドの結果をslackに送ってみます。

手順としては大きく二つ、Incoming WebHooksの登録と、シェルの作成になります。シェルはサンプルを用意したのでそちらをちょっと書き換えるだけで動きます。Mac上で試しましたが、Linuxでも動くとおもいます。
とういことで以下、手順です。

Incoming WebHooksの登録

slackにログインします。
名前の右側のボタン(?)をクリックして「Configure Integrations」を選択します。

ConfigureIntegration.png

一覧が沢山でてきますが、「Incoming WebHooks」を選択します。ブラウザの検索を使うと便利です。「Incoming WebHooks」は、指定されたURLにメッセージを送るとslack上にそのメッセージが表示されるという機能です。

右側の「+Add」ボタンをクリックします。
IncomingWebhooks.png

デフォルトの投稿チャンネルを選択します。Incoming WebHooks に引数をあたえることで投稿チャンネルは変更できます。個人的にはテスト等のチャンネルをつくっておいて、設定することをお勧めしますが、この例では#generalを設定しています。設定後、「Add Incoming Webhooks Integration」ボタンが有効になるのでクリックします

AddIWH.png

送信用のURLが表示されます。設定もいろいろできるのですが、10分でできると書いている関係上、URLをメモするだけにします。ちなみにIncoming Webhookss Integrationは、パスワード認証とかないので、このURLさえあれば、誰でも投稿できる点注意が必要です。そのため画像ではモザイクにしています。

URL.png

シェルスクリプトの実行

送信用のURLも手にいれましたので、スクリプトの時間です。

bash
#!/bin/sh

set -eu

#Incoming WebHooksのURL
WEBHOOKURL="ここにIncoming Webhooks IntegrationのURLをいれてね"
#メッセージを保存する一時ファイル
MESSAGEFILE=$(mktemp -t webhooks)
trap "
rm ${MESSAGEFILE}
" 0

usage_exit() {
    echo "Usage: $0 [-m message] [-c channel] [-i icon] [-n botname]" 1>&2
    exit 0
}

while getopts c:i:n:m: opts
do
    case $opts in
        c)
            CHANNEL=$OPTARG
            ;;
        i)
            FACEICON=$OPTARG
            ;;
        n)
            BOTNAME=$OPTARG
            ;;
        m)
            MESSAGE=$OPTARG"\n"
            ;;
        \?)
            usage_exit
            ;;
    esac
done
#slack 送信チャンネル
CHANNEL=${CHANNEL:-"#general"}
#slack 送信名
BOTNAME=${BOTNAME:-"mybot"}
#slack アイコン
FACEICON=${FACEICON:-":ghost:"}
#見出しとなるようなメッセージ
MESSAGE=${MESSAGE:-""}

if [ -p /dev/stdin ] ; then
    #改行コードをslack用に変換
    cat - | tr '\n' '\\' | sed 's/\\/\\n/g'  > ${MESSAGEFILE}
else
    echo "nothing stdin"
    exit 1
fi

WEBMESSAGE='```'`cat ${MESSAGEFILE}`'```'

#Incoming WebHooks送信
curl -s -S -X POST --data-urlencode "payload={\"channel\": \"${CHANNEL}\", \"username\": \"${BOTNAME}\", \"icon_emoji\": \"${FACEICON}\", \"text\": \"${MESSAGE}${WEBMESSAGE}\" }" ${WEBHOOKURL} >/dev/null

WEBhooksURLの変数にさきほど記録したURlを設定し、webhooks.shとして保存して、実行権限をあたえます。
使い方は簡単標準入力に送信したいメッセージを送るだけです。

$ echo test1 | ./webhooks.sh

とすると
スクリーンショット 2015-03-20 17.31.08.png

$ w | ./webhooks.sh

であれば
スクリーンショット 2015-03-20 17.31.19.png

と送信できました。

おわりに

駆け足でシェルスクリプトからslackにメッセージを送信する方法を説明しました。 注意点としては

  • 改行をslack用に¥nに変換していますが、¥に変換した後¥nにしているので、文字列中に¥があると改行がおかしく表示されるとおもいます。
  • #generalは誰もがみるチャンネルなのでテスト用に自分のチャンネルをつくるかbotから直接自分にメッセージをくるようにしてテストしたほうがよいです。
  • URLの取り扱いにはご注意を(設定画面で削除することはできます)。

cronと組み合わせて定時報告させるととても便利です。また、スクリプトをみてもらえるとわかりますが、アイコン等も簡単に変更できますので、ある閾値を越えたら怒ったJenkinsが通知というような事もできますね。

ではでは。

tt2004d
AWSの構築の仕事をしています。
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした