Como executar um script, dependendo da conexão com a Internet

48

Costumo montar uma unidade remota usando sshfs. Eu adoraria ter essa montagem automaticamente. No entanto, se eu montá-lo em meus scripts .bashrc ou de inicialização, a montagem geralmente falha porque minha conexão de internet sem fio ainda não foi feita.

Alguém conhece uma maneira fácil de executar um script bash toda vez que a conexão é estabelecida ou montar automaticamente uma unidade sshfs?

jmite
fonte

Respostas:

56

Adicione seu script a /etc/network/if-up.d/. Nomeie seu script sem uma extensão '.sh'.

Também depois de adicionar o script, execute chmod +x /etc/network/if-up.d/yourscriptnamea permissão necessária.

Verifique se a interface de rede (por exemplo, wlan0 ou eth0) que deve acionar seu script quando ligada é mencionada no arquivo /etc/network/interfaces.

dedunumax
fonte
12
scripts internos, /etc/network/*.d/você pode usar a variável $IFACEpara saber qual interface está obtendo uma conexão, para que você possa pular o procedimento, se for a conexão com fio, por exemplo.
Carlos Campderrós
Existe uma maneira de especificar para qual rede específica você deseja fazer isso? quando é minha rede doméstica eu quero fazer o roteiro, mas quando I'ts uma rede fora de casa não pode querer ...
Joshua Robison
3
Na verdade, isso parece não funcionar. Sei que meus scripts funcionam porque posso executá-los usando ./ no terminal e eles funcionam, mas quando eu desligo a conexão, os scripts não são chamados. Existe algo que eu tenho que fazer para referenciá-los de alguma maneira? soltar um script em if-up.d parece estar faltando um passo?!?!
Joshua Robison
1
verifique se eles possuem permissões corretas, por favor.
Dedunumax
2
Por favor, adicione o que exatamente deve entrar interfacesquando não estiver lá. É auto wlan0e iface wlan0 inet dhcpou mais?
27514 Cookie
25

Nota do editor: O choco não é atualizado desde 2012 e não está em nenhum repositório atual do Ubuntu

Ubuntu 12.04

  • Instale o Choco : Uma ferramenta simples, que realiza reflexos no seu computador executando ações quando eventos específicos são acionados.
  • Abra o Choco e clique em New.

    Passo 1

    • Dê um nome e altere a opção Ativado por estímulo para LIGADO.
    • Clique em Estímulo , selecione a categoria Rede e digite Conectar à WLAN . Clique OK.

    Passo 2

    • Você também pode selecionar o SSID da rede sem fio e tem a opção de verificar ou não isso na inicialização.

    etapa 3

    • Agora você terá que especificar uma reação. Vá para a guia Reaction e clique em add. Selecione Aplicativos na categoria e Iniciar Aplicativo (no modo avançado) do tipo.

    Passo 4

    • Agora especifique o script que você deseja executar na opção executável. Você pode até passar parâmetros para o script.

    Etapa 5

    • E é isso! Além disso, certifique-se de adicionar o Choco nos aplicativos de inicialização. Vá para Editar> Preferências e ative a opção de inicialização automática.

    Etapa 6

inflamar
fonte
6
choco está completamente quebrado e não vê uma atualização há algum tempo. Eu gostaria que pudesse ter mais desenvolvimento, porque precisamos de algo como o aplicativo Tasker do Android para Linux. Ninguém quer mexer com etc / network / interfaces e pastas e scripts if-up. Apenas me dê algo em que eu possa clicar ou ativar e desativar.
precisa saber é o seguinte
2

Responderei a esta parte da pergunta do OP: "Gostaria muito de ter essa montagem automaticamente"

Minha ferramenta favorita para montagem automática de compartilhamentos de rede é autofs: https://help.ubuntu.com/community/Autofs

O AutoFS é minha ferramenta de escolha para montar meu NAS - para todos os meus laptops e estações de trabalho.

" autofs é um programa para montar diretórios automaticamente, conforme necessário. As montagens automáticas são montadas apenas quando são acessadas e desmontadas após um período de inatividade. Por esse motivo, a montagem automática de compartilhamentos NFS / Samba economiza largura de banda e oferece melhor desempenho geral em comparação com montagens estáticas via fstab " .

RBell
fonte
Sua resposta, enquanto possível, pode ser um pouco tarde, pois o OP já aceitou a outra resposta. Sua ajuda é, obviamente, apreciada, no entanto, você pode ser melhor atendido, concentrando seus esforços nas perguntas não respondidas
Wayne_Yux
Desculpe Wayne, RBell deu a última gargalhada aqui - a melhor resposta (sobre o uso do Cuttlefish) não é mais relevante porque esse pacote está desatualizado - mas o autofs ainda existe, e eu não o tinha visto se não fosse neste post. Obrigado, RBell!
KlaymenDK 9/09
1

A melhor maneira, simples e fácil, seria adicionar um comando up a qualquer interface na qual você deseja trabalhar.

As interfaces podem ser encontradas no diretório "/ etc / network /" sob o nome do arquivo "interfaces"

iface elan0 inet manual
    up filename.sh

Isso adicionará o comando up a elan0. Dê isso de maneira semelhante a qualquer interface em que você queira trabalhar. Lembre-se de recuar um espaço de tabulação.

Certifique-se de dar as permissões de execução ao arquivo.

sudo chmod 755 filename.sh
Revanth Kumar
fonte
1
Fantástico! Funciona com tun0interfaces VPN gerenciadas por network-manager. A chave é o uso de inet manual.
KrisWebDev 18/06
1

Para mim, a /etc/network/if-up.d/solução não funcionou comigo como quando adicionei /etc/network/interfaceso seguinte:

auto wlp58s0
iface wlp58s0 inet dhcp
post-up /home/augustin/Config/myscript.sh

Wifi seria iniciado após a reinicialização.

Mas depois de alguma luta, a partir desse link , o que funcionou foi adicionar o script /etc/NetworkManager/dispatcher.d/no formulário 90myscript.shonde 90está o nível de prioridade do script e com o seguinte formulário:

#!/bin/bash

IF=$1
STATUS=$2

if [ "$IF" == "wlp58s0" ]
then
    case "$2" in
        up)
        # interface is up
        ;;
        down)
        # interface will be down
        ;;
        pre-up)
        # interface will be up
        ;;
        post-down)
        # interface is down
        ;;
        *)
        ;;
    esac
fi

Acho que há problemas entre quem controla a configuração da rede no nível do sistema e, às vezes, o networkcomportamento padrão é deixado para trás do despachante.

Além disso, para aqueles que gostariam - como eu - de tentar ter um link simbólico para o script (para armazenar o arquivo em um local melhor), infelizmente não funcionou para mim.

Espero que isto ajude!

Augustin Riedinger
fonte
1

systemd parece ter assumido a rede hoje em dia.

$ networkctl
WARNING: systemd-networkd is not running, output will be incomplete.

IDX LINK             TYPE               OPERATIONAL SETUP
  1 lo               loopback           n/a         unmanaged
  2 enp0s25          ether              n/a         unmanaged
  3 wlo1             wlan               n/a         unmanaged

3 links listed.

Também possui unidades correspondentes às interfaces

$ systemctl list-units |grep wlo1
sys-devices-pci0000:00-0000:00:1c.3-0000:24:00.0-net-wlo1.device                                                        loaded active plugged   Centrino Ultimate-N 6300 (3x3 AGN)
sys-subsystem-net-devices-wlo1.device                                                                                   loaded active plugged   Centrino Ultimate-N 6300 (3x3 AGN)

Aparentemente, você pode usá-los nos arquivos da unidade de serviço. Portanto, basta criar uma unidade de serviço para executar seu script e usar algo assim dentro dele para fazê-lo funcionar condicionalmente na rede:

BindsTo=sys-subsystem-net-devices-wlo1.device
After=sys-subsystem-net-devices-wlo1.device

Boa sorte! Eu não testei isso, então "sua milhagem pode variar".

Fontes:

Rolf
fonte