Armadilloフォーラム

特定のユーザでログインしたとき自作CLIツール起動(Base OS)

k.sato

2023年8月23日 9時47分

佐藤と申します。
お世話になっております。

Armadillo Base OSでTeraTermなどからホストに特定のユーザでログインしたときに
自作したCLIツールを起動したいのですがどのように実装すればよろしいのでしょうか?

コンテナの外に配置して起動させることになるのでしょうか?
それともコンテナ内の特定のアプリを起動とできるのでしょうか?
またはそのCLIのみのコンテナを作成して起動とするのでしょうか?

よろしくお願い致します。

コメント

at_satoshi.ohta

2023年8月24日 12時45分

太田です。
どういったことを実現するために自作CLIツールを特定のユーザーのログイン時に起動したいのでしょうか?

よろしくお願いいたします。

太田様

佐藤です。

回答ありがとうございます。

> どういったことを実現するために自作CLIツールを特定のユーザーのログイン時に起動したいのでしょうか?
過去Armadillo-400で特定のユーザでログインしたときに
装置の取得データの表示やネットワーク設定などの変更を行う
メニューアプリを起動させていました。

Armadillo-640に置き換えたときに実現できるのか確認しています。

よろしくお願い致します。

at_satoshi.ohta

2023年8月24日 14時16分

太田です。

特定ユーザーでログイン時にアプリを起動するのであれば、
/home/[ユーザー名]/.profileにアプリ起動のためのコマンドを記述すれば実現できます。

電源を落としても.profileが消えないようにするのであれば、
rootで下記のようにpersist_fileコマンドを実行すればよいです。

[armadillo ~]# persist_file /home/[ユーザー名]/.profile

よろしくお願いいたします。

太田様

佐藤です。

> 特定ユーザーでログイン時にアプリを起動するのであれば、
> /home/[ユーザー名]/.profileにアプリ起動のためのコマンドを記述すれば実現できます。
>
> 電源を落としても.profileが消えないようにするのであれば、
> rootで下記のようにpersist_fileコマンドを実行すればよいです。

[armadillo ~]# persist_file /home/[ユーザー名]/.profile

ありがとうございます。
ひとまず .profile に「ls -a」としてログイン時に表示されることを確認しました。

CLIアプリですが今までコンテナ内で/myappに.pyを配置して動作確認していたのですが、
ホストから起動できるのでしょうか?
それともホストにpythonをインストールといった方法になりますか?
それとも実行ファイル?を生成しなければなりませんか?

よろしくお願い致します。

at_satoshi.ohta

2023年8月24日 18時57分

先程の回答は誤りではありませんが、コンテナ内にユーザーアプリケーションを配置して実行すべきという、
Armadillo Base OS の思想に反する手順でしたので、後日改めて手順をご案内します。

つきましては先程お送りした手順は実行せずお待ちいただけますでしょうか。
ご迷惑おかけして申し訳ありませんがよろしくお願いいたします。

> 先程の回答は誤りではありませんが、コンテナ内にユーザーアプリケーションを配置して実行すべきという、
> Armadillo Base OS の思想に反する手順でしたので、後日改めて手順をご案内します。
承知しました。
よろしくお願い致します。

at_satoshi.ohta

2023年8月25日 11時45分

太田です。

お客様の今までArmadillo-400で実行していたCLIアプリケーションをそのまま
ABOS(Armadillo Base OS)に移植することは難しいです。

ネットワーク設定に関しては、
ABOSではお客様のアプリケーションは全てコンテナの中で実行することを推奨していますが、
コンテナ内からネットワーク設定を行うことは推奨していません。

代わりにネットワーク設定についてはABOS Webで代用するのが良いと思います。
注意点としてはABOS WebはArmadilloと同一LAN内にいるPCから設定することになります。
そのため、運用時に同一LANにArmadilloとPCがなければABOS Webは使うことはできません。
ABOS Webに関しましては下記のURLをご参照ください。

https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

取得データの表示に関しては、
まずroot権限でデータを取得してそのデータを非rootユーザーが読めるディレクトリに置く
コンテナを作成します。
それを非rootユーザーがログイン時に~/.profileで直接読む方法が考えられます。

非rootユーザーが読めるディレクトリについてですが、
ABOSのルートファイルシステムはoverlayfsとなっているため、
変更したデータは再起動時に保存されません。
しかし、/var/app/volumes/の下は例外的にoverlayfsでないため
取得データはここに置くと良いと思います。

