この回答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+構文を使用しています。なぜならこれは私が慣れているからです。私はこれが他のシェルをサポートするために使用できると思います。
- 私はこの実装のセキュリティについて何の主張もしません!