이 답변NetworkManager가 연결을 설정할 때 스크립트를 실행하기 위한 솔루션이 제공됩니다. 그러나 내 스크립트(특별한 종류의 핫스팟에 자동으로 연결됨)를 루트가 아닌 사용자로 실행하고 싶습니다. 스크립트가 더럽고 내부에서 코드 삽입이 불가능할 것이기 때문입니다. 혹시 그런 게 있는지 아시나요 ~/.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+ 구문을 사용하고 있습니다. 왜냐하면 이것이 제가 익숙하기 때문입니다. 나는 이것이 다른 쉘을 지원하는 데 사용될 수 있다고 생각합니다.
- 나는 이 구현의 보안에 대해 어떠한 주장도 하지 않습니다!