Posts Tagged ‘dicas’

PostHeaderIcon Shell script: como fazer um loop até que uma tecla seja pressionada?

Recentemente, um amigo me mandou um email com uma dúvida: ele precisava desenvolver um shell script que ficasse executando uma determinada tarefa até que uma tecla pré-estabelecida fosse pressionada. Por imaginar que essa pode ser a necessidade de muitos outros sysadmins, usuários e desenvolvedores que trabalham com o mundo GNU/Linux, resolvi compartilhar essa rápida discussão por aqui.

Bem, existem várias maneiras para resolver esse problema e resolvi indicar uma das formas que julgo ser de fácil e rápido entendimento. O ponto chave é utilizar o comando read. Vejamos o exemplo a seguir:

#!/bin/bash
while read MyKey; do
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados...
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"

done
echo "Fim."

Bem, isso não parece resolver o problema, certo? Isso porque as tarefas devem ficar sendo executadas enquanto uma tecla pré-determinada (nesse caso, “p”), não for pressionada. Por outro lado, no exemplo anterior, as tarefas serão executadas apenas quando uma tecla qualquer, que não seja o próprio “p”, for pressionada. Isso ocorre porque o comando “read” ficará aguardando indefinidamente que o usuário digite alguma tecla que, por sua vez, é inserida na variável MyKey . Bem, definitivamente, não é disso que precisamos, certo?

Poucas pessoas sabem, mas o comando read não precisa ficar aguardando infinitamente alguma entrada do usuário. Com o parâmetro “-t <seg>” você pode indicar quantos segundos o comando irá ficar aguardando para que algo seja digitado. Caso o tempo indicado, em segundos, expire e nada seja digitado, o comando encerra sua execução. Sabendo disso, algumas pequenas mudanças nos farão chegar onde precisamos:

#!/bin/bash
while true ; do          
        read -n 1 -t 1 MyKey
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"
done
echo "Fim."

Feito, não? Entretanto, para ser um pouco mais caprichoso com o exemplo, ainda é possível alterar um “pouquinho  mais” o exemplo:

#!/bin/bash
INTERVALO=2 
while true ; do          
        read -s -n 1 -t $INTERVALO MyKey
        if [ "$MyKey" == "p" ]; then
                echo "Tecla escolhida foi pressionada. Saindo do loop."
                break
        fi

        # // Inclua aqui comandos a serem executados...
        # // ...enquanto a tecla nao e pressionada
        echo "Minhas tarefas estao sendo executadas"
done
echo "Fim."

Duas pequenas mudanças, certo? A primeira, muito básica, consiste em colocar o intervalo de tempo do read em uma variável. Dependendo do script, isso pode ajudar para mudar o comportamento sem entrar muito no código. A segunda, igualmente simples, consiste na adição do parâmetro “-s” que faz com que a tecla pressionada pelo usuário não seja impressa no terminal. Puro capricho… :-)

Acho que é isso. Até a próxima!

PostHeaderIcon Dicas rápidas para impressão de man pages

Essa dica é simples porém útil. Diferente de sistemas como Windows, onde o help incluso no próprio sistema operacional é pouco útil, sistemas GNU/Linux possuem uma documentação muito rica a respeito de seus comandos, configurações, chamadas de sistemas, dentre outros por meio das man pages.

Mesmo para os administradores de sistemas mais experientes, as consultas às man pages são recorrentes e, portanto, para todos os que lidam com esses manuais, algumas dicas podem ser úteis.

Por exemplo, para imprimir uma man page em uma formatação adequada, diferente do texto padrão, você pode utilizar o seguinte comando:

$ man -t cut | lpr -P <nome da sua impressora>

Se, por outro lado, você deseja criar um PDF com formatação adequada de uma man page, você pode se valer do comando "man", do pipe e do comando ps2pdf:

$ man -t cut | ps2pdf – finger.pdf

Por fim, se você deseja ver o texto de uma man page formatado em HTML e já aberto em seu browser preferido, basta executar o seguinte:

$ man -H/usr/lib/firefox cut

Vale lembrar que, para esse último comando funcionar adequadamente, você precisa ter instalado em seu sistema o groff:

# apt-get install groff

Bem, era isso. Uma dica simples. Apenas para registrar.

PostHeaderIcon Trocando wallpapers automaticamente no Gnome.

