Receba seu IP externo via e-mail ou ensine o bash a ler e enviar e-mails

Muitas vezes precisamos acessar nossas máquinas remotamente, mas como aqui no Brasil quase todos usam IP dinâmico e muitos eventos podem fazê-lo mudar: perda de sinal do modem, falta de energia, problemas no provedor de acesso... precisamos de algum modo simples que nos envie o IP. A ideia é ensinar o sistema a enviar e ler e-mails.

[ Hits: 24.486 ]

Por: /dev/movebo em 27/09/2010 | Blog: http://devmovebo.blogspot.com


Criando o script de checagem e envio



3. Criando o script de checagem e envio

No Slackware para que um script seja executado por último lugar no boot, duas coisas são necessárias:
  • Que ele seja chamado pelo /etc/rc.d/rc.local
  • Que ele seja executável

Adicione as linhas abaixo em seu /etc/rc.d/rc.local como root:

if [ -x /etc/rc.d/rc.mailMyIp ]; then
   . /etc/rc.d/rc.mailMyIp start
fi

E vamos criar o rc.mailMyIp. Há 3 técnicas que gostaria de mencionar:
  • Na função MSG() envio os dados para um arquivo. Talvez você prefira comparar o IP atual com o que está no arquivo. No dia-a-dia achei mais fácil comparar sempre com o que está legível no e-mail, vai que você deleta a mensagem...
  • Eu obtenho o IP externo na linha 45:

    IP=`curl -s http://myip.com.br/index2.php | sed '/Seu IP/!d;s/.*IP://g;s/<.*//g;s/ //g'`

    Basicamente uso o curl para acessar um site que informa meu IP e "parseio" o endereço da mesma forma que fizemos com o e-mail.

  • A estratégia para enviar o e-mail é a seguinte:

    (a) A placa de rede tem um endereço válido (em casa é 192.x.y.z, por isso a linha 52);
    (b) Na linha 57 damos 3 tiros de ping para o google e contamos quantos chegam.
    (b.1) Dê preferência a usar o IP, porque em caso de DNS inacessível, o tempo de espera cai bastante. Caso o DNS esteja DISPONÍVEL há um ganho de 17% (OK, 0.192s em média).
    (b.2) Se nenhum ping chegar, não tem internet. Desencane do resto.
    (c) Se o ping chegou, busque o IP externo.
    (d) Pegue o IP lá do e-mail e compare os dois.
    (e) Se forem iguais não há nada a fazer.
    (f) Se forem diferentes envie o e-mail.
    (g) A versão start é para ser usada no boot, a versão check pelo cron.

3.1. O script rc.mailMyIp

Preciso deixar colorido, o que é para mudar?
Comece pelo ADDRS.
Cheque a linha 24.
Onde você pôs seu naviip (linhas 80, 106)?
O que posso fazer para melhorar isso?
Uma cópia deste script está aqui: http://pastebin.com/3m5zHPax
Se você prefere ele cru: http://pastebin.com/raw.php?i=3m5zHPax

# cd /etc/rc.d; touch rc.mailMyIp; chmod 700 rc.mailMyIp;
# vim rc.mailMyIP


#!/bin/bash

###############
# DEFINITIONS #
###############

FILE=/tmp/.mailMyIP
DATE=`date +"%F %H:%M:%S"`
ADDRS="zeh@gmail.com"
MSMTP=`which msmtp`
PING=`which ping`
SED=`which sed`
PRINTF=`which printf`
IFCONFIG=`which ifconfig`


####################
# FUNCTIONS: BEGIN #
####################

MSG() {
   BODY="Subject: NAVI has booted, check your IP Date: $DATE NAVI was booted at $DATE NAVI IP=$IP "
    echo "$BODY" > $FILE
    echo "$BODY" | $MSMTP -C /root/.msmtprc $ADDRS
}

mailMyIp() {
   if [ -f $FILE ]; then
      OLDIP=`cat $FILE | sed '/IP=/!d;s/.*=//g'`
      [ "$IP" != "$OLDIP" ] && MSG
   else  
      MSG      
   fi
}

OK() {
   echo -e "\033[60G[  e[32;1mOKe[0m  ]"
}

FAIL() {
   echo -e "\033[60G[ e[31;1mFAILe[0m ]"
}

GET_IP() {
   IP=`curl -s http://myip.com.br/index2.php | sed '/Seu IP/!d;s/.*IP://g;s/<.*//g;s/ //g'`
   echo -n $IP
}

TEST_INET() {
   ETH0=`$IFCONFIG eth0 | sed '/inet /!d;s/.*r://g;s/..*$//g'`

   if [ $ETH0 -ne 192 ]; then
      echo "Network not available"
      exit -1
   else
      printf "%b" "Testing your Internet Connection:"
      PING_COUNT=`$PING -l3 -w1 173.194.34.104 2> /dev/null | $SED '/rec/!d;s/.*ted, //g;s/ .*//g'`
   fi
}

##################
# FUNCTIONS: END #
##################


case "$1" in
'start')
   TEST_INET  

   if [ $PING_COUNT -eq 0 ]; then
      FAIL
   else
      OK
      echo -n "   Retrieving external IP:   "
      GET_IP
      
      if [ -n "$IP" ]; then
         OK
         echo -en "   Retrieving IP from gmail: "
         NAVI_IP=`$HOME/bin/naviip`

         if [ -n "$NAVI_IP" ]; then
            echo -n "$NAVI_IP"
            OK
         else
            FAIL
         fi

         if [ "$IP" != "$NAVI_IP" ]; then
            echo -en "   Mailing the new IP to $ADDRS"
            MSG
            OK
         else
            echo "   Nothing to do."
         fi
      else
         FAIL
      fi  
   fi
   ;;
'check')
   TEST_INET > /dev/null
   if [ $PING_COUNT -ne 0 ]; then
      GET_IP >> /dev/null
      if [ -n "$IP" ]; then
         NAVI_IP=`/usr/local/bin/naviip`
         [ "$IP" != "$NAVI_IP" ] && MSG
      fi
   fi
   ;;
*)
   echo "usage $0 {start|check}"
esac

Página anterior    

Páginas do artigo
   1. Introdução
   2. Lendo e-mails com o wget
   3. Criando o script de checagem e envio
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

cal2svg - brincando com shell script e arquivos vetoriais SVG

Monitorando servidores pelo celular

O comando tput

Relatório de sistema via browser (shell script + CGI)

Como programar backup com rsync e cron de maneira rápida e simples

  
Comentários
[1] Comentário enviado por xerxeslins em 28/09/2010 - 00:29h

Interesante!

[2] Comentário enviado por letifer em 28/09/2010 - 16:51h

Pessoal,

cuidado que o VOL está ignorando as barras de escape (\ ).
Se você não tem certeza se em algum ponto do código deve haver uma barra de escape, no meu blog postei os códigos através do site pastebin.
< http://bit.ly/deB0dO >

Também pus algumas atualizações do código lá, ele ficou 50% mais rápido.

[]s
/dev/movebo

[3] Comentário enviado por letifer em 28/09/2010 - 17:06h

Pegue o código atual diretamente em:
< http://pastebin.com/R7vWtxEm >


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts