Categorias
Linux

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.

Categorias
Ubuntu

Atualização para o Oneiric

Há algumas horas atrás eu iniciei as atualizações do 11.04 para o 11.10. Contra as sugestões, eu sempre faço a atualização diretamente, ao invés de uma instalação limpa. eu prefiro assim. Gosto de reforçar que, para quem quer, a atualização do ubuntu também funciona. Basta estar disposto.

Uma característica da atualização é que, ao final do download dos pacotes, toda a instalação é feita com o acesso a rede desabilitado. Só após a reinstalação é que a rede retorna.

No meu inspiron 1525 a atualização demorou por volta de 2 horas. Nenhum problema foi relatado e após a reinicialização estava lá o novo 11.10. Demais!

No computador de mesa, um quadcore com 4gb, eu achei que seria mais rápido. Demorou por volta de 3 horas (download e instalações) e no final pipocaram várias vezes erros de atualização do plugin do flash. Penei um pouco para conseguir reiniciar e, após isso, meu usuário principal não consegue carregar a área de trabalho. O outro usuário carrega normalmente, mas meu usuário principal não o faz. Já tentei a reinstalação de alguns pacotes, sem sucesso.

No pavillion dv4 da minha esposa parece ter demorado por volta de 2 horas e meia (engraçado, mas o computador mais fraco foi o mais rápido). Os erros do plugin do flash também pipocaram. Fiquei com medo, mas o reinício foi com sucesso e estava eu com o novo 11.10 também.

Até este momento estou sentindo que talvez a performance seja a mesma, senão um pouco mais lento do que o 11.04. Vamos acompanhar mais um pouquinho.

O erro que ocorreu em todos foi o flashplugin-installer failed.

Foi necessário o seguinte:

sudo dpkg --configure -a
sudo aptitude update
sudo aptitude install flashplugin-downloader
sudo aptitude safe-upgrade

Em um dos computadores eu não conseguia mais acessar à área de trabalho. Para este caso eu precisei instalar o gnome3, que me permitiu usar o sistema.

Categorias
Linux

Convert e mogrify

ImageMagick é tão perene quanto a grama. Encontrado em algum script PHP para aplicações KDE, é uma biblioteca caracterizada pelo processamento e edição de imagens com um batalhão de pequenas ferramentas. Há aproximadamento 100 dessas ferramentas, e duas das mais úteis são convert e mogrify - comandos que rivalizam com recursos do Gimp. Ao usá-las, você pode redimensionar, esmaecer, cortar, ajustar e transformar uma imagem sem precisar olhá-la. A diferença entre convert e mogrify é que com a última você pode sobrescrever as imagens originais ao invés de criar um novo arquivo para a imagem modificada.

Apesar de todas as funcionalidades complicadas, uma das melhores razões para usar convert é a sua função mais óbvia, que é a de modificar o formato de uma imagem. Em sua mais simples, você precisa apenas incluir os nomes de arquivo fonte e destino, e o convert vai se encarregar dos detalhes. O exemplo a seguir converta um arquivo JPEG em um PNG:

convert pic.jpg pic.png

ImageMagick é perfeito para lotes de imagens, mas ele não utiliza coringas da maneira experada. convert *.jpg *.png não funciona, por exemplo. A resposta é usar um sintaxe levemente diferente e substituir o comando convert por mogrify. Ao invés de usar um coringa para o formato de destino, define-se o tipo de extensão que se deseja. Para converter um grupo de imagens JPEG para o formato PNG precisamos digitar apenas o seguinte:

mogrify -format png *.jpg

Esta proximidade pode ser usada com qualquer parâmetro de convert e mogrify. Você pode usar o formato substituto com crop ou scale em um lote de imagens, por exemplo, se você precisar escalar ou cortar um diretório inteiro de imagens.

Mais em Truques de linha de comando.

Categorias
Linux

Ganhando argumentos

Não podemos ensiná-los a ser vitorioso em cada debate, mas podemos mostrá-lo como ser mestre em outro tipo de argumento: os da linha de comando. Você provavelmente conhece como fornecer múltiplos argumentos a um programa, como por exemplo:

someprog file1 file2 file3

O que é muito bom quando informa comandos manualmente, mas e quando precisa usar uma lista gerada por outro programa? Digamos, por exemplo, que você deseja que o Gimp abra dez imagens grandes de um diretório. Você poderia usar ls -l para encontrar quais são os maiores e então ter o trabalho de informar cada nome de arquivo em gimp arquivo1 arquivo2... Ou poderia a mágica xargs (presente em todas as distribuições).

ls -S --color=never | head -n10 | xargs gimp

xargs monta operações complicadas de linha de comando usando lista de arquivos para que você não precise digitá-las manualmente. Passe uma lista de arquivos ao xargs e ele os arranjará como arquivo1 arquivo2 arquivo3... como vimos anteriormente. Faz sentido? Considere o exemplo acima. Primeiro usamos ls para gerar a lista de arquivos do diretório atual (tendo certeza de que desabilitamos os códigos coloridos já que eles produzem caracteres indesejáveis). Então, usando o bom e velho pipe (|), enviamos o resultado para o utilitário head, que separa as primeiras dez ocorrências.

Agora então temos uma lista de dez arquivos. Como informamos ao Gimp que queremos abrí-los? Não podemos enviar diretamente os resultados de head, pois o Gimp interpretaria como se fossem simples dados gráficos. É aqui que o uso de xargs salva o dia: ele garante que o program cujo nome está a a seguir usará os dados como uma lista de arquivos ao invés de tentar trabalhar diretamente com eles. No nosso exemplo acima, ele diz "pegue os dez primeiros da lista gerada pelo head e então passe para o Gimp no formato tradicional arquivo1 arquivo2 arquivo3...". Você pode fazer muitas coisas com xargs, tudo o que esperad uma lista de arquivos, separados por caracteres de nova linha ou espaços. Como outro exemplo, este apaga todos os arquivos com mais de dez dias (use com cautela!):

find . -mtime +10 | xargs rm

Mais em Truques de linha de comando.

Categorias
Linux

Uma lição de history

Enquanto o autocompletar de comandos é um dos aspectos mais usados e adminirados do Bash, uma característica igualmente poderosa normalmente é ignorada. O armazenador de histórico, comumente usado para navegar para trás e para frente pela lista de comandos já executados, oferece muito mais possibilidades que  se pode imaginar. Enquanto é bem simples navegar pela lista, algumas vezes o comando desejado pode estar tão atrás no histórico que acaba sendo inviável. O comando history pode imprimir tudo o que está armazenada na tela. O uso mais óbvio para isso é redirecionar a saída do comando para o grep a fim de encontrar uma parte do comando a lembrar.

history | grep "command"

Se o comando ainda estiver no armazenador ele será mostrado em seguida com a posição que ocupa. O comando pode ser reexecutado através do seu número prefixado com o ponto de exclamação para marcar a posição. Por exemplo, !1016 executaria o comando no ponto 1016 do histórico do Bash. Outro truque é seguir o ponto de exclamação com uma parte do comando executado. O histórico será procurado e quando uma correpondência ocorrer, ela será executada.

!cd executaria o último comando cd que está no buffer. Infelizmente, os comandos não se adicionam ao histórico do buffer, então sua execução recursiva não é possível. Outra maneira de acessar o histórico de comandos é através da função de busca acessa ao pressionar Ctrl-R no terminal. Após pressionar a seqüência você será apresentado a um terminal de busca. Ao digitar o termo de buscar o primeiro comando que corresponder ao critério será exibido e ao pressionar Enter o comando será executado. O cursos esquerda ou direita insere o comando para o terminal, enquanto acima e abaixo lhe direcionam para o comando anterior e posterior, como usual.

Mais em Truques de linha de comando.

Categorias
Linux

Chaves seguras

Dependemos da encriptação para manter nossos dados seguros, mas isto significa ter várias chaves e senhas que devemos nos preocupar. Uma chave GPG tem uma senha para protegê-lo, mas e as chaves do seu sistema de arquivos ou chaves de autenticação SSH? Manter cópias em dispositivos USB parecem uma boa idéia até que você perde o dispositivo e todas as suas chaves se tornam de domínio público. Até mesmo a chave GPG não fica seguro já que é óbvio que ela significa e a senha pode ser quebrada com ataque de dicionário.

