무선 네트워크에 연결 한 후 스크립트 호출


14

특정 무선 네트워크에 연결 한 후 쉘 스크립트를 호출 할 수있는 방법이 있습니까? 내가 이것을하고 싶은 이유는 내가 그것을 사용하기 전에 네트워크에 로그인해야하고 가능한 경우 이것을 자동화하고 싶습니다.

이 질문을 읽었습니다 . 특정 무선 네트워크에 연결할 때마다 스크립트를 실행하는 방법이 있습니까?

그러나 upstart를 사용하여 수행하는 방법에 대해서는 확실하지 않습니다.

답변:


16

이전 답변에 대한 사과는 몇 년 전의 방식이었습니다. 상황이 바뀐 것 같습니다.

/etc/NetworkManager/dispatcher.d/연결이 변경 될 때 (up, down, preup, predown) Network Manager는 디렉토리 (루트 소유, 실행 가능, 다른 사용자가 읽을 수없고 setuid가 아닌)의 모든 스크립트를 실행하는 것으로 나타났습니다. .

네트워크 관리자가 환경 변수를 설정하고이 스크립트에 전달합니다. CONNECTION_UUID 환경 변수 (고유 문자열 포함)에 관심이 있습니다.

따라서 문제를 해결하려면 (특정 무선 네트워크가 연결되어있을 때 스크립트를 실행하십시오) :

1) 관심있는 무선 연결의 UUID를 찾으십시오 ( /etc/NetworkManager/system-connections/디렉토리 의 적절한 연결 파일 내부를 보면 ).

2) 환경 변수 CONNECTION_UUID가 위의 (1)에서 무선 네트워크의 uuid와 일치하는 경우 원하는 것을 수행하는 bash (또는 perl, python 또는 기타) 스크립트를 작성하십시오.

3)이 스크립트를 넣고 /etc/NetworkManager/dispatcher.d/소유자와 권한을 적절하게 설정하십시오.

추가 읽기 : man networkmanager (그리고 위에서 언급 한 디렉토리의 스크립트 주위에 약간의 파킹).

예제 스크립트 :

#!/bin/bash
#####################################
# MounterBeast Script
# /etc/NetworkManager/dispatcher.d/02remotemount
# Copyright 2011 Nathan E. Williams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Usage:
# This script must be customized for your configuration.
# By default, the script will attempt to mount a CIFS share
# when a specified MAC address is found at the network gateway,
# or over sshfs if the MAC address of the gateway is not the specified MAC.
# e.g. I mount over CIFS to the servers internal IP when at home, and
# over sshfs when away from home.
#
# id gateway mac without physically checking the sticker:
# $ arp -n -a $(ip route show 0.0.0.0/0 | awk '{print $3}') | awk '{print $4}'
#
# Testing:
# up) sudo /etc/NetworkManager/dispatcher.d/02remotemount wlan0 up
# down) sudo /etc/NetworkManager/dispatcher.d/02remotemount wlan0 down
#####################################
#
# Configuration:
#
targetmac='xx:xx:xx:xx:xx:xx'
mount_user='$USER'
mount_pass='pass'
internal_server_name='192.168.1.102'
external_server_name='my.dyndns.com'
share_name="music"
mount_point='/mnt/remote'
ssh_port='22'
#
# Should not need to edit below
#
gateway=$(ip route show 0.0.0.0/0 | awk '{print $3}')
mactest=$(arp -n -a $gateway | awk '{print $4}')

if [[ "$mactest" == "$targetmac" ]]
then
  case "$2" in
          up)
          sleep 5
          mount -t cifs -o username=$mount_user,password=$mount_pass //$internal_server_name/$share_name $mount_point
          ;;
          down)
          umount -l $mount_point
          ;;
  esac
else
  case "$2" in
      up)
          sleep 5
          sshfs -p $ssh_port $external_server_name:$share_name $mount_point
      ;;
      down)
          umount -l $mount_point
      ;;
  esac
fi

exit $?

/ etc / NetworkManager / system-connections에는 아무것도 없습니다. 분명히 UUID는 연결이 새로운 경우에만 저장됩니다 (이전에 사용되지는 않음). 그럼에도 불구하고 /etc/network/if-up.d에 bash 스크립트를 작성하여 작동하도록했습니다. 연결하는 무선 네트워크에서 스크립트를 실행하지만 iwconfig | grep -q "일부 SSID". 올바른 방향으로의 충돌에 감사드립니다. 당신의 도움 없이는 알아낼 수 없었습니다!
Brock Dute

내 젠투 설치에서도 작동합니다. 팁 주셔서 감사합니다 :)
Jeffrey04

우분투 16.04에서. 디렉토리 /etc/NetworkManager/dispatcher.d/01ifupdown에서 스크립트를 실행/etc/networking/if-*
peter

정보 주셔서 감사합니다. 스크립트에서 UUID를 하드 코딩하는 대신 (여러 랩톱으로 이식 할 수 있기를 원함) grep시스템 연결 파일을 사용했습니다. 잘 작동합니다. essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)다음에 나오는 것이 essid=$(basename $essid)있습니다.
David Faure

사용자별로이 작업을 수행 할 수 있습니까? 현재 연결된 네트워크를 기반으로 프린터 구성을 자동으로 선택하고 싶습니다. ( askubuntu.com/questions/1204645/… )
Ketil Malde

1

Network Manager를 사용하여 수행 할 수있는 방법이 있는지 모르겠지만, 아마도 하나는 있지만 다른 해결책이 있습니다. Wicd를 설치할 수 있습니다 :

sudo apt-get install wicd

Wicd는 gtk 인터페이스에서 직접 지원하여 연결할 수있는 모든 네트워크에 사전 스크립트 및 사후 스크립트 지원을 추가합니다. Wicd가 작동하기 위해 Network-Manager를 제거 (둘 다 충돌)하도록주의하십시오. 문제가 발생하면 Network-Manager의 .deb를 다운로드하거나 Live-CD / Live-USB를 가져와야합니다.

Wicd는 사용하기 쉽고 빠르게 연결할 수 있지만 VPN과 같은 Network-Manager의 일부 고급 기능이 없습니다. 다음은 스크린 샷입니다.

Wicd


1

예, /etc/NetworkManager/dispatcher.d/NetworkManager 용 셸 스크립트 는 매우 좋습니다.

NetworkManager에는 더 재미 있고 복잡한 Dbus 방법도 있습니다 man nm-settings.

대한 네트워크 매니저의 남자 페이지에서 조개 인수의 이력서 dispatcher:

각 스크립트는 두 개의 인수를받습니다. 첫 번째는 방금 활성화 된 장치의 인터페이스 이름이고 두 번째는 동작입니다.

작동은 up, down, vpn-up, vpn-down, hostname, dhcp4-change, dhcp6-change 일 수 있습니다. (설명서 페이지 공개 : 2012 년 1 월 17 일)

네트워크 인터페이스가 끝난 후 OpenVPN을 다시 시작하는 매우 간단한 스크립트는 다음과 같습니다 up.

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.