Networkmanager
Network Manager 使用者端調度程序腳本
此答案提供了在 NetworkManager 設置連接時執行腳本的解決方案。但是,我想以非 root 使用者身份執行我的腳本(自動連接到某些特殊類型的熱點),因為它很髒,而且我不敢打賭它不可能在裡面進行程式碼注入。你知道一種是否
~/.config/NetworkManager/dispatcher.d/
存在嗎?謝謝!
我想做同樣的事情,這就是我為完成這項工作所做的:
創建
/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
根據NetworkManager 文件設置適當的文件權限:
$ chmod u+x,go-w,a-s /etc/NetworkManager/dispatcher.d/99-user-scripts
然後創建您的使用者腳本目錄並創建您的使用者腳本:
$ 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+ 語法而不是通用的 shell 程式碼,因為這是我所熟悉的。我想這可以用來支持其他外殼。
- 我對此實施的安全性不作任何聲明!