Category Archives: shell script

Sistema Operacional miniOS-0.02: Configuração do Ambiente

Ola terráqueos. Voltei.

Estou continuando a serie de posts sobre como fazer um sistema operacional, fazendo o meu proprio sistema.

Agora vou tratar da configuração do ambiente, ou em outras palavras, deixar as ferramentas que não são de desenvolvimento ajustadas para facilitar. Basicamente vamos falar do diretório /tools do nosso projeto.

Quando essa parte do tutorial estiver publicada no meu blog, você já poderão conferir no repositório os fontes dos arquivos.


/tools/boot_qemu.sh

Primeiramente, vamos falar sobre esse arquivo, que vai ser o script que vai ajudar a inicializar o nosso kernel.

Para testar o kernel, eu optei por usar o qemu, que é um emulador de maquinas bem completo e com suporte a virtualização, ou seja, podemos também usar o kernel um uma maquina virtualizada com pouco esforço.

Não vou explicar o script, acho que isso não é necessário, mas a função básica é verificar se o qemu de 32 bits esta disponível no sistema, se não estiver, usar o comando padrão. Depois, se a variável de ambiente estiver sem nenhum valor, ele procurar a imagem do kernel com o nome padrão(“miniOS”) e inicializa o sistema. Como vamos precisar por questões de debug saber o conteúdo dos registradores, esse script vai esperar um tempo para que a maquina levante o sistema e vai mostrar o conteúdo dos registradores.

O objetivo vai se rodar esse comando depois de construir o “executável” do sistema, dentro do diretório central do código fonte.

Originalmente, no tutorial do Bran e em outros, se usa um “emulador” antigo mas que funcionava bem legal, que era o bochs. O bochs é funcional e foi muito usado durante muito tempo, mas ele sempre foi mais difícil de usar, além de ter alguns “bugs” que não me pareciam muito fáceis de lidar… Por isso resolvi usar uma ferramenta mais fácil e moderna, por isso o qemu ;).

Para quem quer usar uma interface, eu recomendo o aqemu. Ele tem a opção de colocar um kernel para dar boot, e fica mais pratico. Não vou abordar isso, tanto porque acho o script mais fácil ^^.

Como sempre, o código agora já esta no repositório.


Make sense: System of a Down

A nova musica do System of Down que um amigo meu aqui me passou.

Eu achei um pouco estranha e divertida a musica, e não entendi muito essa parte de vampiro, mas apreciem ai, talvez eu não entenda a arte:


Gerando chaves SSH para SSH sem senha de forma fácil

O que normalmente é feito

Quando as pessoas querem fazer o seu SSH sem senha, normalmente usam o processo um pouco mais complicado, que é gerar as chaves, copiar para o servidor, adicionar as chaves autorizadas e depois apagar os arquivos a mais.

Esse processo você tem que fazer muitas etapas, além de gerenciar os arquivos, saber o que vai copiar e por ai vai. Tem um método bem mais fácil, mais novo, que o pessoal costuma não usar por desconhecer.

O que uso…

Versão rapidinha que eu normalmente uso:

ssh-keygen -b 8192 -t rsa
ssh-copy-id usuario_remoto@maquina.rede.remoto

Porque só os desconfiados sobreviveram.

O melhor outro método, explicado

Primeiro, tem que gerar a chave da sua maquina, se você ainda não fez.

Só gerar com o comando e aperte “enter” quando pedir senhas:

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/psycho/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/psycho/.ssh/id_rsa.
Your public key has been saved in /home/psycho/.ssh/id_rsa.pub.
The key fingerprint is:
xx:yx:tt:df:67:gh:d0:f4:4r:ty:45:ss:56:89:44:v4 psycho@smallville
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
| *               |
|. *              |
|++ * .           |
|+ . . . S        |
|.... . .         |
|...   .          |
|=.    .+o.       |
|oE.  o==+.       |
+-----------------+

Com isso, você tem que se autorizar na maquina remota. Para isso, faça:

ssh-copy-id usuario_remoto@maquina.rede.remoto
Password:
Now try logging into the machine, with "ssh 'usuario_remoto@maquina.rede.remoto'", and check in:

~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Voilà!! Agora basta dar o seu ssh feliz!


Gerando senhas aleatorias em posix shell script

Cenário

Imagine que você tem que criar uma senha aleatória para um serviço ou para alguma pessoa.

Normalmente, eu usaria uma dica muito boa mesmo dada pelo megalovax Piter Punk, em seu site pessoal.

Só que, se vocês poderem constatar, o programa não usa comandos posix, fazendo com que ele não funcione em todos os lugares. Pensando nisso, quebrei a cabeça uns 5 mins. e resolvi resolver esse pequeno problema.

