限定

限定

この回答NetworkManagerが接続を確立すると、スクリプトを実行するためのソリューションが提供されます。しかし、私のスクリプト(特定の種類のホットスポットに自動的に接続されます)をrootではなくユーザーとして実行したいと思います。これは、スクリプトが汚れていて内部でコードを挿入できないためです。もしそういうことがあるのか​​ご存知ですか~/.config/NetworkManager/dispatcher.d/

ありがとうございます!

答え1

私は同じことをしたかったので、これがうまくいくために私がしたことは次のとおりです。

作る/etc/NetworkManager/dispatcher.d/99-user-scripts

#!/bin/bash
#
#   Run NeworkManager dispatcher scripts from user home directories
#   for logged in users
#   See: https://developer.gnome.org/NetworkManager/stable/NetworkManager.html
#   See: https://unix.stackexchange.com/q/405242
#
for user in $(who | awk '{print $1}' | sort | uniq); do
  scripts_dir="/home/${user}/.config/NetworkManager/dispatcher.d"
  [ ! -d "$scripts_dir" ] && continue
  find $scripts_dir -type f -executable -user $user -perm -u+rwx ! -perm /go+w ! -perm /+s | \
    sort | \
    xargs -I{} sudo -u $user --set-home --preserve-env -- {} $1 $2
done

ファイルに応じて適切な権限を設定してください。ネットワーク管理者文書:

$ chmod u+x,go-w,a-s /etc/NetworkManager/dispatcher.d/99-user-scripts

次に、userscript ディレクトリを作成し、userscript を作成します。

$ mkdir -p ~/.config/NetworkManager/dispatcher.d
$ touch ~/.config/NetworkManager/dispatcher.d/50-my-script
$ chmod u+x,go-w,a-s ~/.config/NetworkManager/dispatcher.d/50-my-script

例は次のとおりです~/.config/NetworkManager/dispatcher.d/50-my-script

#!/bin/bash
prog="$(basename "${BASH_SOURCE[0]}")"
logger -t $prog -p user.notice "Running ${BASH_SOURCE[0]} $@"
printenv | logger -t $prog -p user.notice # verify environment variables are inherited

ネットワークイベントの後にシステムログを確認して、サンプルスクリプトが実行されていることを確認できます。

限定

  • 不適切/rootまたは非標準のユーザーホームディレクトリパス(修正が簡単)
  • 単純化のために、pre-up.dおよびpre-down.d機能を実装しないことにしました(改善可能)。
  • 実行順序がスクリプトとまったく同じかどうかはわかりません/etc/NetworkManager/dispatcher.d。文書にはアルファベット順に並べ替えるようになっており、見つかったsortファイルを使用しました。別途ではないかもしれませんが、参考のためだけに使用してください。
  • 私は通常のシェルコードの代わりにBash 4+構文を使用しています。なぜならこれは私が慣れているからです。私はこれが他のシェルをサポートするために使用できると思います。
  • 私はこの実装のセキュリティについて何の主張もしません!

関連情報