NervesでSSHを利用する場合の日本語の情報がほとんどありませんよね。なければ自分で作るということでSSHの環境をまとめてみたいと思います。
これは「Nervesのネットワーク環境を整えた」の続編になります。
#追記(2020.01.21)
ネットワークやSSHの設定はconfig
ディレクトリにあるconfig.exs
とtarget.exs
どちらに記述しても問題なさそうです(記述方法も同じ)。今回はconfig/config.exs
に記載することとします。
config/
config.exs ←今回はこちらに設定を記述
target.exs
#環境
- RaspberryPi 3
- Nerves
#わかること
このようなことがわかります。
ですが、SSHで利用する公開鍵と秘密鍵の理解は必要です。
公開鍵暗号 - Wikipedia
- NervesのデフォルトSSHログインユーザがわかる
- Nervesに複数ログインアカウントを作成できる
- Nervesに登録しているSSH公開鍵の調べ方がわかる
#やらないこと
nerves.local
とUSBでの接続はパスします。
ラズパイ環境ではないですが、 @takasehideki さんのElixirでIoT#4.2:BeagleBone GreenでNerves/Elixirを動かす - VirtualEthernet越しにssh接続でIEx起動&ファームも更新する! にBeagleBoneを使ったUSBでの接続方法があるのでnerves.local
を使う場合はこちらを参考にしてくださいm(_ _)m
#SSH公開鍵を登録する
NervesのファームウェアをSDカードに焼く場合、以下の手順で実行します。
この時mix firmware
する時にSSH鍵を登録しています。
$ mix deps.get
$ mix firmware
$ mix firmware.burn ←手元のPCでSDカードを焼いてファームウェアを更新する場合
or
$ mix firmware.gen.script ←upload.shを作成するコマンド(初回のみ)
$ ./upload.sh NervesのIPアドレス ←ネットワーク経由でファームウェアを更新する場合
##デフォルトの動作
実行ユーザの$HOME/.ssh/id_rsa.pub
または$HOME/.ssh/id_ecdsa.pub
を自動登録しています。$HOME/.ssh
ディレクトリが無い場合はエラーとなります。
##デフォルトの動作じゃなくしたい場合
デフォルトの動作じゃなくしたい場合ははじめにmix.exs
に以下の設定を追記します。
Nervesのネットワーク環境を整えたで書いた:nerves_network
の場合と同じく、targets: @all_targets
がないとMacの環境でも構築しようとしてしまうようでmix deps.get
した時にエラーが出ます。
defp deps do
[
(略)
# 追加
{:nerves_network, "~> 0.5", targets: @all_targets},
{:nerves_firmware_ssh, "~> 0.3", targets: @all_targets} ←今回追記した行
]
end
そして、Aさんの秘密鍵A(例えば$HOME/.ssh/id_rsa.pub
の内容)を使ってログインする場合はconfig/config.exs
に以下の設定を追記します。
#
# ssh公開鍵登録
#
config :nerves_firmware_ssh,
authorized_keys: [
"公開鍵A"
]
この状態でSDカードのファームウェアを更新し、NervesにSSHできるかどうか確認します。
$ mix deps.get
$ mix firmaware
$ mix firmware.burn
$ ssh NervesのIPアドレス ←秘密鍵Aを指定しない場合
$ ssh -i 秘密鍵A IPアドレス ←秘密鍵Aを指定する場合
###複数の鍵を登録する場合
例えば、Aさんの秘密鍵AとBさんの秘密鍵Bでログインできるようにする場合はconfig/config.exs
に公開鍵Aと公開鍵Bをリスト形式で記述します。1つのNervesに複数PCからの同時ログインもOKということが分かりました。
#
# ssh公開鍵登録
#
config :nerves_firmware_ssh,
authorized_keys: [
"公開鍵A",
"公開鍵B"
]
#登録しているSSH公開鍵の確認方法
Nervesにログイン後、以下のコマンドで登録されている公開鍵を確認できます。
iex> Application.get_env(:nerves_firmware_ssh, :authorized_keys)
or
iex> Application.get_all_env(:nerves_firmware_ssh)
#まとめ
NervesのSSH環境について整理することができました。
やってみると分かるんですが、upload.sh
を使ったネットワーク越しのファームウェア更新がかなり便利です!
たま〜にかえってこなくなる場合があるのはなんでかなぁー。