Arquivo da tag: shell script

Script para ntp fake (AKA como atualizar horário via http usando shell script)

Disclaimer:

O conteúdo deste post é histórico, mantido aqui apenas para ter exemplificar como fazer um script parsear um HTML. Para funcionar, ele depende de uma URL que não está mais disponível.
Atualmente (consultei em 31/05/2020), o Observatório Nacional disponibiliza na URL http://www.horalegalbrasil.mct.on.br/RelogioServidor.php a data em formato “epoch” que, basicamente, são quantos segundos se passaram desde a meia noite do dia 01/01/1970. Então basta converter esse número com o comando date para saber a hora atual.

Para ter uma ideia para um script, pode-se pensar em algo como:

$ date --date=@`curl -s http://www.horalegalbrasil.mct.on.br/RelogioServidor.php`

Sun May 31 18:43:43 -03 2020

E então pode-se seguir uma lógica semelhante ao que tem no restante do post se quiser que esta hora seja aplicada ao sistema.

Agradeço ao Ricardo, da Amplus, por ter informado que a URL do texto não estava mais ativa e ainda por ter sugerido essa nova URL citada acima.

Resumo da história:

Preciso que uma máquina virtual tenha a hora sempre correta mas não posso instalar o vmware tools e nem usar ntp para isso. Como fazer?

A história completa:

Tenho uma máquina virtual onde não consigo instalar o vmware-tools (máquina extremamente customizada, quase nada funciona ali sem muita modificação). Esta máquina virtual está numa rede onde não tem um servidor ntp e, para “ajudar”, o firewall desta rede não permite que eu acesse nenhum servidor ntp externo. Preciso que o horário nesta máquina esteja correto (ok, um ou outro segundo não é problema, mas a data estar na “semana passada” definitivamente não é bom).

Por sorte esta máquina consegue acessar http (via proxy, óbvio) então, tudo o que eu precisava era de uma página web que sempre tivesse a hora correta.

No Brasil, quem é o “responsável” pela hora oficial é o Observatório Nacional. Navegando pelo site deles encontrei uma url que tem a hora legal brasileira e é atualizada a cada segundo.

No meio daquela página vai ter a hora assim: 20/3/2012 15:45:38. Mas o comando date espera receber esta hora assim: 032015452012.38 (se lê de dois em dois dígitos, exceto o ano: mês; dia; hora; minuto; ano; “.” e segundo).

Então basicamente o que eu precisei é “ler” a página e “traduzir” para o formato que o comando “date” do Linux entende.

A gambiarra (AKA “solução” do problema):

Abri o source da página e tentei entender onde a data e hora estava. Vi que a hora que preciso aparece no meio de algumas tags html na terceira linha após o texto “Hora Oficial”.

O trecho do source em questão:

<TD ALIGN="CENTER" BGCOLOR=#E0FFFF><B>Hora Oficial de Brasília</B></TD>
</TR>
<TR>
<TD ALIGN="CENTER" BGCOLOR=#ffcc66><B>20/3/2012 15:45:38</B></TD>

Separei somente a linha que queria e “limpei” todas as tags, deixando somente a hora.

20/3/2012 15:45:38

Para o script ler a página, usei o comando curl, grep para procurar no texto por “Hora Oficial” e separar as próximas três linhas, tail para separar a última dessas três linhas e, finalmente, sed para remover as tags html.

O código usado (porco, confesso, mas pode rodar no seu shell) , é esse:

curl -s http://pcdsh01.on.br/HoraLegalBrasileira.asp|grep -A3 “Hora Oficial”|tail -1|sed ‘s/<TD ALIGN=”CENTER” BGCOLOR=#ffcc66><B>//g;s/<\/B><\/TD>//g’
 

Armazenei a saída desse comando numa variável, no caso “hora_full”.

Então traduzi a hora que ele me retornou para o formato do date (mais um código porco, mas está “didático”):

hora=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 1`
minuto=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 2`
segundo=`echo $hora_full|cut -d ” ” -f 2|cut -d : -f 3|tr -d ‘\r’`
mes=`echo $hora_full|cut -d “/” -f 2`
dia=`echo $hora_full|cut -d “/” -f 1`
ano=`echo $hora_full|cut -d “/” -f 3|cut -d ” ” -f 1`

E juntei tudo como parâmetro para o comando date:

date $mes$dia$hora$minuto$ano.$segundo

Se seu usuário tiver permissão para alterar a data do sistema, isto deverá “sincronizar” com o horário legal brasileiro.

PS: depois (AKA talvez um dia) eu coloque o script todo, inclusive com verificação se o usuário tem ou não permissão para acertar o horário do sistema.

Alguns comandos úteis em Solaris

A maioria dos servidores onde trabalho é baseada em Sparc Solaris. Algumas pessoas conhecem Linux ao invés de Unix e ficam perguntando coisas como “como é que se chama o comando top do Solaris?”

Para manter uma lista “organizada” para mim, meus colegas de trabalho e quem mais precisar, segue uma lista simples com alguns comandos (eventualmente eu adiciono mais alguma coisa, mas vai isso mesmo agora):

prstat -a -> lembra o “top” do Linux.

vmstat 1 -> mostra status da memória e atualiza a cada 1 segundo. Sem o “1” apenas mostra o status e finaliza.

iostat 1 -> mostra status de I/O a e atualiza a cada 1 segundo.

mpstat 1 -> mostra status de cada cpu e atualiza a cada 1 segundo.

/usr/ucb/ps auxwww|grep 15251 -> mostra “todo” o comando cujo PID é 15251. É necessário digitar o PATH completo (ou mudar a ordem do PATH da máquina) pois este é outro ps que vem nos Solaris. Não sabia que tinha outro ps? Dê uma passeada em /usr/ucb ou em /usr/xpg4/bin e veja o que mais tem repetido mas com algumas funcionalidades diferentes :)

/usr/sbin/psrinfo -v -> mostra o processador instalado e velocidade.

/usr/sbin/psrinfo -p -> mostra quantos processadores físicos estão instalados na máquina (se combinar com “-v” mostra o número de processadores virtuais em cada processador físico.

prtvtoc /dev/dsk/c0d0s0 -> mostra informações sobre partições do disco.

/usr/sbin/prtconf -> mostra informações sobre a máquina (incluindo memória instalada).

kstat -c net|grep net -> mostra interfaces de rede disponíveis.

prtdiag -> mostra algumas informações do sistema.

iostat -E -> mostra algumas informações sobre o disco.

Introdução a shell script

Introdução Programar em shell faz voltarmos a filosofia clássica do UNIX que é quebrar projetos complexos em subtarefas mais simples (isso é conhecido como princípio KISS, de Keep It Simple Stupid). Um conhecimento em shell script é essencial para qualquer um que deseja se tornar um administrador de sistemas, pois usando scripts, podemos realizar tarefas de administração muito mais rapidamente e muito mais facilmente (imagine a diferença entre ter que cadastrar trezentos usuários manualmente ou fazer um script com 6 linhas que cadastra todos estes usuários e ainda pode definir uma senha padrão para eles).

Continue lendo Introdução a shell script