Uma breve introdução ao GNU/Linux
Introdução
Para a maioria das pessoas, Linux é sinônimo de complexidade, um sistema operacional estranho que só funciona por linha de comando. Terminais pretos e letras verde piscando enquanto caracteres pulam na tela freneticamente. Mas não é bem assim.
Hoje em dia a maioria das distribuições Linux possuem interfaces gráficas e são amigáveis ao usuário comum. Grandes exemplos disso são o Ubuntu e o Linux mint.
Porém, se você não estiver satisfeito com o pacote de interface gráfica padrão de uma distribuição, você pode simplesmente o desinstalar, substituir por outro, ou modificar e personalizar à vontade até que esteja com a sua cara. E é aí, que reside o poder do Linux. Você controla o sistema, não o contrário.
Afinal, o que é GNU/Linux?
Apesar de ser usado para se referir aos sistemas operacionais que o utilizam, Linux se trata de um Kernel. Kernel, que significa núcleo, é o responsável por fazer a ponte entre um sistema operacional e o hardware — parte física do computador — , não sendo exclusivo aos sistemas do tipo Unix, por exemplo, o Windows também possui um Kernel, chamado Windows NT ou NT Kernel.
E o que é GNU? Bom, um núcleo não funciona por conta própria, mas sim aloca e gerencia os recursos para que outros programas funcionem. Comumente descrito dessa forma, o Linux preencheu a lacuna que faltava para o projeto GNU, fundado por Richard Stallman como parte do Movimento de Software Livre, cujo objetivo era criar um sistema, parecido com o Unix, mas que fosse livre e gratuito. Quando falamos de GNU, estamos falando de uma gama de softwares que integram o sistema como um todo. Exemplificando, entre outros programas que pertencem ao projeto GNU, estão o GRUB (GRand Unified Bootloader), bash, grep, tar, gzip, e o GNOME, que surgiu como uma interface gráfica para ajudar usuários que não são especialistas.
A partir da junção GNU/Linux, são desenvolvidos as distribuições que conhecemos, como Mint, Ubuntu, Debian, CentOS, e muitas outras. São sistemas operacionais, que nasceram do núcleo Linux e, da visão e softwares do projeto GNU. Modificados e distribuídos, vindo com diferentes programas pré-instalados, gerenciadores de pacotes, ambientes desktop, etc.
Uma curiosidade, o nome Linux — em homenagem ao seu criador Linus Torvalds -, é um acrônimo recursivo para Linux is not unix. Assim como GNU é um acrônimo recursivo para GNU is Not Unix.
A estrutura de uma distro Linux
Uma distribuição Linux, na sua essência, tem seus diretórios organizados da seguinte forma:
/, éa raíz do sistema, a partir desse ponto de montagem, estarão todas as outras pastas e subpastas. Se formos comparar com o Windows, se assemelha ao C:\;
/bin, é onde estão os programas, ou binários, essenciais para o sistema;
/boot, onde estão configurações e arquivos necessários para inicialização do sistema, como o GRUB. Também é onde está localizado uma imagem do Kernel;
/dev, diretório onde estão arquivos, que servem como interface, para acessar ou gerenciar qualquer dispositivo conectado ao seu computador;
/etc, aqui ficam arquivos de configuração do sistema e outros serviços;
/home, destinado aos usuários para suas pastas pessoais. Por exemplo, /home/joãozinho;
/lib, diretório onde estão localizadas bibliotecas do sistema, utilizadas pelos programas em /bin e módulos do Kernel;
/mnt, usualmente usado como ponto de montagem para dispositivos, como, por exemplo, pen drives;
/proc, informações sobre o Kernel e processos em execução;
/opt, geralmente, usado para pacotes “opcionais”, que não vem com o Linux;
/root, diretório dos superusuários;
/sbin, arquivos essenciais e utilitários para administração do sistema;
o, arquivos temporários;
/usr, contém arquivos e aplicações utilizados pelos usuários, e não todo o sistema;
/var, onde ficam guardados informações variáveis, como logs.
Em sistemas Unix-like, tudo é um arquivo
Como mencionado, dispositivos físicos, e até mesmo, sessões de terminal são listadas em /dev. Isso, porque, no Linux, tudo é um arquivo. Isso pode parecer um pouco estranho, à primeira vista. Mas essa filosofia foi adotada pelo próprio Linus Torvalds, e, se formos parar para pensar, é verdade, para um computador tudo são apenas bytes empilhados, a forma como esses bytes são interpretados é que difere.
Conhecendo o Bash
Não importa se você é um desenvolvedor, ou apenas um entusiasta, aprender a usar um terminal é essencial para aqueles que querem mais controle sobre o sistema. No Windows, temos o prompt de comando e o powershell. Em distribuições Linux, temos terminais como zsh e o bash.
1. O usuário conectado aquele terminal;
2. O hostname, ou seja, o nome da máquina;
3. O diretório atual (nem sempre estará presente);
4. O tipo do usuário, $ para usuários comuns, # para super-usuários (veremos mais sobre a seguir);
Comandos básicos
Lembre-se, comandos são case-sensitive, isso significa que PWD é diferente de pwd. Aqui vão alguns exemplos de comandos básicos e nativos:
pwd:
Exibe o diretório em que você está localizado, no momento;
cd:
Navega para outro diretório, passado como parâmetro, pode-se utilizar caminhos relativos ou absolutos. Se nenhum for especificado, navega até a pasta definida na variável de ambiente $HOME;
ls:
Lista todos os arquivos no diretório atual, ou no diretório especificado, se nenhum for especificado, utiliza a pasta atual.
Parâmetros comuns:-l
: lista detalhadamente especificando permissões de acesso, quantidade de arquivos, dono e grupo, tamanho em bytes, data de modificação e nome do arquivo.-a, --all
: lista também pastas e arquivos ocultos (iniciam-se com um ., como .env)
Vale ressaltar que, as duas primeiras entradas se referem à pasta atual, e a pasta anterior. E, apesar do nome, o último arquivo listado não é uma pasta, de fato. Pastas, assim como . e .., podem ser identificadas pela letra d (de directory), que vem logo no ínicio do output precedendo as permissões (veremos mais à respeito de permissões a seguir, quando falarmos sobre os comandos chown e chmod).
mkdir: cria uma pasta no caminho especificado. Se não for especificado, a pasta é criada no diretório atual;
echo:
Exibe o valor passado como argumento. Faz mais sentido usado com redirecionamento (veremos adiante);
No primeiro exemplo, o valor que passamos como argumento é exibido direto na tela. No segundo, utilizamos um condutor para que o output seja escrito no arquivo my_hello.txt
cat:
Exibe o conteúdo de um arquivo;
grep:
Faz uma “busca” e exibe apenas as entradas que correspondem ao padrão estabelecido;
Como podemos ver acima, passamos o output de ls através do uso de um condutor (veremos mais a seguir) para o comando grep. O padrão de busca “my_” fez com que o resultado final exibido na tela fosse somente de arquivos ou pastas que contenham essa expressão, como destacado em vermelho. Podemos conduzir o output de qualquer comando para essa filtragem do grep.
Uma outra forma de utilizar o grep, dessa vez buscando em um arquivo de texto:
Nesse exemplo, estamos buscando por Lorem ipsum no arquivo lorem_ipsum.txt — note que, eu precisei encapsular a expressão com aspas, isso por causa do espaço. — Esse comando por si só, não exibiria nada na tela, por isso estamos redirecionando o output para /dev/stdout (lembre-se da filosofia de que tudo é um arquivo), ou seja a saída padrão de dados — nesse caso, o terminal atual. Não se preocupe veremos mais sobre a seguir.
O comportamento acima ocorre porque o espaço é um delimitador. Dessa forma, ipsum está sendo interpretado como um segundo argumento e não como parte do primeiro que é a expressão buscada. Vamos analisar outros casos.
Não temos o resultado esperado. Por quê?
Porque & é um condutor que manda o processo atual rodar no background. De novo, não se preocupe tanto com isso agora.
Certo, e como fazemos para buscar por &? Simples, coloque-o entre aspas ou escape o caractere utilizando \. Alguns exemplos:
Parâmetros interessantes e comuns:-i, --ignore-case
: torna a busca case-insensitive;-B, --before-context
: define uma “margem” de linhas antes do padrão buscado que devem ser retornadas;-A, --after-matcha
: define uma “margem” de linhas depois do padrão buscado que devem ser retornadas;-C
: define uma “margem” de linhas depois e antes do padrão buscado que devem ser retornadas;-v, --invert-match
: reverte a busca, retornando tudo que não atingir o padrão.
Consulte o manual para mais, grep é um comando muito poderoso.
find:
Usado para encontrar arquivos em uma hierarquia de diretórios;
Parâmetros interessantes e comuns:
--exec
: executa comandos com base na busca;--iname
: torna a busca case-insensitive;
--regex
: utiliza expressões regulares para busca;
--iregex
: como — regex, mas case-insensitive;--size
: arquivo utiliza mais que, menos que ou exatos bytes de espaço. utiliza-se - para menos que, + para mais que e nenhum sinal para tamanho exato. É possível especificar também a unidade passando como argumento logo após o tamanho, c para bytes, k para kilobytes, M para megabytes e G para gigabytes.
--atime
: encontra arquivos acessados mais que ou menos que n*24. Por exemplo, atime +1 encontrará arquivos acessados a pelo menos dois dias atrás;
Consulte o manual para mais, find é um comando muito poderoso;
touch:
Toca um arquivo atualizando a última modificação. Se o arquivo não existir, ele é criado;
sudo:
Permite executar um comando como se fosse o superusuário (root) ou um outro usuário. Vale ressaltar que, para que funcione o usuário deve ter permissão necessária, localizada no arquivo /etc/sudoers;
cp:
Copia um arquivo;
mv:
Move um arquivo;
rm:
Deleta um arquivo ou diretório, se usado com o argumento de recursão -r;
ps:
Exibe os processos em execução;
No exemplo acima, utilizamos primeiro o formato mais simples. E em seguida, fazemos uso dos parâmetros a, u e x para listar todos os processos do sistema com mais detalhes e, inclusive aqueles não associados à um terminal, daemons e processos rodando no background.
kill:
“Mata” um processo sendo executado, enviando sinais de interrupção para o mesmo. Se o processo ignorar esses sinais, é possível forçar utilizando o argumento -9. Exemplo de uso:
kill -9 PID_DO_PROCESSO
chown:
Altera o “dono” ou “grupo detentor” de um arquivo ou pasta;
chmod:
Altera as permissões de um arquivo ou pasta;
Acompanhe a imagem acima, as permissões podem ser divididas em três grupos de três caracteres, que podem ser r (leitura), w (escrita) ou x (execução). Sendo o primeiro grupo referente ao dono do arquivo, o segundo do grupo detentor e o terceiro de qualquer usuário no sistema. Da mesma forma, dê uma olhada na tabela no canto inferior direito. Cada permissão tem sua “pontuação”, e diferentes permissões são a soma desses pontos. Para utilizar o comando chmod utiliza-se a sintaxe chmod permissões arquivo/pasta. Ou seja, se eu quiser dar todas as permissões para todos os usuários eu posso fazer:
Ou, com um pouco mais de controle:
O primeiro sete se refere ao dono, o segundo ao grupo, o terceiro a qualquer outro usuário.
Ok, agora eu quero que o dono possa ler, escrever e executar. O grupo dono possa executar e qualquer outro usuário somente ler:
E, por último, suponha que eu quero que o dono possa fazer tudo, mas os outros usuários não possam fazer nada:
alias:
Dá um “apelido” para um ou mais comandos, como se fosse uma variável. É muito útil quando você se vê repetindo uma série de comandos frequentemente. Por exemplo, suponha que você trabalhe como desenvolvedor(a) e toda manhã precisa executar os seguintes comandos para preparar o seu ambiente.
cd ~/Personal/myApps/ && yarn start && cd .. && cd /myOtherApps && source .
Utilizando o alias, você pode jogar isso tudo para dentro de um “apelido”, e executar todos esses comandos, apenas digitando ele no seu terminal. Mas lembre-se, alias só funciona para o terminal atual, mais interessante seria salvar no .bashrc (que fica localizado na pasta pessoal de um usuário, ou seja, a $HOME), o que faria disponível para todos os terminais abertos por aquele usuário no futuro;
man:
Exibe o manual de um programa. Muito útil para descobrir como e porquê se utiliza determinado comando.
Há muitos outros comandos, não só do Bash, mas também de serviços e aplicativos externos em sua versão CLI (Command Language Interface). Muitos deles, oferecem a opção -h ou — help (dois hífens, medium transforma em um travessão), lembre-se que você também pode usar o comando man nome_do_comando, para exibir o manual com ainda mais informações. Algumas ferramentas também possuem uma documentação online. E além disso, como sempre digo, o Google é seu amigo, não tenha medo de pesquisar.
Clique aqui, para um compilado de comandos úteis do bash
Redirecionamento e condutores
Sendo simplista, o redirecionamento permiti que os processos se comuniquem, e a manipulação de dados se dê mais facilmente. Os operadores são:
|, pipe: Usa o output de um comando como input para outro;
&, execução em background: Executa o processo em background, liberando o terminal para novos comandos;
||, operador lógico “ou”: executa o próximo comando, apenas se o anterior falhar;
&&, operador lógico “e”: executa o próximo comando apenas se o anterior tiver êxito;
>, redirecionamento de saída: Redirecionador, sobrescreve com output do programa;
>>, redirecionamento de saída — append: Redireciona acrescentando output do programa, se estiver redirecionando para um arquivo não sobrescreve o conteúdo, mas sim acrescenta ao final;
;, delimitador de comandos: é possível encadear comandos utilizando o ponto e vírgula.
Fluxos de dados padrão
/dev/ stdout: saída de dados padrão, representado pelo número 0;
/dev/ stdin: entrada de dados padrão, representado pelo número 1;
/dev/ stderr: saída de erros, representado pelo número 2;
Então, por exemplo. Se eu quiser pegar somente os erros de determinado comando e salvar em um arquivo eu poderia o fazer:
comando 2> arquivo_erro.log
Agora, se eu quiser abstrair todo e qualquer erro, eu posso redirecionar o stderr para /dev/null, que é basicamente um buraco negro, esse arquivo especial descarta toda e qualquer informação enviada para ele, não retornando para lugar nenhum.
comando 2> /dev/null
Concluindo
Por mais longo que tenha sido esse artigo, essa é a ponta do iceberg, mas não se sinta sobrecarregado. O que quero dizer com isso é que distribuições GNU/Linux te dão todo o poder que você precisa para que você possa operar sua máquina. Seja você um usuário comum, avançado, um entusiasta ou desenvolvedor, um hacker ou alguém preocupado com sua privacidade. É possível encontrar uma distro que atenda as suas preferências, que seja de fácil uso diário (como mint ou ubuntu) ou um bicho de sete cabeças (arch linux), que venha com um set de programas de pentest (kali ou parrotsec) ou que não venha com nenhum e te deixe escolher desde o início o que quer e precisa (como o arch linux, novamente 😅). Que te permita navegar anonimamente e apague tudo assim que a sessão encerrar (como tails). E mesmo se não houver, é possível personalizar, modificar ou até criar uma.
Refs e links que podem vir a calhar
Manual do Bash
Linux commands cheatsheet
Distrochooser
Condutores e fluxos de dados no Linux
Automating tasks with cron jobs