Ressureição de Lázaro

É horrível quando recebemos uma mensagem como

No usable partitions/No OS found

da útil entrada da BIOS. Normalmente temos alguns segundos para perceber – seu disco rígido falhou, ou está falhando, e não há mais boot para o sistema operacional. Há várias razões para que isso aconteça e cada uma com seu potencial de causar perda de dados. Com um disco rídigo quebrado você perder tudo. Mas isso também pode ser apenas o resultado de um carregador de boot com erro ou a instalação de uma distribuição superzelosa. Nestes casos, há uma boa chance de que seus dados sobreviveram intactos – mas o que você faz? Os que periodicamente armazenam backups dos dados podem se sentar, sorrir levemente e restaurar seu trabalho suado pelo último backup. Apesar de saber o quão importante é isso, muitos de nós nunca conseguem reservar tempo para fazer backup dos dados que passamos a vida reunindo. Se há um bom momento para um Live CD Linux entrar em ação, é este.

Os Live CDs são equipados com ferramentas que podem ser usadas para ressuscitar discos rígidos, e muitas das ferramentas Linux rivalizam quando não ultrapassam as funcionalidades da maioria das soluções comerciais. A primeira coisa a fazer é montar o disco perdido a partir do Live CD.

Sugeriríamos usar o PCLinuxOS que muitas vezes é considerada a melhor distribuição atual para encontrar e montar partições problemáticas. Ele também faz um bom trabalho para encontrar partições NTFS do Windows no mesmo disco. O PCLinuxOS detectará automaticamente tudo que encontrar e os montará na área de trabalho. Você deve estar pronto para copiar os dados em um local seguro. Se isto não funcionar, sua salvação será digitar testdisk do console do root.

Testdisk é uma das ferramentas mais subestimadas, mas que pode realmente fazer a diferença entre perder ou manter tudo. É prefeito para restaurar gravações na MBR ou para reconstruir tabela de partições.

Mais em Truques de linha de comando.

Matando o tempo

Uma vez que você comece a usar a linha de comando, usa ps time para gerenciar sua lista de processos. Digitar apenas ps listará os processos que pertencem à sessão atual e que, a não ser que você esteja executando alguma coisa em segundo plano, serão apenas dois: o shell do Bash (se for a sua escolha) e o próprio comando ps. Não há muito uso: a maioria das pessoas usa ps ux para ver todos os processos próprios e ps aux para listar todos os processos do sistema.

É fácil encontrar processos que está procurando passando o resultado de ps para o grep, como em ps aux|grep firefox. Para processos zumbis, tipicamente sai-se à caça dos processos quando o comportamento estranho é iniciado antes de chamar kill -9 pid para matar o ofensor. pid é o número de identificação do processo como informado pela saída do comando ps.

Mas há outra opção – usar o comando pidof para pegar o ID de um processo que você sabe que está executando. Usando o Forefox como um exemplo, basta digitar pidof firefox. A saída será semelhante a:

pidof firefox
18380 18021 24825 13081 6478 6473 6472

Isto significa que há sete instâncias do Firefox executando no momento e cada número é o ID de processo de cada instância. O maior número é o processo mais recente. Por exemplo, você poderia matar o último Firefox em execulção com kill -9 18380.

Um dos aspectos mais úteis de pidof é que você pode usá-lo para trabalhar com o identificador do processo quando não pode manualmente manipular a saída do ps. É perfeito para scripts que precisam encontrar e matar um processo ou talvez dá-los uma maior ou menor prioridade sem perder tempo procurando pela saída do ps·

Mais em Truques de linha de comando.

Brincando com o horário

Quantos das suas máquinas gerenciam para negociar com sucesso a transição da luz do dia em outubro? É importante, porque há mais que ter tempo do que o simpático relógio situado no canto do painel da sua área de trabalho – seu sistema é regulado para executar algumas coisas em certos horários. Seja o horário registrado num e-mail enviado ou data e hora de um arquivo, tudo depende do relógio do seu sistema.

O caminho mais simples de verificar o relógio do seu sistema é usar o comando date. Quando date é executado na linha de comando, você recebe uma linha que contém o dia e a hora em forma abreviada. Você pode usar este formato de saída para definir dia e hora como entrada de um comando date, mas isso é facilmente configurável. Muitas opções podem ser usadas para entrar ou sair com alguma coisa pelo horário em nanosegundos do século presente.

O último campo da saída do comando date lhe dirá em que fuso horário sua máquina está configurada. Se você estiver no Brasil espera-se que você veja ‘BRST’ para Brazillian Summer Time (horário de verão do Brasil) nesta época do ano. O arquivo de configuração pode ser mapeado para /etc/timezone, que contém uma descrição para sua localização. Para BRST, será algo como ‘America/Sao_Paulo’. Se estiver errado, você pode escolher um fuso horário mais adequado em /usr/share/zoneinfo/directory. Este diretório inclui uma lista dos lugares mais populares para se viver no planeta ordenados por continente e país.

