한정

한정

이 답변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+ 구문을 사용하고 있습니다. 왜냐하면 이것이 제가 익숙하기 때문입니다. 나는 이것이 다른 쉘을 지원하는 데 사용될 수 있다고 생각합니다.
  • 나는 이 구현의 보안에 대해 어떠한 주장도 하지 않습니다!

관련 정보