这个答案提供了在 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
然后创建您的用户脚本目录并创建您的用户脚本:
$ 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 代码,因为这是我熟悉的。我想这可以用来支持其他 shell。
- 我对此实施的安全性不做任何声明!