udevルールは、ユーザーにネットワークインターフェースcan0へのすべてのアクセス権を与えます。

udevルールは、ユーザーにネットワークインターフェースcan0へのすべてのアクセス権を与えます。

can0ネットワークデバイスの電源を入れたり切ったりするなど、ネットワークデバイスでrootと同じ操作を実行する権限をユーザーに付与しようとしています。私の最初の考えは、デバイスのグループおよび/または所有者を私のユーザーと私が属するグループに設定することでした。

udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)udevルールを設定する前に表示される内容は次のとおりです。

$ udevadm info -ap $(udevadm info -q path -p /sys/class/net/can0)
  looking at device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0/net/can0':
    KERNEL=="can0"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{netdev_group}=="0"
...
  looking at parent device '/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.0':
    KERNELS=="spi0.0"
    SUBSYSTEMS=="spi"
    DRIVERS=="mcp251x"

私が試したルールは次のとおりです(/etc/udev/rules.d/50-can.rules)。

KERNELS=="spi0.0", SUBSYSTEMS=="spi", DRIVERS=="mcp251x", GROUP="can", OWNER="<myuser>"

レポートのudevadm test $(udevadm info -q path -p /sys/class/net/can0)所有者とグループを正しく設定する必要があります。

...
OWNER 1001 /etc/udev/rules.d/50-can.rules:7
GROUP 1003 /etc/udev/rules.d/50-can.rules:7
...

ただし、ルール()を再ロードして再起動した後でも、まだユーザーとして開始または終了udevadm control -Rできません。can0

$ ip link set can0 down
RTNETLINK answers: Operation not permitted

プロパティを設定してインターフェイス名を変更できるため、このルールが正しく一致していることがわかりますNAME

can0問題がでインターフェイスを見つけることができないという事実に関連している可能性があると思います/dev。これは、文字/ブロックデバイスがなく、プログラム(たとえばip)がそのデバイスにアクセスできないことを示します。従来のUNIXの所有権/権限によって。これが正しい場合は、udevを使用してこれをどのように実行できますか(例:私のユーザーに完全な許可can0)。

注:次のような質問をしたことがあります。一般ユーザーにネットワークインターフェイスへの書き込み権限を付与する方法は?しかし、その解決策はsudoを使用することです。私はudevを使ってこれをやりたいのですが、最後の手段として使います。

答え1

@ABの指示に従って、libpam()を使用してpam_cap.soログイン(およびssh)中にCAP_NET_ADMINユーザーセットに機能を追加し、inheritable同じ機能を/bin/ipセットに追加しました。これで、依存関係なしにユーザーとしてネットワークインターフェイスを開閉できます。inheritablepermittedsudo

これを行う方法は次のとおりです。https://stackoverflow.com/questions/1956732/is-it-possible-to-configure-linux-capability-per-user

関連情報