- 投稿日:2020-08-04T15:56:51+09:00
【簡単】RaspberryPi 起動時に任意のプログラムを実行する【ShellScript】
はじめに
Raspberry Pi を起動時に、任意のプログラムをシェルスクリプトによって実行する方法を紹介します。また、実際に実行ができているか確認するため、シェルスクリプトでpythonファイルを実行してみました。シェルを書き換えればpython以外のプログラムも実行可能です。
読んでほしい人
・ラズパイ(もしくはLinux)起動時に何らかのプログラムを実行させたい人
・シェルってなに?って人、もしくはあまり詳しくない人
(シェルについては、3分ほどで読めるこの解説を読んでもらえるといいかと思います。)環境
ハード : Raspberry Pi 3 Model B+
(OSが同じであれば、以下の方法で実行可能かと思います)
OS : Raspbian GNU / Linux 10
(Windowsだと以下の方法ではできないので注意!!)実装
1. シェルスクリプトファイルの作成
/usr/local/bin/ に autostart.sh を作成する。
pi@raspberrypi:~ $ sudo nano /usr/local/bin/autostart.sh今回は /home/pi/ ディレクトリにある hello.py(3. で後述)を実行したいため、autostart.shは以下のように変更を加え保存(ctrl + s)する。変更・保存ができているか心配な時は再度↑のコマンドを入力するとよい。
#!/bin/sh python3 /home/pi/hello.py
加えて、シェルスクリプトに実行権限をを与える。
pi@raspberrypi:~ $ chmod 755 /usr/local/bin/autostart.sh2. rc.localの変更
rc.localに変更を加え、autostart.shを起動時に実行できるようにする。
具体的な変更は以下のように成っている。rc.local の最後の部分のみ変更を行っている)
- 変更前
fi exit 0
- 変更後
fi autostart.sh exit 03. pythonファイルの作成
/home/pi/ ディレクトリに hello.py を作成する。
print("hello, ivrc")4. 再起動して確認
GUIからでも、terminalからsudo rebootでもよいので再起動して確認してみてください。
おわりに
今回はRaspberry piで行いましたが、シェルの書き方を少し変えればRaspbian以外のUnix系OS・Python以外の言語でも同じことができます。シェルは私も勉強中なので、少しずつ自力で書けるように頑張ります。
参考記事
- 投稿日:2020-08-04T15:15:33+09:00
端末起動時の自動暗号化→自動マウント
はじめに
- 端末を再起動するとLUKSでの暗号化・マウントが解除されてしまうので、端末の起動後、自動で暗号化→マウントする方法について書く。
- LUKSによる暗号化については以下を参照。
⇒ cryptsetupコマンドを使用したディスクの暗号化1.キーファイルの作成・登録
- これまではパスワードで認証を行っていたが、自動化のためにキーファイルで認証を行えるようにする。
keyfileの作成
dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfilekeyfileに600の権限を付与(所有者の読込・書込のみ)
chmod 600 /etc/mykeyfilekeyfileの登録
cryptsetup luksAddKey /dev/sde /etc/mykeyfile Enter any existing passphrase: <- 既存のパスフレーズを入力keyfileの登録を確認
cryptsetup luksDump /dev/sde LUKS header information for /dev/sde Version: 1 Cipher name: aes Cipher mode: xts-plain64 Hash spec: sha256 Payload offset: ### MK bits: 2## MK digest: ################## MK salt: ################## ################## MK iterations: ################## UUID: ################## Key Slot 0: ENABLED Iterations: ################## Salt: ################## ################## Key material offset: ################## AF stripes: ################## Key Slot 1: ENABLED Iterations: ################## Salt: ################## ################## Key material offset: ################## AF stripes: ################## Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED2.キーファイルによる暗号化の確認
- すでに暗号化・マウントされているなら、現在のマウント・暗号化デバイスの解除を行い、キーファイルによる暗号化、マウントまで完了できることを確認する。
# keyfileによる暗号化 cryptsetup luksOpen /dev/sde hogehoge --key-file /etc/mykeyfile # マウント mount /dev/mapper/hogehoge /mnt/hogehoge/3.crypttabへの登録
- crpttabに設定を書くことで、OS起動時にLUKSへの接続を行い暗号化を行えるので、以下のように設定する。
vi /etc/crypttab # 以下を追記 # {target name} {source device} {key file} luks, {options} # timeout=5・・・パスワードを入力しないまま5秒放置したら無視して続行 hogehoge /dev/sde /etc/mykeyfile luks,timeout=54.rc.localへのデバイスのマウント処理追記(権限付与をすること)
- rc.localは起動プロセスの最後に実行されるシェルスクリプトであり、ここにマウント処理を記述し、起動の最後にマウントを行うようにする。
vi /etc/rc.local # 以下を追記 # 今まで手動で行っていたmountのコマンド mount /dev/mapper/hogehoge /mnt/hogehoge/権限付与
chmod 755 /etc/rc.d/rc.local
- 投稿日:2020-08-04T15:15:33+09:00
端末起動時のディスクの自動暗号化→自動マウント/Linux
はじめに
- 端末を再起動するとLUKSでの暗号化・マウントが解除されてしまうので、端末の起動後、自動で暗号化→マウントする方法について書く。
- 環境は「CentOS7」で実施。
- LUKSによる暗号化については以下を参照。
⇒ cryptsetupコマンドを使用したディスクの暗号化1.キーファイルの作成・登録
- これまではパスワードで認証を行っていたが、自動化のためにキーファイルで認証を行えるようにする。
keyfileの作成
dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfilekeyfileに600の権限を付与(所有者の読込・書込のみ)
chmod 600 /etc/mykeyfilekeyfileの登録
cryptsetup luksAddKey /dev/sde /etc/mykeyfile Enter any existing passphrase: <- 既存のパスフレーズを入力keyfileの登録を確認
cryptsetup luksDump /dev/sde LUKS header information for /dev/sde Version: 1 Cipher name: aes Cipher mode: xts-plain64 Hash spec: sha256 Payload offset: ### MK bits: 2## MK digest: ################## MK salt: ################## ################## MK iterations: ################## UUID: ################## Key Slot 0: ENABLED Iterations: ################## Salt: ################## ################## Key material offset: ################## AF stripes: ################## Key Slot 1: ENABLED Iterations: ################## Salt: ################## ################## Key material offset: ################## AF stripes: ################## Key Slot 2: DISABLED Key Slot 3: DISABLED Key Slot 4: DISABLED Key Slot 5: DISABLED Key Slot 6: DISABLED Key Slot 7: DISABLED2.キーファイルによる暗号化の確認
- すでに暗号化・マウントされているなら、現在のマウント・暗号化デバイスの解除を行い、キーファイルによる暗号化、マウントまで完了できることを確認する。
# keyfileによる暗号化 cryptsetup luksOpen /dev/sde hogehoge --key-file /etc/mykeyfile # マウント mount /dev/mapper/hogehoge /mnt/hogehoge/3.crypttabへの登録
- crpttabに設定を書くことで、OS起動時にLUKSへの接続を行い暗号化を行えるので、以下のように設定する。
vi /etc/crypttab # 以下を追記 # {target name} {source device} {key file} luks, {options} # timeout=5・・・パスワードを入力しないまま5秒放置したら無視して続行 hogehoge /dev/sde /etc/mykeyfile luks,timeout=54.rc.localへのデバイスのマウント処理追記(権限付与をすること)
- rc.localは起動プロセスの最後に実行されるシェルスクリプトであり、ここにマウント処理を記述し、起動の最後にマウントを行うようにする。
vi /etc/rc.local # 以下を追記 # 今まで手動で行っていたmountのコマンド mount /dev/mapper/hogehoge /mnt/hogehoge/権限付与
chmod 755 /etc/rc.d/rc.local
- 投稿日:2020-08-04T09:35:08+09:00
grep の -f オプションでうまく検索できない場合の対処法
はじめに
grep -f
を使っていて、「検索文字列が末尾にある行」しかヒットしない※という事が起こった場合
改行コードが原因かもしれません。
→sed
やecho
で改行コードを直してやればうまくいくようになります、という内容です。(※Windowsの場合。Macだと違う挙動かも?)
※ ファイル内の各行を検索文字列に使用したい場合には、
grep -f
や、while
文で1行ずつ読み込む(while read line
)などの方法が使えます。・grep -f オプション
grep -f [検索文字列ファイル] [検索対象ファイル]
・while文を利用
while read line
do
grep "$line" [検索対象ファイル]
done < [検索文字列ファイル](※この書き方の場合、[検索文字列ファイル]の最終行で改行している必要あり(じゃないと最終行だけ読み込まれない)。複数条件に該当する行は何度も出現してしまうので注意)
起こっている事
下記のように、ファイル内の各行で検索を掛けたときに、「検索文字列が末尾にある行」しか選択されないという現象が起こることがあります(というか起こった)。
検索文字列ファイル(file.txt)AAA BBB検索対象ファイル(test.txt)AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx xxxCCCxxxxx検索文字列が末尾にある行しか選択されない$ grep -f file.txt test.txt xxxxxxxxAAA xxxxxxxxBBB $ while read line > do > grep "$line" test.txt > done < file.txt xxxxxxxxAAA xxxxxxxxBBB対処法の例
1. sedコマンド
なんでもいいので適当に
sed
を使って[検索文字列ファイル]を作り直すことで、うまく動くようになります。$ sed 's/^//' file.txt > file2.txt $ grep -f file2.txt test.txt AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx2. echoコマンド
while
文の方では、echo
で$line
を読み直す方法でも、うまくいきます。$ while read line > do > grep `echo $line` test.txt > done < file.txt AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA xxAAAxxBBBx ## BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx ## 複数条件に該当する場合は何度も出現する
その他の対処法
その他の改行コード変換方法の例
・改行コードの変換解説
今回の挙動の原因は、WindowsとUnixで改行コードが異なることでした。
つまりWindows上で作成したファイルを検索文字列として利用すると、\r の部分が検索の妨げになる("検索文字列 + \r"を探す)ため、末尾に検索文字列がある場合にしかヒットしなかったというわけです。
(実際、file.txtの2行目で改行をなくすと、"BBB"の方は正常に検索されるようになります。また逆にtest.txtにsed
を実行して、改行コードをCRLFからLFに直すと何も出力されなくなります)
OS 改行コード 「od -c」での見え方 Unix LF \n Mac(OSX) LF \n Mac(OS9) CR \r Windows CR+LF \r\n 引用:改行コードの確認
file.txtの2行目(BBB)で改行しない場合$ grep -f file.txt test.txt xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx検索対象ファイル(test.txt)にsedを実行した場合(何も出力されない)$ sed 's/^//' test.txt > test2.txt $ grep -f file.txt test2.txt
sed
やecho
を使用すると、改行コードがCRLF(\r\n)からLF(\n)に変換されるため、検索がうまくいくようになります。sedコマンド前後## ---------------------- sed 前 (CRLF) $ file file.txt file.txt: ASCII text, with CRLF line terminators $ od -c file.txt 0000000 A A A \r \n B B B \r \n 0000012 ## ---------------------- sed 後 (LF) $ file file2.txt file2.txt: ASCII text $ od -c file2.txt 0000000 A A A \n B B B \n 0000010echoコマンド前後$ cat hoge.txt hoge $ while read line > do > echo `echo $line` > hoge2.txt > done < hoge.txt ## ---------------------- echo 前 (CRLF) $ od -c hoge.txt 0000000 h o g e \r \n 0000006 ## ---------------------- echo 後 (LF) $ od -c hoge2.txt 0000000 h o g e \n 0000005参考:
・【 sed 】コマンド(基礎編)――テキストファイルを編集する
・Windowsのsedで置換して変わった改行コードをLFからCRLFに戻す方法なお、Macの場合、以前のMacOSではCRが採用されていましたが、MacOSX以降はUnix系OSと同じLFとなっているとのことです。
- 投稿日:2020-08-04T09:35:08+09:00
"grep -f " がうまく動かない場合の対処法(while read lineも)
はじめに
grep -f
を使っていて、「検索文字列が末尾にある行」しかヒットしない※という事が起こった場合
改行コードが原因かもしれません。
→sed
やecho
を使うことでうまくいくようになります、という内容です。(※Windowsの場合。Macだと違う挙動かも?)
※ ファイル内の各行を検索文字列に使用したい場合には、
grep -f
や、while
文で1行ずつ読み込む(while read line
)などの方法が使えます。・grep -f オプション
grep -f [検索文字列ファイル] [検索対象ファイル]
・while文を利用
while read line
do
grep "$line" [検索対象ファイル]
done < [検索文字列ファイル](※この書き方の場合、[検索文字列ファイル]の最終行で改行している必要あり(じゃないと最終行だけ読み込まれない)。複数条件に該当する行は何度も出現してしまうので注意)
起こっている事
下記のように、ファイル内の各行で検索を掛けたときに、「検索文字列が末尾にある行」しか選択されないという現象が起こることがあります(というか起こった)。
検索文字列ファイル(file.txt)AAA BBB検索対象ファイル(test.txt)AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx xxxCCCxxxxx検索文字列が末尾にある行しか選択されない$ grep -f file.txt test.txt xxxxxxxxAAA xxxxxxxxBBB $ while read line > do > grep "$line" test.txt > done < file.txt xxxxxxxxAAA xxxxxxxxBBB対処法の例
1. sedコマンド
なんでもいいので適当に
sed
を使って[検索文字列ファイル]を作り直すことで、うまく動くようになります。$ sed 's/^//' file.txt > file2.txt $ grep -f file2.txt test.txt AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx2. echoコマンド
while
文の方では、echo
で$line
を読み直す方法でも、うまくいきます。$ while read line > do > grep `echo $line` test.txt > done < file.txt AAAxxxxxxxx xxxxxAAAxxx xxxxxxxxAAA xxAAAxxBBBx ## BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx ## 複数条件に該当する場合は何度も出現する
その他の対処法
その他の改行コード変換方法の例
・改行コードの変換解説
今回の挙動の原因は、WindowsとUnixで改行コードが異なることでした。
つまりWindows上で作成したファイルを検索文字列として利用すると、\r の部分が検索の妨げになる("検索文字列 + \r"を探す)ため、末尾に検索文字列がある場合にしかヒットしなかったというわけです。
(実際、file.txtの2行目で改行をなくすと、"BBB"の方は正常に検索されるようになります)
OS 改行コード 「od -c」での見え方 Unix LF \n Mac(OSX) LF \n Mac(OS9) CR \r Windows CR+LF \r\n 引用:改行コードの確認
file.txtの2行目(BBB)で改行しない場合$ grep -f file.txt test.txt xxxxxxxxAAA BBBx BBB xx xxxxxxxxBBB xxAAAxxBBBx
sed
やecho
を使用すると、改行コードがCRLF(\r\n)からLF(\n)に変換されるため、検索がうまくいくようになります。sedコマンド前後## ---------------------- sed 前 (CRLF) $ file file.txt file.txt: ASCII text, with CRLF line terminators $ od -c file.txt 0000000 A A A \r \n B B B \r \n 0000012 ## ---------------------- sed 後 (LF) $ file file2.txt file2.txt: ASCII text $ od -c file2.txt 0000000 A A A \n B B B \n 0000010echoコマンド前後$ cat hoge.txt hoge $ while read line > do > echo `echo $line` > hoge2.txt > done < hoge.txt ## ---------------------- echo 前 (CRLF) $ od -c hoge.txt 0000000 h o g e \r \n 0000006 ## ---------------------- echo 後 (LF) $ od -c hoge2.txt 0000000 h o g e \n 0000005参考:
・【 sed 】コマンド(基礎編)――テキストファイルを編集する
・Windowsのsedで置換して変わった改行コードをLFからCRLFに戻す方法なお、Macの場合、以前のMacOSではCRが採用されていましたが、MacOSX以降はUnix系OSと同じLFとなっているとのことです。