Se para a matemática e outras ciências da mesma época sete anos não significam nada, para a computação essa não é uma verdade. Era início de 2002 quando resolvi criar para meu ambiente Gnome um script para trocar, automaticamente, os papéis de parede de meu desktop. O script, desenvolvido em Perl, foi publicado na Dicas-L e esteve presente em meus desktops por muito tempo. Depois, por absoluta falta de tempo, acabei deixando-o de lado. Hoje, é possível encontrar soluções bem mais interessantes para desempenhar o mesmo papel como o Drapes, razão pela qual lembrei de meu velho e bom script em Perl.

A dica a respeito do Drapes foi encontrada acidentalmente em uma rápida navegação pelo site da Linux Journal. Publicada pelo próprio editor da revista, Shawn Powers, a dica é apresentada por meio de um vídeo que por ser bastante didático pode ser bem aproveitado até por aqueles que não tem muita intimidade com a língua inglesa. Para ajudar na divulgação, reproduzo por aqui um resumo do que é necessário para a utilização do Drapes em seu ambiente.

Read the rest of this entry »

PostHeaderIcon Revista PC&CIA disponibiliza, gratuitamente, edição 88 em seu site.

A Revista PC&CIA está disponibilizando em seu site, de maneira completamente gratuita, o download da edição no. 88. O arquivo traz parte do conteúdo da revista e dois artigos completos, além das colunas e notícias.

Especialmente nessa edição, tratei, na Coluna Segurança High-Tech, da associação inevitável que existe entre os acontecimentos do mundo real e a vida dos administradores de sistemas e profissionais da área de segurança da informação. É uma continuação do texto "Michael Jackson e a Internet", publicado aqui em meu site.

PostHeaderIcon O desafio: “chmod 000 /bin/chmod”. E agora? O que fazer?

Recentemente, postei em minha página no Twitter o desafio de como resolver o seguinte problema:

"chmod 000 /bin/chmod"

Com esse comando, você está utilizando o chmod, responsável por mudar as permissões de um arquivo, para retirar todas as permissões do próprio comando chmod. Feito isso, ninguém, nem o administrador de sistemas, estará apto a alterar as permissões dos arquivos do sistema utilizando o próprio comando chmod. Diante disso, o que fazer para resolver o problema?

Bem, uma das saidas, utilizando apenas recursos dos comandos do próprio sistema operacional e propriedades dos sistemas de arquivos, consiste em utilizar as permissões de um outro arquivo que tenha o modo de execução habilitado substituindo seu conteúdo pelo do próprio comando chmod. Não entendeu? Então, permita-me explicar um pouco melhor.

Em um sistema de arquivo como o EXT2/EXT3 (e agora o EXT4), por exemplo, os metadados de um arquivo ficam em um local separado do seu conteúdo. Dentre esses metadados estão informações como a data da última modificação, o dono e o grupo do arquivo, seu tamanho e as próprias permissões atribuídas a ele. Em outras palavras, ao substituir o conteúdo de um arquivo, não se altera os atributos tais como as permissões.

Retomando o cenário após a execução do comando "chmod 000 /bin/chmod", o que nos restará é o comando /bin/chmod com essas características:

root@scadufax:~# ls -l /bin/chmod
———- 1 root root 46664 2008-06-26 21:31 /bin/chmod

Como foi dito anteriormente, utilizando o chmod, não é possível, mesmo para o super-usuário, alterar permissões de outros arquivos:

root@scadufax:~# chmod 000 /bin/cp
-su: /bin/chmod: Permission denied

Para resolver o problema, é possível aproveitar as permissões de um arquivo que já tenha privilégio de execução e depois substituir o seu conteúdo pelo o do comando chmod. Para isso, basta pegar qualquer comando do diretório /bin e copiá-lo para um diretório qualquer:

root@scadufax:~# cp -p /bin/cp /tmp
root@scadufax:~# ls -l /tmp/cp
-rwxr-xr-x 1 root root 75492 2009-11-01 09:37 /tmp/cp

Observe que as permissões de execução encontram-se configuradas. Depois, deve-se substituir o conteúdo desse arquivo pelo do comando chmod que não possui quaisquer permissões e copiá-lo novamente para o diretório /bin renomeando-o para chmod novamente:

root@scadufax:~# cat /bin/chmod > /tmp/cp
root@scadufax:~# mv /tmp/cp /bin/chmod
root@scadufax:~# ls -l /bin/chmod
-rwxr-xr-x 1 root root 46664 2009-11-01 09:42 /bin/chmod

