segunda-feira, 2 de agosto de 2010

Um pouco sobre Telnet, SSH e Tunelamento

Telnet é um protocolo de comunicação cliente-servidor nascido em 1969, com a finalidade de permitir a comunicação entre computadores ligados em rede. Por ter sido concebido quando a computação era mais presente em universidades do que em empresas, a segurança não era algo que preocupasse, o que gerou um protocolo inseguro. Já o SSH data da década de 90, quando a preocupação com a integridade da comunicação começava a ganhar força, o que gerou um protocolo que, através do método da criptografia de chave-pública, era capaz de autenticar o computador remoto. Descobrimos assim a grande diferença entre Telnet e SSH. O primeiro não possui criptografia, tornando impossível saber se a "conversa" entre os computadores foi interceptada e/ou adulterada.

Tunelamento é um protocolo que permite o tráfego seguro de dados em uma rede não confiável. Pode ser feito via SSH, permitindo assim o tráfego de dados não-criptografados por um "túnel" criptografado.

Operadores de redirecionamento

Pipe:


Utilizado para redirecionar a saída de um comando bash para a entrada de outro comando bash. É denotado pelo caractere ' | ' (barra) .

Exemplo: Procurar, no arquivo contendo as verdades sobre Chuck Norris, uma em especial.

cat ChuckNorrisFacts | grep universe

O comando acima redireciona a saída do comando cat, que consiste no conteúdo do arquivo ChuckNorrisFacrs, para a entrada do comando grep, que retorna as verdades sobre Chuck Norris que contenham a palavra universe.


"We live in an expanding universe. All of it is trying to get away from Chuck Norris."

Operadores < (menor), >(maior) e >> (append) :

Utilizados para redirecionar tanto entrada quanto saída, já foram citados aqui. .



Vi

O Vi é um editor de texto criado em 1976 para o Unix, estando presente até hoje (em versões melhoradas) em alguns sistemas operacionais, como por exemplo Linux e Minix. Dono de um manuseio muito diferente dos editores atuais (uma vez que não existe uma interface gráfica exibindo todas as opções de edição disponíveis), possui dois modos de operação: o modo de inserção e o modo de comando. Vamos conhecer melhor agora como esta ferramenta funciona.


Ao executarmos o Vi, ele inicia no modo de comando (onde o que for digitado pelo usuário será interpretado como um comando de edição do conteúdo do arquivo), podendo ir ao modo de inserção (onde o que for digitado pelo usuário será interpretado como um acréscimo de texto ao conteúdo do arquivo). Para alternar entre os modos, utilizam-se as teclas 'Esc', que sai do modo de comando para o modo de inserção, e 'i' que sai do modo de inserção e vai para o modo de comando. Agora que sabemos os diferentes modos, para que eles servem e como alternar entre eles, veremos alguns comandos.

Para inicializar o Vi:

vi arquivo Inicializa a edição do arquivo especificado. Caso o arquivo não exista, um novo arquivo é criado.

vi -r arquivo Recupera o arquivo que estava sendo editado caso o sistema "caia".

Para sair do Vi (modo de comando):

:q Sair do Vi.

:q! Sair do Vi sem salvar.

:wq Salvar e sair do Vi.

:x Salvar e sair do Vi.

Comandos delete (modo de comando):

u Desfazer a última alteração feita (undo).

x Deletar caractere.

dd Apagar a linha inteira.

[shift]+d Apagar da posição atual do cursor até o final da linha.

Movendo o cursor:

O vi, ao contrário dos editores de texto atuais, não permite mover o cursos através do mous. A seguir, alguns comandos utilizados para esta finalidade:

j Move o cursor uma linha para baixo. (modo de comando)

k Move o cursor uma linha para cima. (modo de comando)

h Move o cursor um caractere para a esquerda. (modo de comando)

l Move o cursor um caractere para a direita. (modo de comando)

:número Move o cursor para a linha de . (modo de comando)

:$ Move o cursor para última linha do arquivo. (modo de comando)