よろしくお願いいたします。

太田様

佐藤です。

回答ありがとうございます。

> 取得データの表示に関しては、
> まずroot権限でデータを取得してそのデータを非rootユーザーが読めるディレクトリに置く
> コンテナを作成します。
> それを非rootユーザーがログイン時に~/.profileで直接読む方法が考えられます。
/.profileで直接読む方法というのはABOSにpythonをインストールして
python3 /var/app/rollback/volumes/myapp/cli.py
などとするのでしょうか?

●Armadillo:pythonスクリプトを実行ファイル化する(Debian buster対象)
https://armadillo.atmark-techno.com/blog/615/12997
それとも上記をABOSで置き換えてpythonスクリプトを実行ファイル化して
/.profileから呼び出すことになるのでしょうか?

そうだとするならばやり方を教えていただけますか?

よろしくお願い致します。

at_satoshi.ohta

2023年8月25日 18時57分

太田です。

手順までご案内した段階での確認で申し訳ありませんが、
前提として、rootユーザーでなく非rootユーザーで
CLIアプリケーションを動かさねばならない理由などございますでしょうか?

佐藤です。

> 手順までご案内した段階での確認で申し訳ありませんが、
> 前提として、rootユーザーでなく非rootユーザーで
> CLIアプリケーションを動かさねばならない理由などございますでしょうか?
rootで通常CLIのコマンドを打つような形だと客先でLinux等に詳しくないと出来ないため
わかりやすくするようCLIメニューアプリを作成しました。

そしてコマンドを打たずとも非rootユーザでログインしたときに起動する形としていました。

済みません。横から口を挟みますが。

CLIアプリに任意コマンド実行セキュリティホールがあった場合にroot権限で動かしてると被害がより大きくなりますかね。

~USER/.profileからCLIアプリを起動する方式ですが、アプリが終了したりクラッシュしたときにシェルプロンプトがでてしまって好きに操作されてしまう可能性がないでしょうか。
単純に起動するのではなく exec CLIアプリ名 で起動するのが一つの方法ですね。
Linux一般ではそのユーザーのログインシェルが/etc/passwdに登録されているのをCLIアプリに変えるのが定番ですが、Armadilloではどうなんでしょう?

saitoh様

佐藤です。

コメントありがとうございます。

> Linux一般ではそのユーザーのログインシェルが/etc/passwdに登録されているのをCLIアプリに変えるのが定番ですが、Armadilloではどうなんでしょう?
Armadillo-400のときはまさに/etc/passwdに登録して起動していました。
ABOSになるとそこをどう変更したらよいか...

> ~USER/.profileからCLIアプリを起動する方式ですが、アプリが終了したりクラッシュしたときにシェルプロンプトがでてしまって好きに操作されてしまう可能性がないでしょうか。
> 単純に起動するのではなく exec CLIアプリ名 で起動するのが一つの方法ですね。
 exec CLIアプリ名」ということはpythonスクリプトを実行ファイル化しなければならないですか?

> 「 exec CLIアプリ名」ということはpythonスクリプトを実行ファイル化しなければならないですか?

pythonスクリプトの第1行に
#!/usr/local/bin/python3
などのようなshbangが書いてあってchmod+xしてあればexecの対象になります(execシステムコールで実行できます)。

saitoh様

佐藤です。

> pythonスクリプトの第1行に
> #!/usr/local/bin/python3
> などのようなshbangが書いてあってchmod+xしてあればexecの対象になります(execシステムコールで実行できます)。
ということは shbang のパスが python3 の場所になりますか。

ABOSにデフォルトで python3 がインストールされていないようで
インストールしてみたのですがエラー表示されます。

armadillo:~# apk add python3
fetch https://download.atmark-techno.com/alpine/v3.17/atmark/armv7/APKINDEX.tar.gz
ERROR: https://download.atmark-techno.com/alpine/v3.17/atmark: temporary error (try again later)
WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.17/atmark: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/armv7/APKINDEX.tar.gz
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.17/main: temporary error (try again later)
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.17/main: No such file or directory
fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/armv7/APKINDEX.tar.gz
ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.17/community: temporary error (try again later)
WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.17/community: No such file or directory
WARNING: The repository tag for world dependency 'abos-base@atmark' does not exist
WARNING: The repository tag for world dependency 'abos-web@atmark' does not exist
WARNING: The repository tag for world dependency 'atmark-wwan-utils@atmark' does not exist
WARNING: The repository tag for world dependency 'buttond@atmark' does not exist
WARNING: The repository tag for world dependency 'emmc-sref@atmark' does not exist
WARNING: The repository tag for world dependency 'libubootenv@atmark' does not exist
WARNING: The repository tag for world dependency 'linux-at-a6@atmark' does not exist
WARNING: The repository tag for world dependency 'modemmanager@atmark' does not exist
WARNING: The repository tag for world dependency 'se05x-tools@atmark' does not exist
WARNING: The repository tag for world dependency 'swupdate@atmark' does not exist
ERROR: Not committing changes due to missing repository tags. Use --force-broken-world to override.

