🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

解決済

1回答

3374閲覧

GPIO操作Pythonコードの一般ユーザでの実行(CentOS7へUSB接続状態)

dqm8x4

総合スコア2

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

0グッド

0クリップ

投稿2021/03/23 12:59

前提・実現したいこと

お世話になります。

CentOS7上のPythonにて、USB接続したadafruit製のFT232H搭載GPIOモジュールのLチカに成功しました。
しかし、該当のソースはrootユーザでしか正常に動作しません。
rootユーザの使用はセキュリティ上なるべく抑えたいので一般ユーザで該当のプログラムを実行したいです。

現在壁にぶつかっている状態で困っていまして、有識者がおりましたらお知恵をお借りしたいです。

使用モジュール
https://akizukidenshi.com/catalog/g/gM-08942/

実行環境参考サイト(adafruit社公式サイト)
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/linux

発生している問題・エラーメッセージ

前述しましたが、一般ユーザでは正常に動作しませんでした。
恐らく当方の環境が原因でrootしか受け付けてもらえていないと思いますが、ネットで検索しても解決方法が見つからず困っている状態です。

[ippan@localhost py]$ python3 test.py Traceback (most recent call last): File "test.py", line 2, in <module> import board File "/usr/local/lib/python3.6/site-packages/board.py", line 33, in <module> from adafruit_blinka.agnostic import board_id, detector File "/usr/local/lib/python3.6/site-packages/adafruit_blinka/agnostic/__init__.py", line 18, in <module> chip_id = detector.chip.id File "/usr/local/lib/python3.6/site-packages/adafruit_platformdetect/chip.py", line 78, in id count = len(UsbTools.find_all([(0x0403, 0x6014)])) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 100, in find_all sernum = UsbTools.get_string(dev, dev.iSerialNumber) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 556, in get_string return usb_get_string(device, stridx) File "/usr/local/lib/python3.6/site-packages/usb/util.py", line 313, in get_string raise ValueError("The device has no langid" ValueError: The device has no langid (permission issue, no string descriptors supported or device error)

該当のソースコード

Python

1import time 2import board 3import digitalio 4 5led = digitalio.DigitalInOut(board.C0) 6led.direction = digitalio.Direction.OUTPUT 7 8while True: 9 led.value = True 10 time.sleep(0.5) 11 led.value = False 12 time.sleep(0.5)

試したこと

実行環境参考サイトに記述されている実行環境のチェックを一般ユーザで試してみました。
しかし、rootユーザでは正常に動作しますが、一般ユーザでは正常に動作しませんでした。

実行環境参考サイトの実行環境チェック(adafruit社公式サイト)
https://learn.adafruit.com/circuitpython-on-any-computer-with-ft232h/troubleshooting

実行環境チェック(一般ユーザ)

[ippan@localhost py]$ python3 Python 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pyftdi.ftdi import Ftdi >>> Ftdi().open_from_url('ftdi:///?') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/site-packages/pyftdi/ftdi.py", line 497, in open_from_url devdesc, interface = self.get_identifiers(url) File "/usr/local/lib/python3.6/site-packages/pyftdi/ftdi.py", line 401, in get_identifiers cls.DEFAULT_VENDOR) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 313, in parse_url default_vendor) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 417, in enumerate_candidates devices = cls.find_all(vps) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 100, in find_all sernum = UsbTools.get_string(dev, dev.iSerialNumber) File "/usr/local/lib/python3.6/site-packages/pyftdi/usbtools.py", line 556, in get_string return usb_get_string(device, stridx) File "/usr/local/lib/python3.6/site-packages/usb/util.py", line 313, in get_string raise ValueError("The device has no langid" ValueError: The device has no langid (permission issue, no string descriptors supported or device error) >>>

実行環境チェック(rootユーザ)

[root@localhost ~]# python3 Python 3.6.8 (default, Nov 16 2020, 16:55:22) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pyftdi.ftdi import Ftdi >>> Ftdi().open_from_url('ftdi:///?') Available interfaces: ftdi://ftdi:232h:1/1 (??????) Please specify the USB device

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/24 01:19

USBポートへの出力(書き込み)自体がroot権限が無いとダメなので、如何ともし難いです。 sudo コマンドを用いて実行するのではダメなのでしょうか。
dqm8x4

2021/03/24 04:16

ご回答ありがとうございます。 USBはroot権限が必要である旨承知しました。 私の目指すシステムは、外部サーバから遠隔でGPIOモジュールを接続しているLinux機のPythonのプログラムを使用する想定です。(外部サーバからC言語のSystem関数で実行します) root権限を使用した場合、上記の外部サーバに不正ログインされた場合、GPIOモジュールを接続しているLinux機のroot権限を握られることになると思います。 したがいまして、セキュリティ上遠隔での操作は一般ユーザを使用したいと考えています。 追加の質問で申し訳ありませんが、 上記のシステムにてroot権限が他人に漏れない方法はありますでしょうか。
dodox86

2021/03/24 11:02

先のコメントで書きましたが、sudoコマンドを使って解決するのであれば一番簡単です。具体的には/etc/sudoersにsudo を実行できるユーザー(と必要であればコマンド)を登録することで、rootのパスワードを知らなくてもsudo を実行できるようになります。「sudoers」について調べてみてください。あとはGPIOを操作する単独のデーモン(言うなればサーバー)プログラムにするとか、setuidと言う方法もあります。(setuidでの回答を書こうとしましたが長くなるので止めました)
dqm8x4

2021/03/24 12:56

ご回答ありがとうございます。 恥ずかしながら、sudoにて使用するコマンドを限定できることを知りませんでした。 私は、一般ユーザはpython3コマンドのみroot権限での使用を許可したいので、 visudoコマンドを使用し/etc/sudoersファイルに下記行を追加しました。 ippan ALL=(root) /bin/python3 そして一般ユーザを使用し、下記のコマンドで対象のプログラムを実行しました。 [ippan@localhost py]$ sudo -u root python3 test.py 上記のコマンドの結果は下記になりました。 これは、rootの環境変数を引き継げていない等の問題になりますでしょうか。 Traceback (most recent call last): File "test.py", line 2, in <module> import board File "/usr/local/lib/python3.6/site-packages/board.py", line 213, in <module> raise NotImplementedError("Board not supported {}".format(board_id)) NotImplementedError: Board not supported GENERIC_LINUX_PC
dqm8x4

2021/03/24 12:59

申し開けありません見落としていました。 setuidの参考サイトの共有ありがとうございます。 確認させていただきます。
dodox86

2021/03/24 17:30

> そして一般ユーザを使用し、下記のコマンドで対象のプログラムを実行しました。 「sudo -u root ... 」とやると、"root"ユーザーで実行してしまいます。sudoers での設定後、「sudo python3 test.py」で実行できませんか?
dqm8x4

2021/03/24 23:00

確認しました。 指摘いただいた通りのコマンドでも同様のエラーが表示されてしまいました。 [ippan@localhost py]$ sudo python3 test.py Traceback (most recent call last): File "test.py", line 2, in <module> import board File "/usr/local/lib/python3.6/site-packages/board.py", line 213, in <module> raise NotImplementedError("Board not supported {}".format(board_id)) NotImplementedError: Board not supported GENERIC_LINUX_PC
dodox86

2021/03/25 00:20

> 指摘いただいた通りのコマンドでも同様のエラーが表示されてしまいました。 そうでしたか。残念です。(まぁ、"-u root"指定が無いときは既定で"root"であるからですね) 「sudoで運用することではダメなのでしょうか」と言う提言は簡単であるから、というのと切り分けの為でもありましたが、 sudoで/bin/python3の実行を許すと、結局python3スクリプトを"ippan"ユーザーでroot権限で常に動かすことができることになるので、 それはそれでセキュリティ上、問題かもしれません。 それとしても結果が少し解せませんが、ftdiのドライバー、python3モジュールなど、"root"ユーザーになってインストールしたのでしょうか。過去質問を拝見しましたが、その辺りは判断できなかったので単なる確認です。そうであると、 [2021/03/24 21:56]のdqm8x4さんのコメント > これは、rootの環境変数を引き継げていない等の問題になりますでしょうか。 が言えているのかもしれません。(環境変数だけとは限りませんが)
dqm8x4

2021/03/25 04:22

ご回答ありがとうございます。 セキュリティ保護の件承知しました。それは確かに見落としていました。ありがとうございます。 setuidを使用しroot権限でプログラムの実行するようにしたいと思います。 環境構築についての前提としまして、過去質問に関しましてはC言語を使用する前提の環境でして、今回のPythonを使用する環境とは別件になります。 現Python環境構築時のインストール時に使用したユーザですが、全てrootユーザでログインした状態で対応しました。 そうなりますと、解決方法は下記の二択になりますでしょうか。 ・一般ユーザでログインした状態で、sudoを使用し環境の再構築をする ・現環境そのままで、一般ユーザでプログラム(setuid設定前提)実行時にrootユーザの環境変数等を引き継げるようにする 追記ですが、setuidやsetgidは昨日参考サイトの確認まではできましたが、時間的に検証まではできませんでした。
dqm8x4

2021/03/25 04:30

よく考えたらsetuidも該当のPythonプログラムを書換えられたら危ないですね。 今回は、一旦setuidを使用する前提で考えます。
guest

回答1

0

自己解決

解決はしておりませんが、
デーモンプログラムにて体操させていただきます。

dodox86さんアドバイスしていただきありがとうございました。

投稿2021/03/29 15:18

dqm8x4

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/03/29 16:18

> 解決はしておりませんが、 > デーモンプログラムにて体操させていただきます。 いえ、私はむしろ、GPIO操作周りを占有し、一般ユーザーからの要求はそのプログラムが一括して請け負う単独のデーモン/サーバーの形態での運用をお勧めしたかったので、良いのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問