Desativando o repositório Medibuntu

Após meses somente usando o Linux sem fazer nenhuma atualização, vi que meu MPlayer estava desinstalado. Fui tentar instalar e notei que um dos repositórios adicionados estava dando erro:

Err http://packages.medibuntu.org quantal/non-free amd64 Packages 
 404 Not Found

Pesquisando, vi nos fóruns que o projeto medibuntu foi desativado, conforme anúncio na página oficial [1]. O repositório do Medibuntu era usado para fornecer dois pacotes:

  • libdvdcss2 – reprodução de DVDs
  • w64codecs – Codecs para RealPlayer 10 (RV30/40, COOK, and RealAudio)

No meu caso, precisava somente desabilitar o repositório do Medibuntu… Mas vai que eu preciso atualizar o libdvdcss, melhor fazer o serviço completo: desativar o Medibuntu e ativar o repo oficial do libdvdcss:

1) Removendo a entrada do Medibuntu do sources.list:

sudo sed -i '/^deb http:\/\/packages.medibuntu.org*/d' /etc/apt/sources.list /etc/apt/sources.list.d/*.list

2) Adicionando o repositório do libdvdcss:

curl ftp://ftp.videolan.org/pub/debian/videolan-apt.asc | sudo apt-key add -
echo "deb ftp://ftp.videolan.org/pub/debian/stable ./" | sudo tee /etc/apt/sources.list.d/libdvdcss.list
sudo apt-get update

E depois instalei meu MPlayer e fui ser feliz 🙂 .

Referências:

[1] https://launchpad.net/medibuntu/+announcement/11951
[2] http://blogs.kde.org/2013/09/11/medibuntu-disappear-libdvdcss-now-direct-videolan

Feliz ano novo!

Cortar o tempo

Carlos Drummond de Andrade

Quem teve a ideia de cortar o tempo em fatias a que se deu o nome de ano, foi um indivíduo genial.

Industrializou a esperança, fazendo-a funcionar no limite da exaustão.

Doze meses dão para qualquer ser humano se cansar e entregar os pontos.

Aí entra o milagre da renovação e tudo começa outra vez, com outro número e outra vontade de acreditar que daqui pra diante vai ser diferente.

Aqui termina Carlos Drummond de Andrade… e eu completo:

Teremos outras 365 novas oportunidades de dizer à vida, que de fato queremos ser plenamente felizes:

Que queremos viver cada dia, cada hora e cada minuto em sua plenitude, como se fosse o último.

Que queremos renovação e buscaremos os grandes milagres da vida a cada instante.

Todo Ano Novo é hora de renascer, de florescer, de viver de novo.

Aproveitem este ano que está chegando para realizar todos os seus sonhos!

Seja bem vindo, 2014!

 

Feliz 2014

Script para coletar informações básicas da máquina

Coleta informações como hostname, modelo e quantidade de CPU, memória, disco e rede.

A parte de coleta de informações de rede foi baseada no script disponibilizado no Viva o Linux [1].

O script ficou meio grande para colocar aqui no post, então segue um trechinho do código… e no arquivo info_maquina.doc consta o script completo.

#!/bin/bash
#### Script para coletar informacoes da maquina
## Nix - Novembro/2013
# Coleta info de memoria
MEM="$(cat /proc/meminfo | grep "\MemTotal" | cut -d\: -f2-)"
MEM="$(echo ${MEM})"
# Coleta info processador - quantidade
NPROC="$(cat /proc/cpuinfo | grep -i processor | wc -l)"
NPROC="$(echo ${NPROC})"
# Coleta info processador - modelo
PROC="$(cat /proc/cpuinfo | grep "\model name" | tail -1 | cut -d\: -f2-)"
PROC="$(echo ${PROC})"

Saída na tela:

Saída informações da máquinas
Saída informações da máquinas

Referência:

[1] Script simples para pegar informações sobre a placa de rede

Script para validação de senhas em massa

Estreando uma nova categoria dentro de Learning no blog: Scripts.

Não… não sou programadora… mas quem administra sistemas, desde cedo aprende que quanto mais tarefas rotineiras for possível automatizar… mais tempo terá para fazer coisas interessantes, como por exemplo, iniciar um estudo de uma tecnologia que pode ser utilizada na empresa, ou trabalhar em algum projeto, enfim… ‘n’ coisas :).

Ainda tenho muito o que aprender em termos de script (começando pela lógica :(), mas andei brincando com alguns scripts e descobri que apesar de não saber programar, não é que eles foram de grande ajuda no meu dia-a-dia? 🙂

Mas vamos lá… Recentemente, precisei fazer uma validação em massa da senha de root em vários servidores, sendo que para cada um a senha era diferente.

Com a ajuda do expect [1] e um howto [2] bacana encontrado by google, consegui realizar a validação :).
pwtest.exp
#!/usr/bin/expect -f

################################################################################################################
## Script para testar a conexão com o servidor e checar se a senha do usuário root está correta ou não ##
## Utiliza o comando expect para fazer o acesso e inserir a senha ##
## Referência: http://www.pantz.org/software/expect/expect_examples_and_tips.html ##
## Nix - 23/08/2013 ##
################################################################################################################
######### Variaveis ######### 
set timeout 9
set HOST [lindex $argv 0]
set PASS [lindex $argv 1]
log_user 0

## Inicializa a conexão SSH 
spawn ssh -q -o StrictHostKeyChecking=no root@$HOST
## Mensagem de erro a ser exibida caso ocorra timeout na conexão SSH (prompt que solicita a senha não é exibido)
## *assword é para corresponder "Password" ou "password" :)
expect {
 timeout { send_user "\nFailed to get password prompt\n"; exit 1 }
 eof { send_user "\nSSH failure for $HOST\n"; exit 1 }
 "*assword"
}
## Caso o prompt que solicita a senha é exibido, a mesma é enviada
send "$PASS\r"

## Mensagem a ser exibida caso a senha esteja incorreta
## *\# indica o prompt do usuário - no caso, o root
expect {
 timeout { send_user "$HOST - Login failed. Password incorrect.\n"; exit 1}
 "*\# "
}
## Caso a senha esteja correta, é exibida a mensagem abaixo:
send_user "$HOST - Password is correct\n"

## Desconecta do servidor - o mesmo que Control+D:
send "exit\r"
## Encerra programa
close

==============================================================================================================================
valida_pw.sh
#!/bin/bash

################################################################################################################
## Script para validar senhas em massa a partir de um arquivo de servidores e outro com as respectivas senhas 
## Executa o arquivo pwtest.exp 
## Nix - 23/08/2013
################################################################################################################

######## Variaveis ########
# Lista de servidores
HOSTS=$(cat /root/temp/hosts_dev.txt)
# Arquivo de senhas
PWDS=$(cat /root/temp/pws_dev.txt)

####### Contador para ler o arquivo de senhas linha a linha #######
i=0
for pd in $PWDS; do
 pws[$i]=$pd;
 i=`expr $i + 1`
done

####### Contador para ler o arquivo de hosts linha a linha e testar a senha usando o script expect #######
### É passado como parâmetro o servidor ($j) e a senha do mesmo ($pws)
i=0
for j in $HOSTS; do
 /root/temp/pwtest.exp $j ${pws[$i]}
 i=`expr $i + 1`
done

============================================================================================================================== 

Para executar (antes é necessário dar permissão usando o comando chmod ;)):

$./valida_pw.sh

Até a próxima! 🙂
Referências:
[1] http://www.nist.gov/el/msid/expect.cfm
[2] http://www.pantz.org/software/expect/expect_examples_and_tips.html

Revista Infra Magazine 12 – Introdução ao Shell Script

Artigo publicado na Infra Magazine em parceria com a Pathiene G. B. Gonçales!

Este artigo tem por objetivo introduzir fundamentos de Shell script aos administradores de sistema, possibilitando a automatização de tarefas repetitivas e até mesmo a personalização do ambiente. Leia mais em: Introdução ao Shell Script – Revista Infra Magazine 12.

Comando expect

Recentemente, tive que fazer a instalação de um software em diversos (ok, muitos) servidores. Imediatamente, pensei em automatizar a tarefa quando me deparei com um problema: a instalação era feita em modo interativo, isto é, esperava receber algumas respostas. Pesquisando no google e conversando com algumas pessoas, fui apresentada ao expect [1], que me ajudou a resolver o problema (viva a comunidade opensource! \o/).

O expect é uma ferramenta para automatizar um processo que recebe comando interativos, isto é, que exibe um prompt e espera que o usuário digite alguma resposta. Alguns exemplos de aplicações interativas são: passwd, ftp, fsck, ssh, entre outras.

Três comandos compõe a estrutura do expect: spawn, expect e send e o uso dele é simples. O comando spawn inicia o processo, expect aguarda por uma sequência de strings de um processo e send envia uma string para um processo (comandos, senhas e outros).

Instalação

expect é uma extensão Tcl [2] e pode ser instalado em praticamente todas distribuições Linux, seja através de um gerenciador de pacotes como por exemplo apt-get no Debian, yum no Red Hat ou ainda através do código fonte [3]. No meu caso, estou utilizando o Linux Mint (derivado do Ubuntu, que por sua vez deriva do Debian) e para instalar executei:

$ sudo apt-get install expect

Como o expect trabalha

Scripts expect são escritos como a maioria de outros scripts. Assim como no Bash ou Perl, onde a primeira linha com o shebang[4] indica o programa ou shell que será utilizado para executar os comandos do script, expect também utiliza essa formatação. Para localizar o binário do expect, basta utilizar o comando which:

$ which expect
/usr/bin/expect

É necessário saber o path do binário pois essa informação será colocada na primeira linha do script.

A maioria dos scripts começam com o processo que se quer interagir, como por exemplo “spawn ssh ivani@localhost” ou “spawn ftp localhost”. Em uma forma simples, o processo é iniciado com o comando spawn que gera uma saída onde o expect irá procurar padrões para em seguida, com base nos resultados, enviar comandos através do comando send.

O problema

Pacote que durante a instalação faz algumas perguntas tais como aceite de licença e path da instalação.

Solução encontrada

1) Criação da lista de hosts onde será feita a instalação.

2) Criação do script install_app.exp com os comandos a serem executados e as respostas esperadas. Lembrando que o Linux não reclama com esse negócio de extensão, apenas utilizei .exp para ficar organizado e eu saber que se trata de um script expect.

3) Criação de um shell script que executa o script install_app.exp em cada host que consta na lista criada no item 1.

No lab, a simulação da instalação do pacote foi feita com um instalador java antigo (jre-6u7-linux-i586.bin) que tem o mesmo comportamento da aplicação que precisei instalar.

1) Lista de hosts

Arquivo texto com os hosts listados linha a linha. Exemplo:

$ cat hosts.txt
192.168.1.100

2) Script install_app.exp

Corpo do script expect que faz a instalação remota da aplicação;  linhas foram numeradas para facilitar a explicação.

1 #!/usr/bin/expect -f
2 set HOST [lindex $argv 0]
3 exp_internal 1
4 spawn ssh ivani@$HOST
5 expect “%”
6 send “/home/ivani/jre-6u7-linux-i586.bin \r”
7 send “%q”
8 expect “% EOF”
9 send “yes \r”
10 expect “% Done.”
11 send “exit \r”
12 expect eof

Linha 1 – #!/usr/bin/expect

Indica o path do interpretador de comandos que será utilizado.

Linha 2 – set HOST [lindex $argv 0]

Atribui variáveis. Scripts criados com o expect devem ter o formato Tcl; assim, não é possível utilizar variáveis como $1, por exemplo, para pegar parâmetros passados na linha de comando. É necessário utilizar a variável argv junto com o comando [lindex $argv 0], que faz com o primeiro parâmetro indicado na linha de comando (no caso, o nome do host) seja colocado na variável $HOST.

Linha 3 – exp_internal 1

Ativa a função de debug e irá mostrar todas as ações que o expect está realizando. Para desligar basta retirar a linha do script ou simplesmente trocar 1 por 0.

Linha 4 – spawn ssh ivani@$HOST

Inicia o processo da aplicação interativa, no caso, o ssh.

Linha 5 – expect “%”

Aguarda uma instrução (nesse caso, o prompt).

Linha 6 – send “/home/ivani/jre-6u7-linux-i586.bin \r”

Envia um comando para ser executado remotamente, e oparâmetro \r é o <enter> esperado.

Linha 7 – send “%q”

No pacote que está sendo instalado, o comando more é acionado para exibir uma licença e é necessário pressionar espaço para ler ou ir direto para o fim do arquivo, onde o usuário será questionado se quer ou não aceitar. Aqui, foi enviado “q” para sair da licença.

Linhas – 8 e 9:

expect “% EOF”
send “yes \r”

Quando se pressiona “q” para sair da licença, é enviado um “EOF” indicando saída da leitura da licença e aparece para o usuário se quer ou não aceitar a licença; nesse ponto, o script envia a resposta yes.

Linhas 10 e 11:

expect “% Done.”
send “exit \r”

Ao encontrar o termo “Done”, é enviado o comando exit para desconectar da sessão ssh.

Linha 12 – expect eof

Garante que o script aguarde a execução dos comandos antes de retornar o controle para o script .sh e finalizar a conexão SSH.

3) Script install_java.sh

Shell script que chama o script expect para instalar o pacote nos servidores.

Esse shelll é bem simples, foi criado um laço que irá ler o arquivo hosts.txt e para cada linha nesse arquivo, será executado o script java.exp.

A seguir o script:

1 #!/bin/bash -x
2
3 for host in $(cat hosts.txt)
4 do
5 /home/ivani/Scripts_Learning/java.exp $host
6 done

Abaixo, trechos da execução do script install_java.sh  (partes foram suprimidas para o post não ficar tãão longo…).

ivani@nix ~/Scripts_Learning $ pwd
/home/ivani/Scripts_Learning
ivani@nix ~/Scripts_Learning $ ./install_java.sh
++ cat hosts.txt
+ for host in ‘$(cat hosts.txt)’
+ /home/ivani/Scripts_Learning/java.exp 192.168.1.100
spawn ssh ivani@192.168.1.100
Linux lab 2.6.32-5-686 #1 SMP Fri Feb 15 15:48:27 UTC 2013 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

[…]
Last login: Tue Jul 9 20:58:21 2013 from 192.168.1.101
ivani@lab:~$ /home/ivani/jre-6u7-linux-i586.bin

Sun Microsystems, Inc. Binary Code License Agreement

for the JAVA SE RUNTIME ENVIRONMENT (JRE) VERSION 6

SUN MICROSYSTEMS, INC. (“SUN”) IS WILLING TO LICENSE THE
SOFTWARE IDENTIFIED BELOW TO YOU ONLY UPON THE CONDITION
THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS BINARY
CODE LICENSE AGREEMENT AND SUPPLEMENTAL LICENSE TERMS
(COLLECTIVELY “AGREEMENT”). PLEASE READ THE AGREEMENT
CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE, YOU
ACCEPT THE TERMS OF THE AGREEMENT. INDICATE ACCEPTANCE BY
SELECTING THE “ACCEPT” BUTTON AT THE BOTTOM OF THE
AGREEMENT. IF YOU ARE NOT WILLING TO BE BOUND BY ALL THE
TERMS, SELECT THE “DECLINE” BUTTON AT THE BOTTOM OF THE
AGREEMENT AND THE DOWNLOAD OR INSTALL PROCESS WILL NOT
CONTINUE.

[…]

Do you agree to the above license terms? [yes or no]
yes
Unpacking…
Checksumming…
Extracting…
UnZipSFX 5.50 of 17 February 2002, by Info-ZIP (Zip-Bugs@lists.wku.edu).
creating: jre1.6.0_07/
creating: jre1.6.0_07/bin/
inflating: jre1.6.0_07/bin/java
[…]

Done.
ivani@lab:~$ exit
logout
Connection to 192.168.1.100 closed.
ivani@nix ~/Scripts_Learning $ 

Até o próximo post :)!
Referências

[1] http://en.wikipedia.org/wiki/Expect

[2] http://en.wikipedia.org/wiki/Tcl

[3] http://www.nist.gov/el/msid/expect.cfm

[4] http://en.wikipedia.org/wiki/Shebang_(Unix)

Getting Started With Expect – O’Reilly

Comando date e comando cal

Comando date

Basicamente, a função do comando date é exibir e alterar a data e hora atual do sistema.

Sintaxe:

date MMDDHHmmAAAA

Onde:

MM – Mês
DD – Dia
HH – Hora
mm – Minuto
AAAA – Ano

Exemplos do comando date:

  • Exibir data e hora atual do sistema:

$ date
Sun Jun 30 16:07:22 BRT 2013

  • Alterar data para 01/01/1970 e hora 00:00 (necessário poderes de root!):

$ sudo date 010100001970
[sudo] password for ivani:
Thu Jan 1 00:00:00 BRT 1970

$ date
Thu Jan 1 00:00:02 BRT 1970

  • Exibir data e hora daqui a 4 meses:

$ date –date=”4 months”
Wed Oct 30 17:20:40 BRST 2013

  • Exibir data e hora específicos no passado:

$ date –date=”37 years ago 2 months ago 17 day ago”
Tue Apr 13 16:22:01 BRT 1976

Para saber mais:

# man date

Comando cal

Se estiver em modo texto e precisar de um calendário rápido, o comando cal pode ajudar! Ele exibe o calendário do mês correspondente à data atualdo sistema ou de um mês e ano especificados.

Para saber mais:

# man cal

Exemplos:

  • Calendário do mês atual e de mês específico e calendário 2013:

Comando cal

Calendário 2013