この進め方でよろしいのでしょうか?

よろしくお願い致します。

at_satoshi.ohta

2023年8月29日 16時48分

太田です。
返信に時間がかかってしまい申し訳ありません。
ABOSはコンテナ内でプログラムを実行することを推奨しているため、ABOS上にpythonをインストールすることは推奨していません。

下記にatmarkユーザーにログインした後、ターミナルには入らずにコンテナ内で作成されたpythonプログラムが実行される手順を示します。

初めに、ABOSDEを使用してお客様が使用するプログラムを実行できるコンテナを作成します。
作成手順はArmadillo-640のABOSの製品マニュアルの「CUIアプリケーションを開発する」を参考に、[Python New Project]でpythonプログラムを実行するコンテナを作成してください。

https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

マニュアルの手順の変更点として

1. デフォルトで作成されるコンテナは my_project/app/src/main.py を実行するので、main.pyをお客様の使用するプログラムに書き換えてください。

2. my_project/swu/etc/atmark/contaners/python_app.conf内の末尾の行を下記のように修正してください。

...省略
# launch app
# set_command python3 /vol_app/src/main.py
set_command sleep infinity

3. debianパッケージであれば my_project/container/packages.txt に追記することで必要なパッケージをインストールすることができます。

以降、rootユーザーで行ってください。
上記の手順に沿って作成されたrelease.swuをArmadillo-640をインストールすると、
コンテナイメージ(python_app_image)が作られ、コンテナ(python_app)が起動されます。

armadillo# podman images
REPOSITORY                  TAG         IMAGE ID      CREATED         SIZE
localhost/python_app_image  latest      c1a17e5fe0db  38 minutes ago  106 MB
armadillo# podman ps
CONTAINER ID  IMAGE                              COMMAND               CREATED         STATUS         PORTS       NAMES
96b1c69e7453  localhost/python_app_image:latest  python3 /vol_app/...  15 minutes ago  Up 15 minutes              python_app

また、コンテナを自動起動させるためのpython_app.confが/etc/atmark/containersに存在していることが分かります。

armadillo# cat /etc/atmark/containers/python_app.conf
set_image localhost/python_app_image:latest
 
# mount app sources and data:
# - relative paths are in /var/app/rollback/volumes and can be
# rolled back on failed upgrades, suitable for application sources
# and assets.
# - /var/app/volumes is not copied on updates and more suitable
# for volatile data such as logs and databases.
add_volumes python_app:/vol_app
add_volumes /var/app/volumes/python_app:/vol_data
 
# Allow LED to be written. This is application specific
# and should be changed depending on your needs.
add_volumes /sys:/sys
 
# python bufferizes its output by default when stdout is not a terminal,
# so print() statements would only be printed after a sufficient number
# of messages have accumulated. Force immediate output without flush for
# convenient logging
add_args -t
 
# launch app
# set_command python3 /vol_app/src/main.py
set_command sleep infinity

作成したmain.pyはコンテナ(python_app)の/vol_app/srcにあります。

armadillo# podman exec -it python_app ls /vol_app/src/                                 
main.py

ここからは、特定のユーザーがログインする時にコンテナ(python_app)内の/vol_app/src/main.pyが実行されるように設定する手順を説明します。
ここではatmarkというユーザーを例に説明します。
以下のような/etc/doas.d/user.confを作成してください。

armadillo# vi /etc/doas.d/user.conf
permit nopass atmark as root cmd podman

その後、/usr/libexec/hoge.shを以下の内容で作成し、実行権限を付加します。

armadillo# vi /usr/libexec/hoge.sh
#!/bin/sh -e
doas podman exec -it python_app /vol_app/src/main.py
armadillo# chmod +x /usr/libexec/hoge.sh

vipw コマンドを使用して/etc/passwdファイルを書き換えます。"atmark"から始まる行の、

atmark:x:1000:1000:Linux User,,,:/home/atmark:/bin/ash

を、

atmark:x:1000:1000:Linux User,,,:/home/atmark:/usr/libexec/hoge.sh

としてください。

その後、変更したファイルに対してpersist_file -p してください。

armadillo# persist_file -p /etc/doas.d/user.conf /usr/libexec/hoge.sh /etc/passwd

Armadillo を再起動してatmarkにログインします。

armadillo login: atmark
Password: 

ログイン後にシェルが起動せず、Python CLIアプリケーションが起動したら成功です。

太田様

佐藤です。

> 返信に時間がかかってしまい申し訳ありません。
いえいえ回答ありがとうございます。

> Armadillo を再起動してatmarkにログインします。

armadillo login: atmark
Password: 

> ログイン後にシェルが起動せず、Python CLIアプリケーションが起動したら成功です。
教えていただいた方法で main.py のアプリケーションが起動することは確認できました。

続けて自作の Python CLI を起動しようと、main.py と同じ場所に cli.py を作成して
同じように起動してみたのですが下記のエラーとなってしまいました。

armadillo login: atmark
Password:
/usr/bin/env: 'python3\r': No such file or directory
/usr/bin/env: use -[v]S to pass options in shebang lines

cli.py 内容は下記です。

#!/usr/bin/env python3
 
import sys
 
if __name__=='__main__':
    while True :
        print("*** nenu **************************************")
        print("")
        var = input("何か入力してください : ")

#!/usr/bin/env python3」がよくないのかと思い「#!/usr/bin python3」と変更してみたのですが下記となりました。

armadillo login: atmark
Password:
exec: Permission denied

自動で生成される main.py と自作した cli.py では何か設定が足りないのでしょうか?

よろしくお願い致します。

at_satoshi.ohta

2023年8月30日 13時32分

太田です。
2つご確認したいことがあります。

1. お客様が実行したいプログラムはmain.pyとcli.pyの2つということでしょうか?

2. ls -lコマンドを実行してcli.pyのファイル権限がどうなっているかお見せいただけますでしょうか?
rootユーザーでログインし、コンテナの外で以下のコマンドを実行するとおそらく確認できると思います。

armadillo# ls -l /var/app/rollback/volumes/python_app/src/

佐藤です。

> 1. お客様が実行したいプログラムはmain.pyとcli.pyの2つということでしょうか?
●コンテナ起動時にlighttpd自動起動
https://armadillo.atmark-techno.com/forum/armadillo/16565
このスレッドにある作りとなっていて main.py と lighttpd は python_app.conf の
set_command sh /startup.sh」で起動しています。
また main.py から複数の Pythonスクリプトをスレッド起動させています。

これとは別に特定のユーザでログインしたときにCLIメニューアプリを起動したいです。

> 2. ls -lコマンドを実行してcli.pyのファイル権限がどうなっているかお見せいただけますでしょうか?
下記のようになっています。

armadillo:~# ls -l /var/app/rollback/volumes/python_app/src/
total 20
drwxr-xr-x 1 root root  136 Jan  1 10:37 __pycache__
-rwxr-xr-x 1 root root  225 Jan  1 09:40 cli.py
-rw-r--r-- 1 root root    0 Jan  1 10:22 global_value.py
-rwxr-xr-x 1 root root 5095 Jan  1 10:22 main.py
-rw-r--r-- 1 root root 1163 Jan  1 10:22 rs485.py
-rw-r--r-- 1 root root 2504 Jan  1 10:22 spi.py

よろしくお願い致します。

またしても横から口を挟みますが、これ、改行コードがCRLFになってるって事は無いですか?
linuxはLF のみの改行コードが普通。

> /usr/bin/env: 'python3\r': No such file or directory
> /usr/bin/env: use -[v]S to pass options in shebang lines

saitoh様

佐藤です。

コメントありがとうございます。

> またしても横から口を挟みますが、これ、改行コードがCRLFになってるって事は無いですか?
> linuxはLF のみの改行コードが普通。
> > /usr/bin/env: 'python3\r': No such file or directory
> > /usr/bin/env: use -[v]S to pass options in shebang lines
まさにこれが原因でした。
ATDE上でなくWindows上の vscode で cli.py を作成したためCRLFのままでした。

改行コードを LF に修正し cli.py の shbang を「#!/usr/bin/env python3」に戻したところ
Armadillo を再起動しての特定ユーザのログインで cli.py が起動するようになりました。

お手数をおかけして申し訳ありません。
ありがとうございました。