k.sato
2023年8月23日 9時47分
佐藤と申します。
お世話になっております。
Armadillo Base OSでTeraTermなどからホストに特定のユーザでログインしたときに
自作したCLIツールを起動したいのですがどのように実装すればよろしいのでしょうか?
コンテナの外に配置して起動させることになるのでしょうか?
それともコンテナ内の特定のアプリを起動とできるのでしょうか?
またはそのCLIのみのコンテナを作成して起動とするのでしょうか?
よろしくお願い致します。
コメント
k.sato
at_satoshi.ohta
k.sato
太田様
佐藤です。
> 特定ユーザーでログイン時にアプリを起動するのであれば、
> /home/[ユーザー名]/.profileにアプリ起動のためのコマンドを記述すれば実現できます。
>
> 電源を落としても.profileが消えないようにするのであれば、
> rootで下記のようにpersist_fileコマンドを実行すればよいです。
[armadillo ~]# persist_file /home/[ユーザー名]/.profile
ありがとうございます。
ひとまず .profile に「ls -a
」としてログイン時に表示されることを確認しました。
CLIアプリですが今までコンテナ内で/myappに.pyを配置して動作確認していたのですが、
ホストから起動できるのでしょうか?
それともホストにpythonをインストールといった方法になりますか?
それとも実行ファイル?を生成しなければなりませんか?
よろしくお願い致します。
at_satoshi.ohta
k.sato
at_satoshi.ohta
太田です。
お客様の今まで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でないため
取得データはここに置くと良いと思います。
よろしくお願いいたします。
k.sato
太田様
佐藤です。
回答ありがとうございます。
> 取得データの表示に関しては、
> まず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
k.sato
saitoh
済みません。横から口を挟みますが。
CLIアプリに任意コマンド実行セキュリティホールがあった場合にroot権限で動かしてると被害がより大きくなりますかね。
~USER/.profileからCLIアプリを起動する方式ですが、アプリが終了したりクラッシュしたときにシェルプロンプトがでてしまって好きに操作されてしまう可能性がないでしょうか。
単純に起動するのではなく exec CLIアプリ名 で起動するのが一つの方法ですね。
Linux一般ではそのユーザーのログインシェルが/etc/passwdに登録されているのをCLIアプリに変えるのが定番ですが、Armadilloではどうなんでしょう?
k.sato
saitoh様
佐藤です。
コメントありがとうございます。
> Linux一般ではそのユーザーのログインシェルが/etc/passwdに登録されているのをCLIアプリに変えるのが定番ですが、Armadilloではどうなんでしょう?
Armadillo-400のときはまさに/etc/passwdに登録して起動していました。
ABOSになるとそこをどう変更したらよいか...
> ~USER/.profileからCLIアプリを起動する方式ですが、アプリが終了したりクラッシュしたときにシェルプロンプトがでてしまって好きに操作されてしまう可能性がないでしょうか。
> 単純に起動するのではなく exec CLIアプリ名 で起動するのが一つの方法ですね。
「 exec CLIアプリ名
」ということはpythonスクリプトを実行ファイル化しなければならないですか?
saitoh
k.sato
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
太田です。
返信に時間がかかってしまい申し訳ありません。
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アプリケーションが起動したら成功です。
k.sato
太田様
佐藤です。
> 返信に時間がかかってしまい申し訳ありません。
いえいえ回答ありがとうございます。
> 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
k.sato
佐藤です。
> 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
よろしくお願い致します。
saitoh
k.sato
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 が起動するようになりました。
お手数をおかけして申し訳ありません。
ありがとうございました。
at_satoshi.ohta
2023年8月24日 12時45分
太田です。
どういったことを実現するために自作CLIツールを特定のユーザーのログイン時に起動したいのでしょうか?
よろしくお願いいたします。