まずは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の画面サイズは大きすぎず、MacbookやAndroidタブレットからアクセスした時になるべく画面サイズに合うように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アドレスを他のデバイスに知らせる
ここまでの操作でtightvncserver
がRaspberry 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を起動して少し経つとメールが。
OK、動作しているようです。試しにMacから接続してみます。
先ほどのアドレスとポート番号を打って・・・
よし、接続完了。