Graças à modificação feita por Ethanpil no script cPanel original (parte 2 deste texto), os métodos que vou explicar a seguir são compatíveis com a atualização de serviços como dyndns e no-ip. Ou seja: você pode usá-los também, com pequenas modificações, para atualizar seu IP dinâmico oferecido por esses serviços.
É interessante consultar também: DNS Dinâmico: Como ter no seu site a funcionalidade de whatismyip, check.dyndns ou icanhazip
Windows – arquivo batch híbrido com javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
@if (@This==@IsBatch) @then @echo off rem **** zona batch ********************************************************* rem Elaborado por Jefferson Ryan - https://ryan.com.br/blogs/quicktalk/?p=4107 rem baseado parcialmente em: http://stackoverflow.com/a/20787029 setlocal enableextensions disabledelayedexpansion rem aqui o comando ping é usado como uma forma de consulta DNS for /f "tokens=2 delims=[]" %%a in ('ping -n 1 teste.exemplo.com.br') do set "ipaddress=%%a" rem este mesmo script vai ser chamado de novo, com %ipaddress% como parâmetro para a zona Javascript. rem Se o script for chamado por wscript, os comandos .Echo abrirão janelas popup. rem Melhor usar cscript na nossa aplicação cscript //E:JScript "%~dpnx0" %ipaddress% rem remova esta pausa quando tiver terminado de testar o script pause rem End of batch area. Ensure batch ends execution before reaching rem javascript zone exit /b @end // **** zona Javascript ***************************************************** var $usuario = "usuario"; //mesmo usuário configurado no script cPanel var $senha = "senha"; //mesma senha configurada no script cPanel var $ServicoIPexterno = "http://icanhazip.com/"; var $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php"; var $hostname = "teste"; //ao mudar isto aqui, lembre de mudar também o comando "for" na zona batch. //O mecanismo javascript do Windows não tem suporte para a função .trim() //por isso é preciso implementar uma //http://stackoverflow.com/a/2308157 if(typeof String.prototype.trim !== 'function') { String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); } } // Aqui entra o parâmetro passado pela zona batch var $DNSip = WScript.Arguments.Item(0); WScript.Echo($DNSip); var http = WScript.CreateObject('Msxml2.XMLHTTP.6.0'); http.Open("GET", $ServicoIPexterno, false); http.Send(); //Este script requer que a única resposta da consulta de IP seja o número IP //Nenhuma tentativa é feita para achar o IP na resposta var $ip =http.ResponseText; WScript.Echo($ip); $DNSip = $DNSip.trim(); $ip = $ip.trim(); if ($DNSip == $ip){ WScript.Echo("Os endereços são iguais. Nada a fazer."); }else { //executa o outro script em $EnderecoScriptAlvo, usando $hostname e $ip como parâmetros http.open("GET", $EnderecoScriptAlvo+"?hostname="+$hostname+"&myip="+$ip, false, $usuario, $senha); http.send(); //Exibe a resposta do outro script. Útil para debug. WScript.Echo(http.responseText); } WScript.Quit(0); |
Uso
Edite as variáveis na zona javascript
1 2 3 4 5 |
var $usuario = "usuario"; var $senha = "senha"; var $ServicoIPexterno = "http://icanhazip.com/"; var $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php"; var $hostname = "teste"; //ao mudar isto aqui, lembre de mudar também o comando for na zona batch. |
E faça uma edição correspondente na zona batch
1 |
for /f "tokens=2 delims=[]" %%a in ('ping -n 1 teste.exemplo.com.br') do set "ipaddress=%%a" |
Salve o script com a extensão .cmd em uma máquina Windows qualquer que esteja na mesma rede cujo IP externo você quer atribuir ao host. Crie uma tarefa agendada que o execute a cada x minutos. Se não for detectada nenhuma mudança no IP, o script que se conecta ao cPanel nem será chamado.
Testado apenas no Windows 8.1 x64. Não requer permissão de administrador para rodar.
Esse script não tem nenhuma checagem contra problemas de conectividade.
Windows – Powershell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# ============= variáveis a editar $usuario = "usuario" $senha = "senha" $hostname = "teste" $dominio = "exemplo.com.br" $ServicoIPexterno = "http://icanhazip.com/" $EnderecoScriptAlvo = "http://exemplo.com.br/dyndns.php" # ============== $webclient = new-object System.Net.WebClient # NetworkCredentials precisa ser preenchida com o usuário e senha de acesso ao script (não as credenciais cPanel) $webclient.Credentials = new-object System.Net.NetworkCredential($usuario, $senha) $IPatual = $webclient.DownloadString($ServicoIPexterno) $UltimoIP = [System.Net.Dns]::GetHostAddresses("$hostname.$dominio.")[0].ToString() $IPatual = $IPatual.Trim() $UltimoIP = $UltimoIP.Trim() Write-Output "IP externo atual: $IPatual" Write-Output "DNS Lookup : $UltimoIP" if ($UltimoIP.CompareTo($IPatual) -eq 0) { Write-Output "Nao e´ necessario atualizar." } else { Write-Output "Rodando agora o script de atualizacao $URLfinal..." $URLfinal =$EnderecoScriptAlvo+"?hostname="+$hostname+"&myip="+$IPatual Write-Output $webclient.DownloadString($URLfinal) } |
Uso
- Edite as variáveis no início do script
- Salve como, por exemplo, ddns_updater.ps1
- Use um batch como o seguinte para executá-lo, adaptando o caminho para o arquivo de acordo com sua situação:
1 2 3 |
powershell -executionpolicy bypass -File E:\_PS_Scripts\ddns_updater.ps1 rem remova a pausa quando tiver terminado de debugar o script pause |
- Crie uma tarefa agendada que execute esse batch a cada x minutos. Se não for detectada nenhuma mudança no IP, o script que se conecta ao cPanel nem será chamado.
Testado apenas no Windows 8.1 x64. Não requer permissão de administrador para rodar.
Esse script não tem nenhuma checagem contra problemas de conectividade.
O arquivo batch intermediário é necessário porque, como o Windows é alvo de abusos e o Powershell é poderoso, a MS decidiu bloquear a execução de scripts Powershell por default. Aparentemente é possível agendar uma tarefa para rodar o script diretamente, mas ainda preciso confirmar isso.
Outro dia eu expandirei este texto com exemplos de:
- Arduino
- DD-WRT/OpenWRT
Acrescentei um exemplo Powershell
Bom dia Jefferson e colegas. Não sei se podem me ajudar, mas queria uma dica de vocês: atualmente minha filha de 9 anos tem um tablete infantil (da Frozen…) e ele já está fraquinho/memória interna cheia. Pensei em comprar um novo, mas sinceramente as especificações de tablets infantis praticamente não evoluíram nada desde que comprei esse pra ela (cerca de 2 anos). E os tablets “adultos” são muito caros! Eu mesmo tenho um velho Samsung GalaxyTab 3 e eles já está “entregando os pontos” também (não em memória mas em processamento mesmo). O que me aconselhariam nesse caso?
Primeiro, a terminar de acordar antes de postar comentários em blogs.
Eu quis postar em off-topic mas foi na postagem errada…