Script panggilan setelah terhubung ke jaringan nirkabel

14

Apakah ada cara bagi saya untuk memanggil skrip shell setelah saya terhubung ke jaringan nirkabel tertentu? Alasan saya ingin melakukan ini adalah saya harus masuk ke jaringan sebelum saya dapat mulai menggunakannya dan saya ingin mengotomatiskan ini jika memungkinkan.

Saya membaca pertanyaan ini: Apakah ada cara untuk menjalankan skrip setiap kali saya terhubung ke jaringan nirkabel tertentu?

Tapi saya benar-benar tidak yakin bagaimana cara menggunakan pemula untuk melakukannya.

Brock Dute
sumber

Jawaban:

16

Mohon maaf atas jawaban saya sebelumnya yang akan saya lakukan bertahun-tahun yang lalu. Tampaknya semuanya telah berubah.

Ternyata Network Manager menjalankan SEMUA skrip dalam /etc/NetworkManager/dispatcher.d/direktori (yang dimiliki oleh root, yang dapat dieksekusi, yang tidak dapat dibaca oleh pengguna lain, dan tidak setuid), ketika koneksi berubah (naik, turun, pra-pakai, sebelumnya) .

Variabel lingkungan ditetapkan dan diteruskan ke skrip ini oleh Manajer jaringan. Anda akan tertarik pada variabel lingkungan CONNECTION_UUID (berisi string unik).

Jadi, untuk menyelesaikan masalah Anda (jalankan skrip ketika jaringan nirkabel tertentu terhubung ke):

1) cari tahu koneksi nirkabel yang Anda minati (dengan melihat ke dalam file koneksi yang sesuai di /etc/NetworkManager/system-connections/direktori).

2) tulis skrip bash (atau perl, atau python, atau apa pun) yang melakukan apa yang Anda inginkan jika variabel lingkungan CONNECTION_UUID adalah kecocokan dengan pengguna jaringan nirkabel pada (1) di atas.

3) masukkan skrip ini ke dalam /etc/NetworkManager/dispatcher.d/dan atur pemilik dan izin dengan tepat.

bacaan lebih lanjut: man networkmanager (dan litte mencari-cari skrip dalam direktori yang disebutkan di atas).

Contoh skrip:

#!/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 $?
finley
sumber
Hai, tidak ada apa-apa di / etc / NetworkManager / sistem-koneksi. Rupanya, UUID hanya disimpan di sana jika koneksi baru (tidak pernah digunakan sebelumnya). Namun demikian, saya membuatnya bekerja dengan membuat skrip bash di /etc/network/if-up.d. Itu menjalankan skrip di jaringan nirkabel yang saya sambungkan tetapi saya mengatasinya dengan melakukan iwconfig | grep -q "some SSID". Terima kasih untuk benjolan menuju arah yang benar, tidak akan menemukannya tanpa bantuan Anda!
Brock Dute
berfungsi untuk instalasi gentoo saya juga, terima kasih atas tipnya :)
Jeffrey04
Di Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownmengeksekusi skrip dalam /etc/networking/if-*direktori
peter
Terima kasih untuk informasi. Alih-alih melakukan hardcoding UUID dalam skrip saya (yang ingin saya jinjing ke beberapa laptop), saya menggunakan grepfile koneksi sistem. Bekerja dengan baik. Sesuatu seperti essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)diikuti oleh essid=$(basename $essid).
David Faure
Apakah mungkin melakukan ini berdasarkan per pengguna? Saya ingin memilih konfigurasi printer secara otomatis berdasarkan jaringan yang saat ini terhubung. ( askubuntu.com/questions/1204645/... )
Ketil
1

Saya tidak tahu apakah ada cara untuk melakukannya dengan Network Manager, mungkin ada satu tapi saya punya solusi lain untuk Anda. Anda dapat menginstal Wicd:

sudo apt-get install wicd

Wicd memiliki dukungan langsung pada antarmuka gtk untuk menambahkan dukungan pra-skrip dan pasca-skrip ke setiap jaringan yang dapat Anda sambungkan. Berhati-hatilah bahwa Wicd akan menghapus instalan Network-Manager agar berfungsi (keduanya saling bertentangan) jadi jika terjadi kesalahan, Anda harus mengunduh .deb dari Network-Manager atau membawa Live-CD / Live-USB bersama Anda.

Wicd mudah digunakan dan lebih cepat terhubung tetapi tidak memiliki beberapa fitur canggih Network-Manager (seperti VPN). Ini screenshotnya:

Wicd

Nyamiou The Galeanthrope
sumber
1

Ya, skrip Shell /etc/NetworkManager/dispatcher.d/untuk NetworkManager adalah ide yang sangat bagus.

Ada juga metode dbus dengan NetworkManager, lebih menyenangkan, lebih rumit: man nm-settings.

Resume argumen shells dari Man page NetworkManager tentang dispatcher:

Setiap skrip menerima dua argumen, yang pertama adalah nama antarmuka perangkat yang baru saja diaktifkan, dan yang kedua merupakan tindakan.

Tindakan dapat berupa: naik, turun, vpn-atas, vpn-turun, nama host, dhcp4-ubah, dhcp6-ubah. (Rilis halaman manual: 17 Januari 2012)

Berikut ini adalah skrip yang sangat sederhana untuk me-restart OpenVPN setelah antarmuka jaringan up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Yvan
sumber