w Move o cursor para o início da próxima palavra. (modo de comando)

b Move o cursor para o início da palavra anterior. (modo de comando)

[shift]+A Move o cursor para o final da linha atual. (modo de inserção)

[shift]+I Move o cursor para o início da linha atual. (modo de inserção)

Pesquisas no conteúdo (modo de comando):

?texto Procura, do cursor para trás, o texto especificado.

/texto Procura, do cursor para frente, o texto especificado.

%s/textoAntigo/textoNovo Procura por todo o arquivo pelo texto antigo, substituindo as ocorrências pelo novo texto.

sexta-feira, 30 de julho de 2010

Comando Find

Como o próprio nome já diz, o comando find serve para localizar arquivos dentro do sistema. A pesquisa pode ser feita através de diversos critérios, alguns serão especificados abaixo:

-name [parâmetro] Procura por arquivos através de seu nome.
-type [parâmetro] Procura por arquivos através de seu tipo.
-size [parâmetro] Procura por arquivos através de seu tamanho.

O comando find é definido sintaticamente por find [caminho] [expressão], onde [caminho] seria o caminho absoluto ou relativo do diretório que servirá de ponto de partida e [expressão] seria o critério a ser utilizado. Exemplos:

find -name "*.txt" Lista todos os arquivos em formato txt existentes no diretório atual.

find /tmp -name "*.log" Lista todos os logs existente no diretório /tmp.

É possível realizar pesquisas com mais de um critério, para isto servem os operadores lógicos ou (-o), e (-a), negação (-not). Caso mais de um critério seja especificado e nenhum operador seja usado, o operador lógico usado será o -a. Exemplos:

find -name "*.txt" -name "RTFM*" Equivalente a find -name "RTFM.txt"

find -name "*.txt" -not -name "RTFM*" Procura por arquivos de texto que não sejam o "RTFM.txt"

É possível acrescentar ações ao find, gerando assim uma espécie de automação. Apenas uma ação pode ser adicionada ao final e caso seja necessário executar mais de uma, é possível executar um script. Existem diversos tipos de ações que podem ser tomadas, segue abaixo alguns exemplos:

find -empty -delete Deleta arquivos do diretórtio atual e sub-arquivos que estiverem vazios.

find -type f -exec MeuScript '{}' \; Executa sobre todos os arquivos do diretório atual os commandos descritos em MeuScript.

Existem diversos critérios de pesquisa, bem como ações que podem ser tomadas. Para ter acesso a todas, basta usar o comando man find.

Ordenando e buscando registros únicos

Um autor teve a idéia de atualizar seu blog com os famosos Chuck Norris Facts. Como o conteúdo de sua "postagem" já é algo muito difundido na web, ele pediu a colaboração de seus leitores que poderiam enviar para ele um arquivo contendo as frases. Passada uma semana, o autor possuía uma dúzia de arquivos e resolveu então, através de comandos bash, unir todos em um único arquivo. Concretizada a junção, ele resolveu verificar as frases e reparou que muitas eram idênticas, algo inadmissível. Abaixo, um trecho demonstrando as verdades sobre Chuck Norris obtidas:

[...]

Chuck Norris will never have a heart attack. His heart isn't nearly foolish enough to attack him.

Outer space exists because it's afraid to be on the same planet with Chuck Norris.

Chuck Norris played Russian Roulette with a fully loaded gun and won.

[...]

Outer space exists because it's afraid to be on the same planet with Chuck Norris.

[...]

O autor lembrou de um comando que filtrava o conteúdo de um arquivo eliminando as repetições, o uniq. Porém, as entradas para o comando precisam estar ordenadas, algo a ser resolvido através do comando sort. O sort é um comando que basicamente ordena arquivos texto (por padrão, do menor para o maior), possuindo também as funcionalidades de informar se um arquivo já está ordenado (-c) ou juntar dois ou mais arquivos previamente ordenados(-m). Existem diversos critérios que podem ser estabelecidos quando realizamos a função sort, abaixo alguns deles e a sintaxe do comando:

