Tập lệnh cuộc gọi sau khi kết nối với mạng không dây


14

Có cách nào để tôi gọi một tập lệnh shell sau khi tôi kết nối với một mạng không dây cụ thể không? Lý do tôi muốn làm điều này là tôi phải đăng nhập vào mạng trước khi tôi có thể bắt đầu sử dụng nó và tôi muốn tự động hóa việc này nếu có thể.

Tôi đọc câu hỏi này: Có cách nào để chạy tập lệnh mỗi khi tôi kết nối với mạng không dây cụ thể không?

Nhưng tôi thực sự không chắc chắn về cách sử dụng mới bắt đầu để làm điều đó.

Câu trả lời:


16

Xin lỗi cho câu trả lời trước đây của tôi, đó là cách tôi sẽ làm nó từ nhiều năm trước. Có vẻ mọi thứ đã thay đổi.

Hóa ra Trình quản lý mạng chạy TẤT CẢ các tập lệnh trong /etc/NetworkManager/dispatcher.d/ thư mục (những sở hữu bởi root, có thể thực thi được, mà người dùng khác không thể đọc được và không được thiết lập), khi kết nối thay đổi (lên, xuống, trước, trước) .

Các biến môi trường được đặt và chuyển đến tập lệnh này bởi Trình quản lý mạng. Bạn sẽ quan tâm đến biến môi trường CONNMENT_UUID (chứa một chuỗi duy nhất).

Vì vậy, để giải quyết vấn đề của bạn (thực thi tập lệnh khi một mạng không dây cụ thể được kết nối với):

1) tìm ra uuid của kết nối không dây mà bạn quan tâm (bằng cách xem bên trong tệp kết nối thích hợp trong /etc/NetworkManager/system-connections/thư mục).

2) viết tập lệnh bash (hoặc perl, hoặc python hoặc bất cứ thứ gì) làm những gì bạn muốn nếu biến môi trường CONNMENT_UUID khớp với uuid của mạng không dây ở (1) ở trên.

3) đặt tập lệnh này vào /etc/NetworkManager/dispatcher.d/và thiết lập chủ sở hữu và quyền thích hợp.

đọc thêm: man Networkmanager (và một litte chọc quanh các tập lệnh trong các thư mục được đề cập ở trên).

Một kịch bản ví dụ:

#!/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 $?

Này, không có gì trong / etc / NetworkManager / hệ thống kết nối. Rõ ràng, UUID chỉ được lưu trữ ở đó nếu kết nối mới (chưa từng được sử dụng trước đó). Tuy nhiên, tôi đã làm cho nó hoạt động bằng cách tạo một tập lệnh bash trong /etc/network/if-up.d. Nó không chạy tập lệnh trong bất kỳ mạng không dây nào mà tôi kết nối nhưng tôi đã xử lý xung quanh nó bằng cách thực hiện iwconfig | grep -q "một số SSID". Tuy nhiên, cảm ơn vì đã đi đúng hướng, sẽ không thể tìm ra nó nếu không có sự giúp đỡ của bạn!
Brock Dute

cũng hoạt động cho cài đặt gentoo của tôi, cảm ơn vì tiền boa :)
Jeffrey04

Trên Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownthực thi các tập lệnh trong /etc/networking/if-*thư mục
peter

Cảm ơn vì thông tin. Thay vì mã hóa UUID trong tập lệnh của tôi (mà tôi muốn có thể mang theo nhiều máy tính xách tay), tôi đã sử dụng greptrên các tệp kết nối hệ thống. Hoạt động độc đáo. Một cái gì đó như essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)theo sau essid=$(basename $essid).
David Faure

Có thể làm điều này trên cơ sở mỗi người dùng? Tôi muốn tự động chọn cấu hình máy in dựa trên mạng hiện được kết nối. ( Askubfox.com/questions/1204645/ Mạnh )
Ketil Malde

1

Tôi không biết có cách nào để làm điều đó với Trình quản lý mạng không, có một cách có thể nhưng tôi có một giải pháp khác cho bạn. Bạn có thể cài đặt Wicd:

sudo apt-get install wicd

Wicd có hỗ trợ trực tiếp trên giao diện gtk để thêm hỗ trợ trước tập lệnh và tập lệnh cho mọi mạng bạn có thể kết nối. Hãy cẩn thận rằng Wicd sẽ gỡ cài đặt Network-Manager để hoạt động (cả hai đều xung đột) vì vậy nếu có sự cố, bạn nên tải xuống .deb của Network-Manager hoặc có Live-CD / Live-USB bên mình.

Wicd dễ sử dụng và kết nối nhanh hơn nhưng thiếu một số tính năng nâng cao của Network-Manager (như VPN). Đây là một ảnh chụp màn hình:

Wicd


1

Có, tập lệnh Shell trong /etc/NetworkManager/dispatcher.d/ NetworkManager là một ý tưởng rất tốt.

Ngoài ra còn có một phương thức Dbus với NetworkManager, thú vị hơn, phức tạp hơn: man nm-settings .

Sơ yếu lý lịch về các đối số shell từ trang Man của NetworkManager về dispatcher:

Mỗi tập lệnh nhận được hai đối số, đầu tiên là tên giao diện của thiết bị vừa được kích hoạt và thứ hai là một hành động.

Hành động có thể là: lên, xuống, vpn-up, vpn-down, tên máy chủ, dhcp4-thay đổi, dhcp6-thay đổi. (Phát hành trang người đàn ông: 17 tháng 1 năm 2012)

Đây là một đoạn script rất đơn giản để khởi động lại OpenVPN sau khi giao diện mạng là up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.