Solução

Bom, resolvi aqui com isso:

tr -c -d '[:graph:]' < /dev/urandom | dd count=8 bs=1 2>/dev/null  ; echo

Qual as diferencias? Todos os comando acima podem ser encontrados facilmente em qualquer plataforma, principalmente em vários Unix por ai.

Além do mais, editei o meu .bashrc para conter essa definição para facilitar minha vida e gerar as senhas com uma quantidade arbitraria de caracteres:

gerar_senha(){
	qtd_letras=8
	if [ "$1" ] ; then
		qtd_letras=$1
	fi

	LC_ALL=en tr -c -d '[:graph:]' < /dev/urandom | dd count="${qtd_letras}" bs=1 2>/dev/null  ; echo
}

No caso, usei o LC_ALL=en porque gosto de usar senhas com esse locale, além de fazer com que o locale não de erro no programa.


Conversor de documentos via cli com openoffice

Vai a dica, um conversor de documentos usando linha de comando usando o openoffice.

Muito útil se você precisar acessar dados em documento, usando um motor de geração bem famoso e com bastante desenvolvimento.

Eu ainda não usei, mas tem um monte de exemplo na pagina deles:

http://dag.wieers.com/home-made/unoconv/


Meu ambiente de desenvolvimento em 7 itens

A divida sera paga

Ola senhores. Estamos aqui de volta para aprontar muitas confusões. Hoje eu falarei de uma divida que contrai a muito tempo, que o próximo post do meu blog seria sobre um assunto especifico. Muito adiei mais em fim estou aqui. Vamos esclarecer melhor.

Meu ambiente de desenvolvimento em 7 itens

Certo, por causa do Vinipsmaker, que se incluiu nessa brincadeira, eu também tenho que falar sobre meu ambiente de trabalho. Nada muito fantástico e deixando as magias que eu faço, vamos a regras:

  1. Escreva sobre 7 itens de seu ambiente de trabalho – fale sobre qualquer ponto que quiser
  2. Indique de 3 a 5 pessoas para que possivelmente façam um artigo sobre seu ambiente

Eu não vou fazer a ultima regra, pelo simples fato de minha pessoa não ter 3 a 5 pessoas para passar essa corrente. É, ser forever alone é foda, mas é minha vida.

Slackware Linux

Sempre para trabalhar é bom ter um slackware linux para me ajudar e usar. Já usei muitas distribuições(muitas baseadas em rpms, deb, build, lzm e todos os tipos a mais), mas sempre uma questão ou outra me tirava a paz, principalmente na hora de construir pacotes. Então, sempre por motivos práticos, uso o slackware. Com o passar do tempo você acaba percebendo o que é culpa da distribuição ou do software.

No geral, eu podia passar vários parágrafos aqui dizendo o porque é legal utilizar slackware e dizendo todas as configurações que eu faço para segurança, pacotes e coisas assim. Mas, como já sou um velho e não tenho idade para certas coisas, toda vez que eu instalo o slackware, eu só instalo 2 gerenciadores de pacotes(um para binários com dependências, slapt-get, e outro para pacotes baixando código fonte, sbopkg, sem dependência por natureza) e outro pacote de minha autoria que configura o sistema.

Com isso, meu sistema fica configurado com mirrors e tudo mais.

GVIm

Sei que algumas pessoas tem uma ideia errada sobre usar o gvim como IDE para desenvolvimento, então por isso esse paragrafo inicial. Se você acha que o vim tem alguma deficiência que algum editor como o eclipse, Visual ou Netbeans pode ter algum ponto melhor, então você esta enganado. Normalmente, para mudar essa ideia, digo que o vim tem um ambiente de debug para programas nele que não perde para nenhum outro. Se o editor pode ter um ambiente de debug, você não fica curioso para saber o que mais ele pode ter? As possibilidades são infinitas, acredite ;).

Assumindo que o vim é o editor de textos perfeito para seres humanos fisicamente e psicologicamente capazes que tenham 2 mãos ou menos, precisamos de uma interface gráfica para ele poder ser usado como uma IDE, sem que precisarmos decorar todos os comando disponíveis no mundo. O vim sinceramente tem uma boa interface de linha de comando, mas a interface gráfica é necessária para facilitar.

Poderia, mais uma vez, passar horas em parágrafos para explicar como fazer isso, mas alguém(coincidentemente eu mesmo) já fez isso aqui.

Ah, quase ia me esquecendo. Além de tudo, se argumentos técnicos não adiantaram e/ou se você tem mais do que duas mãos, posso dizer que usando o vim eu estou automaticamente ajudando as criancinhas órfãs de Uganda.