sort [opções] [arquivo]

-d Considera apenas letras, dígitos e espaços em branco ao ordenar.

-n Ordena numericamente.

-r Ordena do maior para o menor.

Após executar a ordenação, o autor então fez uso da função uniq. Abaixo, algumas opções e a sintaxe do comando uniq:

uniq [opções] [arquivo]

-i Para ignorar se a letra é maiúscula ou minúscula.
-d Imprime apenas as linhas duplicadas.
-c Junto com cada linha, imprime a quantidade de ocorrências.
-u Imprime apenas as linhas únicas (default).

Finalmente, o autor obtém uma lista contendo as verdades sobre Chuck Norris sem ter sentenças duplicadas:

[...]

Chuck Norris will never have a heart attack. His heart isn't nearly foolish enough to attack him.

Outer space exists because it's afraid to be on the same planet with Chuck Norris.

Chuck Norris played Russian Roulette with a fully loaded gun and won.

[...]

quinta-feira, 29 de julho de 2010

Redirecionamento de E/S

Programas que exigem interação com o usuário funcionam como uma espécie de diálogo entre usuário e computador. Todo usuário precisa comunicar-se de alguma forma, sendo o teclado o meio de expressão. Um diálogo seria uma conversação entre duas ou mais pessoas, logo o computador precisa participar da conversa e para tanto utiliza o monitor. Por trás de todo este aparato existem diferentes canais de comunicação, um para o usuário (chamado de standard input e abreviado como STDIN) e outros dois para a máquina (chamados de standard output e standard error, respectivamente abreviados como STDOUT e STDERR). Por diferentes razões, em algum momento poderá surgir a necessidade de "desviar" um canal para uma fonte ou destino diferente. E é este o tópico a ser abordado neste post.

Caso seja preciso desviar o canal do usuário (STDIN) para obter entradas, utiliza-se o operador '<' seguido da identificação de algum arquivo. Parece difícil imaginar alguma situação em que isto ocorra, mas imagine um programa em teste que exige diversas entradas no decorrer de sua execução. Agora imagine o programador pacientemente dando entradas, testando o software, dando entradas, testando software e assim infinitamente. Cansativo, não? A situação poderia ser resolvida se o programador criasse um arquivo contendo todas as entradas de teste e utilizasse o operador de redirecionamento citado.

Antes de falarmos sobre como desviar os outros canais, é melhor esclarecer a diferença entre eles. STDOUT seria o meio de comunicação principal do programa, ou seja, por onde ele envia a informação a ser exibida na tela do monitor. Por último, mas não menos importante, temos o STDERR, o canal por onde o computador envia as mensagens de erros geradas durante execução.

Existem dois operadores que denotam o redirecionamento de saída, são eles '>' e '>>'. O primeiro redireciona, criando um arquivo contendo a saída ou, caso o arquivo já exista, sobrescrevendo. Já o segundo redireciona, criando um arquivo contendo a saída ou, caso o arquivo já exista, adicionando dados ao final (Append em termos da computação). Como os operadores são os mesmos para ambos canais, criou-se a convenção onde STDOUT seria identificado como 1 e STDERR como 2. Logo, unindo o conhecimento que temos sobre operadores de redirecionamento de saída, chegamos nas diferentes sintaxes listadas abaixo:

1) 1>arquivo (redirecionando STDOUT para um arquivo)
2) 1>>arquivo (redirecionando, com Append, STDOUT para um arquivo)
3) 2>arquivo (redirecionando STDERR para um arquivo)
4) 2>>arquivo (redirecionando, com Append, STDERR para um arquivo)
5) &>arquivo (redirecionando STDOUT e STDERR para um arquivo)











quarta-feira, 28 de julho de 2010

A História do GNU/Linux

