1

シリアル デバイスにアクセスできるように、Web 環境で持っている権限を昇格させたい状況があります。

特定のケースは、 で起動するモデムを構成するための Web インターフェイスがある場合です/dev/ttyUSB[0-9]

エンド ユーザーによって 0 個以上のモデムが接続されます。/sys/devicesATコマンドを使用してモデムを読み取って通信することにより、USBワイヤレスモデムを識別できるソフトウェアを作成しています。

デバイスを開いて、次のようなことができるようにしたいと思います。

ser = serial.Serial(tty, baudrate=115200, timeout=10)
ser.write('AT+CGSN\r\n')
imei = ser.readline()

問題は、それpyserialがこれを行うことです: self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)portstr が であるシリアルポートを開きますが、権限のないユーザー/dev/ttyUSB0としてそれを行います。nobody

このシステムのシリアル ポートは root:uucp が所有しており、0660 (つまりrw-rw----) として設定されています。

nobody開発者でファイルを開くための権限をできるだけ少なくする必要があるユーザーにとって、最善の方法は何ですか?

私が検討するアイデア:

  • を使用してサブプロセスで物事を行うsudo
  • 内のファイルのパーミッションを変更します/dev/(udev を使用してこれを適切に行う方法についての説明を歓迎します!)
  • 考慮していない別の API またはソフトウェアの使用。
4

5 に答える 5

2

これを行う別の方法があります。Unix/Linux では、Unix ソケット経由でファイル記述子を送信できます。そのための Perl モジュールもあります: PassAccessRights.pm。Python 用の同様のモジュールは見つかりませんでしたが、簡単に実装できました。

于 2009-03-10T10:18:07.177 に答える
2

この場合、ソケット接続を受け入れて適切なデバイスに中継するシステム ユーザーによって実行されるデーモンを作成し、Web アプリケーション内でソケットを使用してデーモンと通信します。これは、ユーザーを処理する準備ができていないデバイスを開いたときに Web アプリがブロックされないようにするのにも役立ちます。

ただし、アプリケーションがデバイスと直接通信できるようにしたい場合は、null と同じ権限をデバイスに付与してください。

于 2009-03-10T07:48:12.573 に答える
1

「開発者でファイルを開くための権限をできるだけ少なくする必要がある人など、ユーザーにとって最善の方法は何ですか?」

実際には、Webアプリケーションのデーモンモードでmod_wsgiを使用することをお勧めします。mod_wsgiユーザーは、指定した任意のユーザー名(およびグループ)にすることができます。

適切に定義された権限を持つユーザーとして実行できます。

http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcessを参照してください

于 2009-03-10T09:54:11.087 に答える
1

Web インターフェイス経由のすべてのアクセスがデバイスへの同じアクセスを許可されることが許容される場合は、新しいデバイスをnobodyにchgrpするようにudevルールを構成します。これは、ファイル/etc/udev/rules.d/99-bpw.rulesのeee-bpwパッケージに入れたものです。

# Sierra Wireless AirCard 880 U
BUS=="usb", KERNEL=="ttyUSB2*", ACTION=="add", \
   PRODUCT=="1199/6855/0", DEVNAME=="/dev/tts/USB2", \
   OWNER="root", GROUP="dialout", \
   SYMLINK+="bpw", RUN="/usr/sbin/bpw"

dialoutをnobody置き換えます。この特定のルールは、デバイス名が/dev/ttyUSB2であることを前提としていますが、ルールを大幅に拡張できます。udev のドキュメントを参照してください

于 2009-03-11T22:02:29.767 に答える
-1

sudo のアイデアは可能かもしれません。IIRC では、特定のコマンドを sudo 可能に設定できますが、パスワードは必要ありません。

もう 1 つのオプションはnobody、必要なデバイスにアクセスできるグループに入れるか、アクセスできるグループとして Apache を起動することです。

fastcgi(または同等のもの)を使用している場合は、所有ユーザーとしてスクリプトを実行できると思います(一部の共有ホストはこれを行います)。

内のファイルのパーミッションを変更するには/dev、chmod するだけです。

于 2009-03-10T05:34:16.577 に答える