Pronto… era isso! Antes de você se perguntar o porquê de tudo isso, eu me adianto: pra NADA a não ser se divertir um pouco e conhecer algo a mais  dos sistemas GNU/Linux e de suas características!

Inicialmente, postei essa questão no Twitter e, pelo menos dois amigos postaram outras soluções. Vou pedir a ambos que postem essas soluções aqui. Se você tiver outras alternativas, registre-as por aqui!

 

PostHeaderIcon Problemas com ACPI no Red Hat Enterprise Linux 5.1.

 

É sempre bom compartilhar problemas… e soluções, é claro! Recentemente, precisei instalar um RHEL 5.1 (Red Hat Enterprise Linux) em algumas estações de trabalho HP Compaq. Logo após o boot com o DVD-ROM de instalação, a seguinte mensagem era apresentada e o sistema ficava "travado":

ACPI: Interpreter enabled
ACPI: (supports S0 S3)
ACPI: Using IOAPIC for interrupt routing
ACPI: PCI Root Bridge [PCI0] (0000:00)

Lembrei de um antigo problema que as versões mais antigas do Red Hat apresentavam para lidar corretamente com o ACPI. Então, tentei iniciar o processo de instalação da seguinte maneira:

boot: linux noapic nolapic

Sem sucesso. O sistema interrompia seu funcionamento com as mesmas mensagens. Depois de algumas outras tentativas igualmente ineficazes, encontrei a solução. Iniciei o processo de instalação com as seguintes opções e tudo funcionou perfeitamente:

boot: linux pci=nomsi,nommconf

Se, de alguma maneira, essa dica puder ajudá-lo algum dia, missão cumprida!

PostHeaderIcon Como gerar números (pseudo)aletórios em um shell script?

Apesar de, na maioria dos casos, os shell scripts serem utilizados para manipular arquivos, agrupar logicamente utilitários comuns do sistema operacional e editar textos (de configuração de aplicativos, por exemplo), é inerente à vida de um administrador de sistemas passar por novos desafios e surpresas.

Dia desses, estava precisando implementar uma nova funcionalidade em um shell script e, seguindo a lógica que havia estabelecido, seria necessária a geração de alguns números aleatórios (ou pseudo-aleatórios, na verdade, já que falar de aleatoriedade em computação não é um assunto tão trivial). Após alguma investigação e depois de conhecer soluções mais "ortodoxas", que comento a seguir, encontrei uma maneira rápida e simples. O mais interessante é que essa alternativa não está amplamente comentada em livros e referências sobre o assunto. Daí o motivo de estar compartilhando essa dica por aqui.

Trata-se de uma variável especial, $RANDOM, existente na bash, que, uma vez acessada, gera como saída um número aleatório. Veja só isso:

  $ echo $RANDOM
  28214

Read the rest of this entry »

PostHeaderIcon Ubuntu 8.04 sem som ?!

Uma das razões pela qual o Ubuntu Linux vem conquistando cada vez mais usuários está no fato de ser uma distribuição bastante voltada ao usuário final. A instalação é simples, o ambiente desktop é intuitivo e simplificado, e o reconhecimento de hardware é automático para uma grande variedade de dispositivos.

Curioso para conferir as novidades da versão 8.04 (Hardy Heron), finalmente, consegui algum tempo para atualizar meu computador. A instalação, como sempre, foi rápida e bem simples. Entretanto, terminado o processo e reiniciado o computador com o novo sistema operacional, tive uma surpresa: meu notebook estava mudo, sem som.

O primeiro passo consistiu em consultar o modelo da placa de som:

# lspci | grep -i audio

00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 03)
Read the rest of this entry »

PostHeaderIcon Seção de dicas e truques criada.

Uma das coisas mais características e fundamentais do software livre está no compartilhamento da informação. Muito se aprende compartilhando experiências e desafios. A partir de agora, sempre que possível, estarei divulgando algumas pequenas colaborações na seção de Dicas e Truques. A idéia não é criar grandes tutoriais e how-to mas, simplesmente, criar apontamentos rápidos e curtos que possam, de alguma maneira, colaborar para facilitar configurações de GNU/Linux, segurança de redes e outros tópicos técnicos relacionados a software livre.

Quaisquer colaborações comentários e novas idéias, serão bem vindas!