Esta história começa na década de 1960, quando a computação recém iniciava e o seu ícone eram os volumosos mainframes. Na época, assim como ocorre atualmente, o custo para ter aquela nova tecnologia que surgia prometendo revolucionar o mundo era muito alto. Tinha-se ainda a baixíssima (para não dizer nula) portabilidade dos sistemas operacionais, que eram implementados em assembly. Esclarecendo, um sistema operacional era especificamente projetado para um determinado modelo de mainframe, logo, devido aos altos custos já citados, a empresa dona do computador se via presa ao modelo e ao fabricante. Todos estes fatores acarretaram num lento avanço da computação no comércio.

O cenário começou a se alterar na metade da década. Em 1965, a AT&T (através da Bell Labs), Honeywell, General Electric e Massachusetts Institute of Technology resolveram criar em conjunto um sistema operacional visonário, o Multics (Multiplexed Information and Computing Service). Quatro anos depois, as inovações pretendidas pela iniciativa ainda estavam tão a frente do seu tempo que chegavam a ser inviáveis, fazendo com que o parceiro com interesse comercial (Bell Labs) se afastasse do projeto que continuou a ser desenvolvido pelos outros interessados.

Ken Thompson, um engenheiro da Bell Labs que havia trabalhado no Multics, programou o jogo Space Travels e necessitava de um sistema operacional para poder jogar. Assim nascia o Unics,mais tarde rebatizado como Unix, que, ao contrário do Multics, se preocupava com apenas uma coisa: executar programas. O grande avanço veio em 1973 quando o Unix foi re-implementado, desta vez na Linguagem C, que acabou por torna-lo o sistema operacional mais adaptável para os diferentes mainframes. Anos mais tarde, vendo a oportunidade de negócio que surgia, a Bell Labs decidiu fechar o código fonte, ou seja, cobrar pela licença.

Estamos na década de 1980. As empresas agora começavam a fechar os seus códigos fonte temendo que, através da "cultura hacker", os seus softwares fossem parar nos computadores dos concorrentes. Foi neste cenário que um homem fez a diferença ao divulgar a filosofia "O Software deve ser livre". Seu nome? Richard Stallman. Richard negou-se a aceitar um futuro onde não poderia compartilhar conhecimento, anunciou o Projeto GNU e criou uma fundação para reunir todos os programadores que acreditavam em sua filosofia, a FSF (Free Software Foundation). O Projeto GNU surgiu visando a criação de um sistema operacional totalmente livre, compatível com Unix porém sem ter uma linha sequer de código fonte do mesmo (talvez para ressaltar isto tenha sido criada a famosa frase "GNU is Not Unix"). Outra intenção de Stallman era resgatar o espírito de colaboração ameaçado pelas empresas.

Ainda na mesma década, outras duas figuras importantes despontavam para o mundo. Uma delas era Andrew Tanenbaum, professor da Vrije Universiteit. Tanenbaum precisava ensinar aos seus alunos o funcionamento do sistema operacional. Mas como ele faria isso? Licenças Unix custavam caro e seria algo totalmente inviável. Foi então que ele decidiu implementar um sistema operacional, inspirado no Unix, com fins exclusivamente educacionais. Estava criado o Minix, obtendo tanto sucesso em seu propósito que, em três meses, já havia mais de quarenta mil pessoas discutindo-o e propondo melhorias. Dentre todas essas pessoas estava Linus Torvalds, um estudante que moldou o sistema operacional conforme o necessário. Insatisfeito com as limitações comerciais do Minix, Torvalds resolveu criar o seu próprio sistema operacional que mais tarde veio a se tornar o kernel Linux. Na visão de Linus, o Linux deveria ser um núcleo rápido e capaz de executar qualquer aplicativo Unix.

Na década de 1990, mais especificamente em 1991, o GNU era um sistema operacional sem um núcleo. O desenvolvimento do Hurd, ou seja, o núcleo idealizado para o GNU, estava atrasado e o Linux era apenas um kernel. Stallman decidiu juntar o útil ao agradável e adotou o Linux para distribuir o projeto GNU, dando origem ao sistema operacional GNU/Linux e a tantas outras distribuições existentes.