Um arquivo encriptado dos seus dados mais sensíveis tem inúmeras vantagens: tudo fica protegido com uma senha (adicionando uma segunda camada de encriptação no caso de uma chave GPG) e disfarça o conteúdo do arquivo. Alguém que encontre o seu dispositivo USB encontraria dados sem conseguir identificar o significado do seu conteúdo. O Ccrypt (http://ccrypt.sourceforge.net) é uma boa opção para fazer isso, pois possui uma encriptação forte e pode ser usado para encriptar fluxos tar, como em

tar -c file1 file2... | ccencrypt >stuff

e extrair com

ccdecrypt <stuff | tar x

Se você realmente quer ocultar seus dados, use o Steghide (http://steghide.sourceforge.net) para esconder os dados com outro arquivos, como uma foto ou arquivo de música

If you really want to hide your data, use Steghide (http://steghide.sourceforge.net) to hide the data within another file, such as a photo or music file

steghide embed --embedfile stuff --coverfile img_1416.jpg

e extrair com

steghide extract --stegofile img_1416.jpg

Mais em Truques de linha de comando.

Categorias
Linux

Matando os zumbis

Se você passa algum tempo olhando para a sua lista de processos, cedo ou tarde vai se deparar com um processo chamado 'defunto' (defunct). Antes de explicar o que é um processo defunto e como removê-lo, segue um resumo de como consultar a tabela de processos usando o comando ps.

Digitar ps ux listará todos os processos atribuídos ao usuário atual e é possível especificar outro nome de usuário com ps U username. Um dos usos mais comuns para ps é de listagem de todos os processos que estão sendo executados no sistema através de ps aux. Quebrando o comando por partes, o a lista todos os processos ao invés de somente os de um único usuário, o u é o nível de detalhes retornados por cada processo e x lista os processos executados pelo daemon não executados por um terminal.

Um processo defunto é um processo iniciado por outro processo (o pai), mas que foi finalizado antes que o processo pai tenha sido completado. Isso pode acontecer se o processo pai ficou pendurado ou quebrado.

Os processos defuntos são também conhecidos por zumbis e listados com status 'Z' na saída do ps. Eles não são tão destrutivos quanto os mortos-vivos, já que eles não consomem quase recurso do sistema, mas em um sistema que está sempre ativo, como um servidor, eles podem se tornar distrativos. O segredo para matar um processo defunto é primeiro matar o pai, que estará listado na saída do ps adicionado de -l para grandes retornos. Os processos pais podem ser identificados através da coluna PPID ao invés da coluna PID, a coluna com o ID do processo. Esses são identificadores anexados a cada processo executado no seu sistema. Eles podem ser mortos usando outro comando no shell, kill -9, seguido do PPID. Obviamente, isto irá parar a tarefa pai, então se certifique primeiro de que a tarefa não é essencial. Uma vez que a tarefa pai tenha sido morto, o processo init do sistema deverá enviar o sinal correto aos processos defuntos, que devem terminar automaticamente.

Mais em Truques de linha de comando.

Categorias
Linux

Melhor que navegador

Se você precisa freqüentemente recuperar páginas da internet e achá-lo com um navegador é como usar uma marreta para quebrar um ovo, então o wget é para você. A página de informação descreve soberbamente a utilidade para download não-interativo de arquivos da internet; mas o que eles querem dizer é que às vezes ele funciona melhor do que um navegador. Você pode usar o wget num código para fazer download de páginas ou arquivos e ele é perfeito para sincronizar aquivos locais da web. Você não precisa nem utilizá-lo a partir de um script - ele funciona muito bem quando executado diretamente do terminal (http://wget.sunsite.dk).

O mais simples uso do wget é para baixar um arquivo pela URL:

wget http://localhost/somefile.tar.gz

Isto deve mostrar uma barra de download em formato texto. Infelizmente, se o site usar o protocolo HTTP, wget não suportará coringas, então, você não pode usar *.gz para fazer download múltiplo de arquivos (mas pode usar se o site é acessado por FTP). wget é bastante usado para espelhar um site inteiro. Por exemplo:

wget --mirror -p --html-extension --convert-links http://localhost

Wget atravessa todo o site e baixa o conteúdo no diretório atual. O argumento mirror habilita opções adequadas para espelhar um site - em particular, recursão por atravessar a árvore completo do site. htmlextension é usada para sites que usam também scripts CGI para gerar HTML, ou arquivos ASP que precisam ser renomeados depois de baixados. Se wget reconhecer o conteúdo, ele apenas acrescenta a extensão HTML.

Terminada a transferência, wget varre todos os arquivos locais para trocar qualquer referência remota para que o site possa ser visto desconectado.

Mais em Truques de linha de comando

Categorias
Linux

Evitando múltiplos terminais – Trabalhando com telas

Terminais virtuais são como crianças: ter um, dois ou até três trazem alegria à sua vida, mas mais do que isso põem tensão nos seus recursos. Quando trabalhando remotamente, algumas pessoas se vêem sem a possibilidade de abrir múltiplos terminais, então simplesmente abrem várias conexões SSH na mesma máquina. Isto não é apenas um desperdício de tráfego, mas também um sinal de que você é um iniciante - o que você não é, certo? Veteranos sabem que há uma maneira muito melhor para abrir múltiplos terminais e isso vem na forma do programa de telas GNU. Para começar, abra um terminal, digite screen e tecle Enter. Seus terminal será substituído por um console vazio e você pode pensar que nada aconteceu, mas na verdade aconteceu - como você verá.

Digite qualquer comando que quiser, ex: uptime, e tecle Enter. Agora pressione Ctrl+a depois c e você poderá ver outro terminal em branco. Não se preocupe, seu antigo terminal ainda está lá e ainda ativo; este é um novo. Digite outro comando, ex: ls.

Agora pressione Ctrl+a depois 0 (zero) - você verá seu terminal original novamente. Como você pode ver, Ctrl+a é a combinação que sinaliza que um comando está para vir - Ctrl+a depois c cria um novo terminal e Ctrl+c depois um número o leva ao respectivo terminal. Você pode usar Ctrl+a depois Ctrl+a para trocar para a janela selecionada anteriormente, Ctrl+a depois Ctrl+n para trocar para a próxima janela ou Ctrl+a depois Ctrl+p para trocar para a janela anterior. Para fechar janelas apenas digite exit.

Quando sua última janela fechar você também sairá do screen e será impresso na tela 'screen is terminating' para lhe lembrar. Como alternativa - e isto é o melhor coisa sobre tela - você pode pressionar Ctrl+a depois d para desanexar sua sessão de tela. Depois, de outro computador mais tarde, utilizar screen -r para recuperar de onde deixou com todos os programas e saídas intactos - mágico!

Mais em Truques de linha de comando

Categorias
Linux

SSH pelo proxy

Túneis criptografados são uma maneira útil para estabelecer uma conexão segura entre seu computador local e uma máquina remota ou servidor. Se você usar VNC, a máquina cliente remota, provavelmente você está usando um túnel; uma técnica sensível pe utilizar SSH, que é mais comumente empregada para logins remotos.

Um dos melhores usos de túneis SSH é o acesso ao Webmin, a ferramenta de configuração remota que é executada num servidor web. Você pode mudar quase tudo em seus sistema usando o Webmin, então não é inteligente deixá-lo aberto à internet. Mas se você desabilitá-la, você perde a possibilidade de configurar sua máquina. Você pode dar um jeito nisso através de túneis SSH pela porta que o Webmin usa para sua máquina local, como abaixo:

ssh -L 8090:localhost:10000 remotehost

Apenas aponte o servidor web em https://localhost:8090 para conectar ao servidor Webmin remoto. Você pode também encaminhar um serviço proxy usando SSH. Se você estivesse em uma localização onde não é possível acessar o Google ou o eBay, por exemplo, você pode criar um túnel para o servidor proxy e navegar de lá. Muitas distribuições incluem um servidor proxy, como o Squid. É preciso que seja instalado e ativo na máquina remota primeiro. Squid utiliza a porta 3128, então o comando para o túnel com o Squid seria algo como:

ssh -L 8090:localhost:3128 remotehost

Então é apenas uma questão de configurar seu navegador para usar localhost:8090 como o servidor proxy, e todas as subsequentes requisições serão passadas através do túnel SSH. Usar um servidor proxy desta maneira possibilita que você conecte a outras máquinas no proxy da rede local, como 192.168.1.1 o que também inclui serviços como configuração de servidores roteadores.

Mais em Truques de linha de comando