20200804のLinuxに関する記事は5件です。

【簡単】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.sh

2. rc.localの変更

rc.localに変更を加え、autostart.shを起動時に実行できるようにする。

具体的な変更は以下のように成っている。rc.local の最後の部分のみ変更を行っている)

  • 変更前
fi

exit 0
  • 変更後
fi

autostart.sh

exit 0

3. pythonファイルの作成

/home/pi/ ディレクトリに hello.py を作成する。

print("hello, ivrc")

4. 再起動して確認

GUIからでも、terminalからsudo rebootでもよいので再起動して確認してみてください。

おわりに

今回はRaspberry piで行いましたが、シェルの書き方を少し変えればRaspbian以外のUnix系OS・Python以外の言語でも同じことができます。シェルは私も勉強中なので、少しずつ自力で書けるように頑張ります。

参考記事

ラズパイ起動時にスクリプトを実行したい - Qiita

ラズパイ(Raspbian)でシェルスクリプトを作成する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

端末起動時の自動暗号化→自動マウント

はじめに

  • 端末を再起動するとLUKSでの暗号化・マウントが解除されてしまうので、端末の起動後、自動で暗号化→マウントする方法について書く。
  • LUKSによる暗号化については以下を参照。
    ⇒ cryptsetupコマンドを使用したディスクの暗号化

1.キーファイルの作成・登録

  • これまではパスワードで認証を行っていたが、自動化のためにキーファイルで認証を行えるようにする。

keyfileの作成

dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfile

keyfileに600の権限を付与(所有者の読込・書込のみ)

chmod 600 /etc/mykeyfile

keyfileの登録

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: DISABLED

2.キーファイルによる暗号化の確認

  • すでに暗号化・マウントされているなら、現在のマウント・暗号化デバイスの解除を行い、キーファイルによる暗号化、マウントまで完了できることを確認する。
# 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=5

4.rc.localへのデバイスのマウント処理追記(権限付与をすること)

  • rc.localは起動プロセスの最後に実行されるシェルスクリプトであり、ここにマウント処理を記述し、起動の最後にマウントを行うようにする。
vi /etc/rc.local

# 以下を追記
# 今まで手動で行っていたmountのコマンド
mount /dev/mapper/hogehoge /mnt/hogehoge/

権限付与

chmod 755 /etc/rc.d/rc.local
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

端末起動時のディスクの自動暗号化→自動マウント/Linux

はじめに

  • 端末を再起動するとLUKSでの暗号化・マウントが解除されてしまうので、端末の起動後、自動で暗号化→マウントする方法について書く。
  • 環境は「CentOS7」で実施。
  • LUKSによる暗号化については以下を参照。
    ⇒ cryptsetupコマンドを使用したディスクの暗号化

1.キーファイルの作成・登録

  • これまではパスワードで認証を行っていたが、自動化のためにキーファイルで認証を行えるようにする。

keyfileの作成

dd bs=512 count=4 if=/dev/urandom of=/etc/mykeyfile

keyfileに600の権限を付与(所有者の読込・書込のみ)

chmod 600 /etc/mykeyfile

keyfileの登録

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: DISABLED

2.キーファイルによる暗号化の確認

  • すでに暗号化・マウントされているなら、現在のマウント・暗号化デバイスの解除を行い、キーファイルによる暗号化、マウントまで完了できることを確認する。
# 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=5

4.rc.localへのデバイスのマウント処理追記(権限付与をすること)

  • rc.localは起動プロセスの最後に実行されるシェルスクリプトであり、ここにマウント処理を記述し、起動の最後にマウントを行うようにする。
vi /etc/rc.local

# 以下を追記
# 今まで手動で行っていたmountのコマンド
mount /dev/mapper/hogehoge /mnt/hogehoge/

権限付与

chmod 755 /etc/rc.d/rc.local
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

grep の -f オプションでうまく検索できない場合の対処法

はじめに

grep -fを使っていて、「検索文字列が末尾にある行」しかヒットしない※という事が起こった場合
改行コードが原因かもしれません。
sedechoで改行コードを直してやればうまくいくようになります、という内容です。

(※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
xxAAAxxBBBx

2. 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.txtsedを実行して、改行コードを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


sedechoを使用すると、改行コードが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
0000010
echoコマンド前後
$ 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となっているとのことです。

[Linux] 改行コードを変換する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

"grep -f " がうまく動かない場合の対処法(while read lineも)

はじめに

grep -fを使っていて、「検索文字列が末尾にある行」しかヒットしない※という事が起こった場合
改行コードが原因かもしれません。
sedechoを使うことでうまくいくようになります、という内容です。

(※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
xxAAAxxBBBx

2. 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


sedechoを使用すると、改行コードが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
0000010
echoコマンド前後
$ 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となっているとのことです。

[Linux] 改行コードを変換する

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む