Androidのメモとか

ポキオの日記です。今日も遅延してない。

Raspberry PiのVNCサーバーの自動起動の設定と自分のローカルIPの自動メール送信設定で捗るVNCライフ

まずはtightvncserverを入れる

何はともあれ、VNCのサーバー機能を有効にする必要があります。デフォルトではインストールされていないので、お馴染みのapt-getで取得します。

apt-get install tightvncserver

初回起動時はパスワード等の設定が求められるので、取り敢えず起動しておきます。

tightvncserver

ちゃんとVNCサーバーが起動してるかはnetstatで確認できます。

netstat -nlt

結果はこんな感じで取得できます。5901ポートで待ち受けているので、その記載があれば、なんとなく動いています。

pi@raspberrypi:/ $ netstat -nlt
稼働中のインターネット接続 (サーバのみ)
Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態
tcp 0 0 0.0.0.0:5901 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:6001 0.0.0.0: LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0: LISTEN
tcp6 0 0 :::22 ::: LISTEN

tightvncserverをRaspberry Pi起動時に自動的に開始させる

電源入れたら、自動でVNCサーバーが立ち上がって、HDMIには何も接続しなくても良いようにしたい。誰もがそういうことを欲していると思います。

なんとなくググると出てくるのが、vncbootというスクリプトを書いて、/etc/init.d/直下に移動して、chmod

sudo update-rc.d vncboot defaults

このコマンドを打つことで、起動時に自動的にvncboot内の処理を行ってくれます。vncbootは以下のとおり。ネット上の記事で散見されるのが、#! /bin/shという記述を一番上に書かないケース。自分の環境では上手く動きませんでした。なので、#! /bin/shを先頭に書いています。VNCの画面サイズは大きすぎず、MacbookAndroidタブレットからアクセスした時になるべく画面サイズに合うように1280x720にしておきました。

#! /bin/sh    

### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO

# /etc/init.d/vncboot

USER=pi
HOME=/home/pi

export USER HOME

case "$1" in
    start)
        echo "Starting VNC Server"
        #Insert your favoured settings for a VNC session
        su $USER -c '/usr/bin/vncserver :1 -geometry 1280x720 -depth 24'
        ;;

    stop)
        echo "Stopping VNC Server"
        su $USER -c '/usr/bin/vncserver -kill :1'
        ;;

    *)
        echo "Usage: /etc/init.d/vncboot {start|stop}"
        exit 1
        ;;
esac

exit 0

VNCが起動しているローカルIPアドレスを他のデバイスに知らせる

ここまでの操作でtightvncserverRaspberry Piの起動とともに立ち上がるようにできました。ただ、いざ他のデバイスからVNCでアクセスしようとしても、どのローカルの5901ポートで待ち受けているのか分からなければ意味がありません。かと言って、Wi-Fi接続時にDHCPではなく固定アドレスにするもの、若干使い勝手が悪いです。

なので、今回はRaspberry Piが立ち上がったら、wlan0のローカルIPアドレスを取得して特定のメールアドレスに送りつけるスクリプトを書きます。今回はssmtpを使って、コマンドラインからメールを投げられるようにします。

apt-get install ssmtp

まずはインストール。メールの設定は/etc/ssmtp/ssmtp.confにかかれているので、これを編集します。今回は、Gmailを使った設定をしてみます。

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=xxxxxxxx@gmail.com

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.gmail.com:587

# Where will the mail seem to come from?
rewriteDomain=gmail.com

# The full hostname
hostname=gmail.com

AuthUser=xxxxxxxx@gmail.com
AuthPass=XXXXXXXX
AuthMethod=LOGIN
UseSTARTTLS=YES

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES

こんな感じで設定ファイルを書き換えます。グーグルのアカウントで2段階認証を使っているとうまくいかない場合があります。また、そうでなくてもメールを送ろうとするとグーグルから「安全性の低いアプリのアクセス」があったとかないとか怒られるので、許可をする必要があります。

逆に言うと、セキュリティレベルを落としてメールを送れるようにする方法なので、メインのグーグルアカウントを設定しないほうが良さそうです。

これでメールが送れるようになりました。次に、このssmtpを使って、自分のIPアドレスをメースするスクリプトを書きます。

#!/bin/sh

echo "start sleep..."

sleep 30s

echo "creating email..."

mailTo="yyyyyyyy@gmail.com"
mailFrom="xxxxxxxx@gmail.com"
mailSubject="Raspberry Piが起動しました"

echo "To:${mailTo}" > mailFile
echo "From:${mailFrom}" >> mailFile
echo "Subject:${mailSubject}" >> mailFile
echo "" >> mailFile

var=`ifconfig wlan0`

IFS_ORG="$IFS"

IFS=" "
set -- $var
var="$7"

IFS=":"
set -- $var
var="$2"

IFS="$IFS_ORG"

echo "$var" >> mailFile

sudo sendmail -t < mailFile

echo "sent email..."
cat mailFile
rm mailFile

exit 0

かなりゴリゴリのコードですが、ifconfig wlan0で諸々の情報が取得できるので、コマンド結果をSplitしてローカルIPアドレスの部分だけ抜き取ってメールの本文としています。また、スクリプトが呼ばれてすぐにメールを投げるのではなく、30秒のマージンを持たせてからメールを投げています。起動直後にインターネット接続性があるか怪しかったからです。

最後に、このスクリプトを起動直後に自動で走らせるようにします。さっきのスクリプトとは別に、/etc/rc.localに記載を追記します。数行で収まるような処理は/etc/rc.localに書いてしまったほうが楽なこともあります。(が、今回は思ったよりコード行数が大きくなったので、別途スクリプトファイルを作成しました・・・)

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

/home/pi/[IPアドレスを送りつけるスクリプト].sh

exit 0

exit 0の前に、スクリプトファイルを実行するような記述を追加するだけです。

いざ実行

Raspberry Piを起動して少し経つとメールが。

Raspberry Pi TightVncServer Auto Launch

OK、動作しているようです。試しにMacから接続してみます。

Raspberry Pi TightVncServer Auto Launch

先ほどのアドレスとポート番号を打って・・・

Raspberry Pi TightVncServer Auto Launch

よし、接続完了。

Raspberry Piクックブック (Make:PROJECTS)

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。