autotools

Como eu costumo desenvolver, ultimamente eu tenho que ter na minha maquina o autotools configurado e com algumas extensões. Nada muito complicado, mas só para dar suporte a ter um build bem mais fácil e profissional para os meus programas.

Shell

Eu costumo usar muito shell, mais precisamente bash. Para gerar códigos, automatizar tarefas, filtrar dados e muitas outras coisas que eu perderia muito tempo fazendo sem ser automático. Já gerei até código que era muito automático usando shell.

Bom, tem que ter as ferramentas de shell que eu costumo usar, como rev, tr, mplayer, ident, sed, import, display, dialogs e outras ferramentas. Sempre uteis, elas permitem que eu automatize varias tarefas.

Dev Tools

Sempre tem que ter o gcc instalado, make, ferramentas de debug e todas essas ferramentas de desenvolvimento também de outras linguagens, como python, perl, java e outras coisas.

Como de vez em quando eu costumo usar algumas linguagens estranhas(Expect?), sempre é bom ter a mão essas ferramentas, além das que eu já uso.

E17

Sempre bom ter um ambiente gráfico, melhor ainda um que seja rápido e possa se tornar o que você quiser. Por isso que eu uso o E17, porque ele pode ficar de uma forma que muito me agrada.

Como tenho alguns requisitos estranhos, eu não uso outros :).

Pidgin/Musictracker/MPD/(mplayer|xmms|audacious2|play|…)

Esse item não é muito importante, mas como gosto de escutar algumas coisas e gosto de usar algum mensageiro que coloque o que eu estou escutando agora, normalmente.

Tenho interesse em divulgar os podcast que eu escuto no momento, quando eu escutava no PC mesmo, mas ainda ficou essa minha mania.


Minicurso na semana da computação

Semana da computação

Foi realizado essa semana a primeira semana da computação na UFAL.

Acho isso uma grande iniciativa, o curso de computação precisa de mais eventos como esse que adicionam discussões interessantes e mais assuntos a vida dos estudantes do IC. Apoio muito essas iniciativas a acho muito importante, parabéns aos organizadores!
Infelizmente teve algumas coisas que eu queria ver e não pude :p. Seja por estar preparando o meu minicurso de bash script, ou porque eu o estava “ministrando”. Bom, fazer o que …. C’est la vie.

Falando nisso….

Bom, falando nisso, já devem saber que eu apresentei um minicurso na semana da computação convidado pelo pessoal, só tenho a dizer muito obrigado pela oportunidade.

Como prometi, eu disponibilizei um pacote com toda a apresentação aqui. Para quem não quer baixar 11M, aqui tem a primeira parte da apresentação. E para quem quer a segunda parte, ela esta aqui. Bom proveito :D.

Só tenho a dizer que eu estou sempre aqui para qualquer duvida. Qualquer coisa sempre podem me mandar e-mail ou me contatar por qualquer outro meio.


Obtendo informações do sistema de forma portavel e facil com o getent

Cenário

Imagine que ter acesso a informações do sistema, como grupos, usuários,hostnames, etc…

Cada informação dessa pode ser obtida de forma diferente em sistemas diferentes, podendo se tornar um inferno para o programador, por exemplo, procurar os usuários em uma base de dados do sistema, e depois descobrir que os usuários estão em duas bases de dados diferentes.

Para esses e outros casos, quem programa em shell script tem uma boa alternativa chamada getent. Com o getent, você acessar entradas que estão no banco de dados administrativo do sistema sem depender de qual banco de dados o sistema esta usando.

Bom, e como usamos? Muito simples, o getent é usado da seguinte forma:

getent [Base de Dados] [chave]

Explicando:

Base de Dados: é a base de dados que você quer acessar :p. Se você esta procurando por algum usuário, use o “passwd“. Se você esta procurando pelo nome do host use “ahost“. Algumas das bases que o getent pode suportar são:

ahosts ahostsv4 ahostsv6 aliases ethers group hosts netgroup networks passwd protocols rpc services shadow

chave: Algo do bando de dados. Isso, como vocês podem perceber, varia de banco de dados a banco de dados. Por exemplo, a chave usada no banco de dados do passwd é um usuário. Um usuário também é usado no “shadow“, que fornece as senhas criptografadas do sistema. Mas, no “ahost” que mostra os nomes de cada ip, seria um ip a chave do banco de dados.

A chave filtra o banco de dados, deixando somente o que você precisa para trabalhar. Se você omite a chave, todo o banco de dados é mostrado. Tenha muito cuidado para saber onde você precisa de todo o banco de dados ou apenas uma entrada, para não ficar dando greps a toa no programa.