Há dois relógios no seu sistema. Um é o relógio do sistema, que é o que é examinado por date. O outro é o relógio do hardware. Este reside na BIOS do seu sistema e mantém o horário enquanto seu computador está desligado. O relógio do sistema pega o horário do relógio do hardware como parte do processo de boot. Você pode consultar e definir o relógio do hardware usando o comando hwclock, digitando:

hwclock --systohc

você define o relógio do hardware para o mesmo horário do relógio do seu sistema.

Mais em Truques de linha de comando.

Redirecionando o Editor

Se você usa uma distribuição baseada no Debian, como o Ubuntu, já se perguntou para que serve o misterioso diretório /etc/alternatives? Se você olhar o conteúdo, verá que está cheio de alguns dos comandos de sistema mais conhecidos. Mas se você olhar de perto, cada arquivo é na verdade um link simbólico para a localização real do comando em algum lugar do sistema. Este diretório está cheio de links porque os desenvolvedores originais do Debian não queriam assumir que uma ferramenta seria usada sobre qualquer outra. Eles usaram o utilitário cron para destacar o problema.

O Cron é usado para agendar evento a serem executados em certos dias e horários e ele faz isso abrindo um editor de texto de onde você necessitar para que você adicione seus próprios trabalhos. Mas a grande questão para os desenvolvedores do Debian era ‘Qual editor de texto?’. Para os usuários do Linux não há resposta fácil e é uma pergunta que gera guerras infindáveis e gasta-se muito tempo para ter alguma resposta definitiva. Enquanto uns preferem Emacs, Vi ou Nano, a obrigatoriedade de escolher um a outros sempre causará problemas.

A solução foi /etc/alternatives. Se você digitar cron no Ubuntu, o sistema carregará o bem amigável editor Nano. Mas se você olhar com atenção, cron está na verdade executanto o editor de comando localizado em /usr/bin que é, por sua vez, um link para /etc/alternatives/editor.

Como você já deve estar imaginando, este arquivo é um link para o editor real – neste caso, é /usr/bin/nano. É um passo seguro o recurso de escolher qual editor selecionar dentre todos que você tem como editor padrão quando basta trocar o link para apontar para o seu editor favorito no lugar do Nano. Há até um comando que pode executar esta tarefa para você. Digite update-alternatives --set editor /usr/bin/vim para trocar o editor para o vim, por exemplo. Você também pode listar os editores disponíveis uisando o parâmetro -display editor ou exatamente o mesmo para todos os outros comandos que estão localizados no diretório /etc/alternatives.

Mais em Truques de linha de comando.

Resolvendo resolv.conf

Ter mais de um dispositivo de rede pode lhe trazer problemas de prioridade. Normalmente apenas um dos dispositivos tem acesso à internet. Qualquer dispositivo de suporte compartilha a conexão ou serve dados guardados numa máquina atrás de um firewall. O problema é que o cartão sem conexão à internet pode ter prioridade sob o cartão que tem conexão à internet. Isso acontece quando ambos os cartões de rede são conectados a outras máquinas ou roteadores que atuam como servidores DHCP independentes e provêem informações conflitantes. O resultado é que os pacotes de rede destinados para a internet são roteados através do dispositivo de rede errado, cancelando a conectividade.

O problema geraldomente pode ser rastreado com um simples arquivo de configuração, /etc/resolv.conf. É aonde o seu sistema pega o endereço do servidor de nomes que é necessário para traduzir o nome do servidor legível por humanos (como rafael.bernard-araujo.com) para o endereço IP que a rede entende (208.65.202.206). Se o servidor de nomes não puder traduzir o endereço, não será possível acessar a internet usando nome de servidores, mas você pode usar o endereço IP para navegar.

É possível resolver o problema editando o resolv.conf adicionando o endereço IP do servidor de nomes do seu provedor de internet. Ainda assim, depois de uma ou duas horas a conexão pode ser interrompida. Ao olhar o resolv.conf novamente o nome dos servidores de nome estarão trocados. Um cliente DHCP está sendo executado em sua máquina e tentando determinar as configurações de conexão de tempo em tempo. O problema é que este cliente está priorizando a o cartão de rede errado e sobrescrevendo o endereço do servidor de nomes no resolv.conf.

É por isso que a solução pode ser encontrada em /etc/dhcp3/dhclient.conf. Para adicionar os servidores de nomes corretos, abra o arquivo no editor de texto e adicione servidor-de-nomes-do-dominio ipDoServidor. De agora em diante, este endereço será sempre adicionado em primeiro lugar no seu resolv.conf, antes de qualquer configuração equivocada de um servidor DHCP. Tudo ajustado.

Mais em Truques de linha de comando.

Simples teste de falha

Há algumas vezes em que um processo de segundo plano que você confia silenciosamente falha, o que é difícil de detectar e corrigir. MythTV, por exemplo, depende de um servidor em segundo plano para gravar programas de televisão. Se o servidor falhar as gravações serão perdidas. Certo, então em primeiro lugar ele nunca deveria falhar, mas enquanto os desevolvedores se ocupam em corrigir os erros na aplicação, tudo o que podemos fazer é reiniciar o processo automaticamente.

O truqye é executar um processo que você quer reiniciar a partir de um script simples. Se ele falhar, o controle retorna ao script, que pode iniciá-lo novamente. Isto pode ser feito por um laço. Não é grande programação, mas funciona.

while true;
do
mythbackend;
done

A beleza disso é que, quando mythbackend falha, o laço while simplesmente inicia-lo-á novamente. Podemos fazer o script um pouco menos cru adicionando a verificação se mythbackend está em execução. Precisamos apenas contar o número de instâncias dos processos, o que fazemos pelo grep no retorno no número de instâncias do processo encontrados com ps. Se o mythbackend está mesmo em execução, o número de instâncias será um valor diferente de zero, o que testaremos através de um if.

Finalmente, com o script escrito, precisamos ter certeza de que ele não encerrará a si mesmo. Fazemos isso executando-o a partir de um shell com o comando hangup, nohup scriptname &.

#!/bin/bash
mcount = 'ps ax | grep "mythbackend" | grep -v grep | wc -l'
if [$mcount == 0]; then

#! Insert 'while true' code here
else
exit 1
fi

Mais em Truques de linha de comando.

Renomear e prenomear

Na linha de comando, não conhecemos tanta gente que não utiliza o comando mv para renomear um arquivo ou diretório. É na maioria das vezes a maneira mais rápida para organizar arquivos, apesar de que pressionar F2 na maioria dos gerenciadores de arquivos vai lhe permitir fazer a mesma coisa.

As letras ‘mv’ são na verdade o diminutivo para ‘mover’ – uma descrição mais acurada do que esta ferramenta realmente faz, pois o caminho faz parte do que você quer renomear. Isso significa que você pode digitar mv /usr/bin/sux /sbin/sux não vai trocar, na verdade, o nome do arquivo, mas movê-lo do diretório /usr/bin para /sbin. É claro que você poderia ainda renomear o arquivo caso assim desejasse, talvez movê-lo para um diretório de backup e adicionar a extensão _bak. O comando é flexível o suficiente para renomear e mover arquivos simples ou diretórios, mas mv não provê isso mais de uma vez e isso se torna tedioso rápido se você precisa modificar mais do que simples arquivos.

Ainda bem que Larry Wall à mão para salvar o dia outro comando que comumente acha instalado na maioria das distribuições Linux. O comando é normalmente chamado de rename, mas você já deve ter visto alguma coisa chamada prename se rename é usado por alguma coisa no seu sistema. Como você deve ter imaginado, se Larry Wall tem algo com isso, deve ser um script Perl. Você pode até mesmo abrir arquivos com um editor de texto e verificar por si mesmo.

A coisa boa sobre prename é que é tão incrivelmente flexível para renomear grupo de arquivos. Mas é esta flexibilidade é graças ao poderoso analisador de expressões regulares do Perl que não é todo intuitivo se você é novo com expressões. Por exemplo, para adicionar _bak ao fim de cada arquivo começando com arquivo, você digitaria:

prename 's/\_bak$//' file*

Mas isso é apenas o começo e depois que você dominar o processo de gerar expressões regulares, você pode alcançar virtualmente qualquer tarefa de renomear/mover com prename – é especialmente útil para trocar nome de imagens em caixa alta que provém do windows para caixa baixa no Linux.

Mais em Truques de linha de comando.

Linux sux

Na maioria das vezes, as pessoas usam su na linha de comando para se concederem privilégios de administrador de maneira que possam editar um arquivo de configuração importante. Mas também é possível encontrarmos usando su quando se está trabalhando no console e é preciso usar uma aplicação gráfica. Quando você tenta executar uma aplicação gráfica enquanto está autenticado com um usuário diferente, você recebe o seguinte erro:

Xlib: connection to ":0.0" refused by server.

O problema é que as chaves usadas para autenticação em sessões X não são válidas quando se usa um usuário diferente. Esta medida de segurança parece zelosa demais, mas é uma herança do sistema de um tempo em que as sessões X foram desenhadas para ser executadas através da rede. Há duas respostas para este problema.

A primeira é ter certeza de que a nova conta pode ser autenticada no servidor X. Isso utiliza o comando xhost para autenticação de novos usuários na janela da sessão X local. Apenas digite xhost +local:local com o usuário normal antes de trocar para o novo usuário e você verá ‘non-network local connections being added to access control list’ como saída. Agora é possível que você rode qualquer aplicação gráfica na mesma tela em que trocou de usuário. Se você quer ter este recurso a cada vez que você executa sua sessão X, simplesmente adicione o comando xhost ao seu arquivo .bashrc: ele será executado automaticamente a cada vez que você abre um terminal Bash.

A segunda solução é ainda mais fácil. É a substituição do comando su que transfere suas credenciais X para uma nova sessão automaticamente. O comando é sux, que você precisará instalar manualmente pelo gerenciador de pacotes da sua distribuição. Uma vez instalado, digite sux novousuario para trocar para o usuário com o qual você quer usar a visão X. Você perceberá que pode executar aplicações gráficas pela nova sessão sem nenhuma configuração adicional.

Mais em Truques de linha de comando.

Mensagens de texto

Como sabemos, computadores existem para fazer as tarefas monótonas com as quais não queremos nos incomodar. Isto significa que coisas como adicionar ou subtrair números, desenhar coisas em cores bonitas e lembretes a seus mestres todo-poderosos de anotações a vir. Há dúzias de aplicações que têm a função de lembretes e que acionam uma tela chata com pequenas mensagens informando que você está atrasado para o dentista. Mas você realmente não precisa de uma: você pode exatamente o mesmo tipo de funcionalidade usando um casal de comandos do bom e velho terminal. Os comandos em questão são at e xmessage.

O comando at é uma das ferramentais mais essenciais aos usuários que circulam de um ponto a outro. Em essência, você digita 4:57 pm today na linha de comando e o at abrirá um editor de texto primitivo. No editor, você simplesmentes adiciona cada comando que deseja executar às 4:57 e pressiona Ctrl e D para indicar o final do arquivo. Cada comando deve parecer exatamente como seria na linha de comando e você pode até usar formatos diferentes para hora, como 1657 para formato 24 horas ou também ‘now + 2 hours‘, ou ainda especificando o dia como ‘Saturday‘ ou ‘tomorrow‘.

O comando que precisamos para emitir a tela do alerta é xmessage. É uma ferramenta muito simples que data dos primeiros anos das janelas X e simplesmente abre uma pequena tela no seu monitor que inclui uma mensagem de texto e um botão para fechar. A sintaxe do xmessage seria:

xmessage -display :0.0 "You are late"

A parte ‘display‘ do comando é importante porque permite ao xmessage saber qual monitor deve ser usado. Se você adicionar o comando ao at, você tem uma maneira flexível de criar lembretes para si mesmo sem necessidade de recorrer a uma outra aplicação. É ainda mais fácil que usar o Cron, que pode ser desencorajador quando você que simplesmente executar algo como xmessage!

Mais em Truques de linha de comando.

Avante com o Bash

O terminal do Bash é uma das coisas que as pessoas menos se dão o direito de modificar. Isso é estranho, pois é é uma simples questão de alterar o texto de cumprimentos quando você abre o shell para algo mais útil. O terminal do Bash é usado pela maioria das distribuições como o nome de usuário seguido do domínio (rafael@dollar, no meu caso).

A chave para alterar o terminal repousa em variáveis dinâmicas, o que lhe permite incorporar informações ao terminal. Para criar o terminal usuário/domínio que muitas distribuições usam você poderia digitar o que está a seguir (ou adicionar ao ~/.bash_profile ou ~/.bashrc para tornar permanente):

export PS1="[\u@\h]$"

O comando export define a variável de ambiente PS1. Ela é usada para o valor do terminal, que é o que está contido entre as aspas após o símbolo de igual.

Este valor é feito de duas varíaveis dinâmicas em ambos os lados do @; \u> exibe o nome do usuário, enquanto \h insere a primeira parte do nome do servidor. O Bash inclui outras variáveis dinâmicas, incluindo \w para o atual diretório de trabalho, \d para a data atual ou \! para a posição atual no histórico do buffer. Se elas parecem familiares é porque são seqüências de escapa, encontradas em várias aplicações e linguagens de programação e usada para formatar strings.

Há outras seqüências, como as que se seguem, que trocam o nome da janela:

"\e]2;title\a"

Houve um tempo em que a impetuosidade do hacker seria o medida por quão obtuso e complexo era o comando do terminal e não há realmente um limite para o que você queira adicionar. Muitos usam laços condicionais simples para trocar o conteúdo do terminal no momento em que uma sessão do shell é iniciada, mas usando simples seqüências de escape é fácil de trocar o terminal padrão para algo mais útil.

Mais em Truques de linha de comando.