basename: Tirando diretorio e sufixos de uma string e outras coisas

Voltando ao simples e fácil

Muitas vezes a gente faz coisas porque não sabe que existe, isso em vaias linguagens. Atire a primeira pedra que nunca fez os parses para coisas malucas e depois descobriu que tinha algo já feito :p.

Bom, uma situação muito comum, é querer extrair o nome de um diretório de uma path que você tem ou algo que lembre uma situação assim. Por exemplo:

Você tem:

/home/psycho/teste-1000

E quer obter o nome do diretório sem o path para ele, assim:

teste-1000

Ou você tem um arquivo e quer pegar o nome dele sem a extensão, por exemplo, tento isso:

teste-1000/data-0001.txt

e quer obter algo como:

data-0001

Bom, você pode fazer isso de forma fácil! Existe a função chamada “basename” que faz este tipo de parse para você. Ela esta disponível em “C”, shell script e algumas outras linguagens.

Em “C” ela tem a seguinte assinatura:

#include <libgen.h>

char *basename(char *path);

Em shell script, que eu pretendo me ater mais, ela tem a seguinte assinatura:

basename NAME [SUFFIX]

Caso esse SUFFIX seja fornecido, ele também sera tirado da parte final de NAME.

Usos e possibilidades

Bom, para que usamos e como usamos isso?
Vamos supor que você tem um arquivo, e o nome dele diz uma informação util sobre o programa que você esta executando, então, nesse caso usamos o “basename” para pegar essa informação sem ter que fazer um parser do nome do arquivo:

echo "${FILE}"
echo -n "O processo em execução é: "
basename "${FILE}" .tmp
echo -n "Sem tirar o final: "
basename "${FILE}"
echo -n "Tirando uma parte estranha do final: "
basename "${FILE}" mp

saída esperada:

/tmp/data.343454/job-1234.tmp
O processo em execução é: job-1234
Sem tirar o final: job-1234.tmp
Tirando uma parte estranha do final: job-1234.t

Outro exemplo mais legal que eu precisei recentemente.
Eu tinha uma URL de um arquivo e precisava pegar o nome do arquivo pela URL. Se você pensar direitinho, a URL é o mesmo formato do path de um arquivo, então eu fiz:

echo URL: "${URL}"
basename "${URL}"

saída esperada:

URL: http://10.200.13.100/boot/rootfs-020520010.sqfs
rootfs-020520010.sqfs

Voua-la! Rapidamente consegui extrair o que eu queria e sobrou tempo para eu ir ver o filme do Pelé!

PS:. Antes que alguém comente(se tem alguém lendo isso aqui…), no meu caso as URL são bem definidas e da pra saber o arquivo por elas(nada de HEADERS de HTTP para mudar o nome do arquivo).

Alternativas

Bom, o “basename” é bem simples e rápido, mas ainda é necessário chamar um programa de fora para uma simples função, e isso pode remotamente gerar uma demora em uma ação simples.

Mas caso você seja um “taradinho” por performance( como eu, que preciso de um script que rode no servidor web com muitos clientes 😉 ), existe uma forma mais rápida de fazer.

Se o caminho estiver em uma variável, usando manipulação avançada de variáveis você pode fazer assim o meu ultimo exemplo anterior:

echo URL: "${URL}"
echo "${URL//*\/}"

saída esperada:

URL: http://10.200.13.100/boot/rootfs-020520010.sqfs
rootfs-020520010.sqfs

Ohhhh! Como isso foi feito Mr. M? Bom, substituição avançada com bash script, só digo isso. Fica ai a Dica, falar melhor de variáveis avançado em bash é capitulo para outro post, e esse aqui já ta grande demais ;).


Livro: programação shell linux

Acabei de ler o livro: Programação Shell linux, do vovô do shell script. Eu acabei de ver a 5ª edição, só para esclarecer :p.

Bom, só tenho a dizer que o filme é bem legal. Explica tudo sobre shell script, e ainda de forma bem legal. Veja que eu li a 5ª edição, e já esta na 7ª edição ;).

Explica tudo mesmo, do básico, como variáveis, condicionais e comandos básicos, até coisas muito mais avançadas, como parâmetros, pipes e programas mais avançados.

Só tenho a dizer que gostei muito do livro, e recomendo. Posso dizer que o livro, junto com o livro do Aurélio(Esse eu vou falar depois…), é um tratado final sobre como programar em shell script.

 

Bom, fica ai a dica. Recomendo, e quem quiser eu tenho ;).


%d bloggers like this: