Buscar

Linux Essencial

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 191 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 191 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 191 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1.1
1.2
1.3
1.4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
1.4.7
1.4.7.1
1.4.7.2
1.4.7.3
1.4.8
1.4.9
1.4.10
1.4.11
1.4.12
1.4.13
Tabela de conteúdos
Início
Sumário
Introdução
Capítulo 1 - Linux: introdução teórica
Um pouco da história
Software livre
Open source (código aberto)
Código-fonte
Qual a diferença entre Linux e GNU...
Sistema Operacional (SO)
Licença de software
GPL
Copyleft
Outras licenças
Distribuições Linux
Onde o Linux é usado
Qual é a melhor distribuição Linux?
Os benefícios de uma distribuição Linux
Por trás da interface gráfica
Resumo
1.5
1.5.1
1.5.2
1.5.3
1.5.3.1
1.5.3.2
1.5.4
1.5.5
1.5.6
1.5.7
1.5.8
1.5.9
1.6
1.6.1
1.6.1.1
1.6.1.2
1.6.1.3
1.6.1.4
1.6.1.5
1.6.1.6
1.6.1.7
1.6.2
1.6.2.1
Capítulo 2 - Estrutura e funcionamento do Linux
Estrutura sistêmica do GNU/Linux
Terminal Virtual (ttyN)
Introdução ao shell
Logon e logout
Superusuário (root), usuário...
Primeiro contato com o shell
Árvore de diretórios ("pastas")
Case-sensitive
Referências absoluta e relativa
Entrada e saída padrão de dados
Resumo
Capítulo 3 - Comandos Programas essenciais
Comandos Programas básicos
help
man
logout
shutdown, poweroff e halt
reboot
pwd
history
Manipulação de arquivos e diretórios
ls (list)
1.6.2.1.1
1.6.2.1.2
1.6.2.1.3
1.6.2.2
1.6.2.3
1.6.2.4
1.6.2.5
1.6.2.6
1.6.2.7
1.6.2.8
1.6.2.9
1.6.2.10
1.6.2.11
1.6.2.12
1.6.2.13
1.6.2.14
1.6.2.15
1.6.2.16
1.6.2.17
1.6.3
1.6.4
1.6.5
1.6.5.1
Listando o conteúdo do...
Opções (atributos de...)
Listar arquivos ocultos
cd (change directory)
cp (copy)
rm (remove)
mkdir
rmdir
cat
more
cut
find
grep
head
tail
wc
tar
gzip e bzip2 (compactar e...)
Outros comandos
Curingas
Utilizando | (pipe) para direcionar...
Encadeando execuções com : (ponto...
Exemplos
1.6.5.2
1.6.6
1.6.7
1.7
1.7.1
1.7.2
1.7.3
1.7.4
1.7.4.1
1.7.4.2
1.7.4.3
1.7.4.4
1.7.4.5
1.7.4.6
1.7.4.7
1.7.5
1.7.5.1
1.7.5.2
1.7.5.3
1.7.5.3.1
1.7.5.3.2
1.7.5.3.3
1.7.5.4
Redirecionar saída com > ou >>
Atalhos essenciais
Resumo
Capítulo 4 - Usuários, grupos e permissões
O que é um usuário
O que é um grupo de usuários
O que são permissões
Gerenciamento de usuários e grupos
Criar usuário
Editar usuário e senha
Excluir usuário
Criar um grupo
Adicionar e remover usuário...
Excluir grupo
Diretório home do usuário
Gerenciamento de permissões
Adicionar, remover e definir...
Usando chmod com método...
Umask
Calcular umask
Umask para permissão
Alterando umask
Permissões especiais
1.7.5.4.1
1.7.5.4.2
1.7.5.4.3
1.7.5.4.4
1.7.5.5
1.7.6
1.8
1.8.1
1.8.2
1.8.3
1.8.4
1.9
1.9.1
1.9.2
1.9.3
1.9.4
1.9.4.1
1.9.4.2
1.9.5
1.10
1.10.1
1.10.1.1
1.10.1.2
SUID (set user id)
SGID (set group id)
Sticky (sticky bit)
Vantagens (SUID, SGID...)
sudo
Resumo
Capítulo 5 - Editores de texto (Nano e VIM)
Nano
Vim (VI iMproved)
Nano ou Vim
Resumo
Capítulo 6 - Instalar, atualizar e remover...
Pacotes
Gerenciador de pacotes
Repositório
Apt-get ou Aptitude?
Apt-get / apt-cache (básico)
Aptitude (básico)
yum
Capítulo 7 - Gerenciamento de rede
Testando a conectividade
ping
telnet
1.10.1.3
1.10.2
1.10.2.1
1.10.2.2
1.10.2.3
1.10.3
1.11
1.12
1.13
1.14
traceroute
Visualizando e configurando end...
ifconfig
dhclient
Arquivo de configuração das...
Resumo
Lista de exercícios
Sugestões de leitura
Conclusão
Contatos
Linux Essencial - Por trás da interface gráfica
Autor: Fábio J L Ferreira
Contato:
E-mail: contato@fabiojanio.com
Nas redes:
Facebook: http://www.facebook.com/blogfabiojanio
Twitter: https://twitter.com/_SDinfo
Linkedin: http://br.linkedin.com/in/fabiojanio
Blog: http://www.fabiojanio.com/
http://www.facebook.com/blogfabiojanio
https://twitter.com/_SDinfo
http://br.linkedin.com/in/fabiojanio
http://www.fabiojanio.com/
Introdução
A sociedade moderna está totalmente dependente da tecnologia - esse é um
fato consumado. Porém, em muitos aspectos somos meros usuários, ou seja,
não compreendemos seu funcionamento e, por conta disso, nos tornamos
reféns daqueles que detêm o poder sobre as tecnologias que utilizamos no dia
a dia. Em alguns casos, somos considerados consumidores de tecnologias
sem voz ativa nem poder de escolha.
Não seja um mero usuário; tome as rédeas do jogo. Não sabe como? Neste
momento, estou lhe convidando a estudar, pesquisar e se aventurar no
universo do software livre, um universo de possibilidades infinitas, limitadas
tão somente pela sua imaginação e capacidade de inovar.
Venha desbravar novos horizontes, ou melhor, venha por meio desta
obra realizar uma mudança cultural na forma como você interage com o
seu computador; deixe de ser um mero espectador refém das vontades da
"máquina", assuma o controle e passe a ditar as regras jogo. Construa
um conhecimento sólido e aprenda a solucionar problemas até então
considerados "bichos de sete cabeças". Dedique algumas poucas horas
do seu dia a se encantar com o tema foco desta obra e garanto que não
será uma perda de tempo; ainda que nem todo conhecimento adquirido
aqui seja aplicado no seu cotidiano, todo e qualquer conhecimento é um
bem valioso que mais cedo ou mais tarde irá render alguns bons frutos.
O convite está feito!
Em 2007 iniciei meus estudos e pesquisas sobre o tema Linux. Minha
dedicação e vontade foram tamanhas que, poucos dias após iniciar os estudos,
resolvi remover o Windows da minha máquina e instalar uma distribuição
Linux; essa foi sem dúvida uma grande mudança "cultural" na minha vida.
Foi uma longa jornada, porém, obtive ótimos resultados com essa mudança.
Em virtude da experiência adquirida, algumas portas se abriram e várias
oportunidades de trabalho surgiram; confesso que foi um ótimo investimento
de tempo dedicar atenção ao assunto, mas isso não veio do nada. Na verdade,
eu estava há algum tempo acompanhando a comunidade de software livre, e
fiquei encantado com o entusiasmo e empenho dos membros da comunidade;
eles compartilhavam a experiência de uso e os conhecimentos cultivados na
convivência diária com o uso desse incrível sistema.
Este material foi desenvolvido em complemento à obra Linux Essencial -
Por trás da interface gráfica, ou seja, se você ainda não a apreciou,
sugiro que suspenda a leitura deste material e faça a apreciação dela
antes de prosseguir.
Aproveito para deixar um alerta: engana-se quem pensa que o mercado de TI
está carente de vagas de trabalho. Na verdade, nos últimos anos esse mercado
tem enfrentado um sério problema: a falta de profissionais qualificados para
ocupar postos de trabalho nos mais diversos níveis hierárquicos das
organizações. Sendo assim, sugiro que invista em si mesmo; essa será sua
melhor aposta e também a garantia de sucesso!
Chega de blá-blá-blá e vamos direto ao que interessa. Boa leitura! ;)
http://www.tinarede.com.br
Capítulo 1 - Linux - introdução teórica
"Quem pensa segundo a opinião dos outros está muito longe de ser um
homem livre."
- Autor desconhecido
No capítulo 2 iremos partir para uma abordagem prática. Porém, antes disso,
se faz necessário entender alguns conceitos, filosofias, impactos e a
importância do Linux na sociedade. Diante disso, peço que por gentileza
tente não pular os tópicos deste primeiro capítulo introdutório.
Alguns dos termos discutidos neste capítulo serão utilizados até o fim desta
obra; sendo assim, seu entendimento se torna no mínimo obrigatório!
1.1 Um pouco da história
A busca incansável por mudar, aprimorar-se e, principalmente, evoluir levou
o estudante de ciência da computação da Universidade de Helsinki, na
Finlândia, Linus Torvalds a iniciar um processo de aprimoramento do
núcleo do Minix, um sistema operacional Unix-like escrito por Andrew
Tannenbaum. Deste aprimoramento surgiu o Linux, um kernel Unix-like,
que teve sua primeira versão oficial publicada no final de 1991.
Ao desenvolvê-lo, Linus quebrou todos os conceitos comerciais da história.
Deixou aberto o código-fonte do sistema, algo que resultaria emuma grande
mudança, um fenômeno sem precedentes na história da evolução humana dos
tempos modernos: o software livre.
1.2 Software livre
A ideia do software livre ganhou forma em meados de 1983 pelas mãos do
ativista Richard Stallman, criador do projeto GNU e responsável por fundar
em 1985 a Free Software Foundation (FSF), fundação sem fins lucrativos que
tem como objetivo defender o movimento do software livre.
Pode-se dizer que software livre é um movimento social que defende
aspectos ligados diretamente à liberdade que o usuário tem perante o
software.
Segundo a FSF, qualquer software/programa deve obedecer a quatro
liberdades para ser considerado um software livre. São elas:
Liberdade 0 - Liberdade de executar o programa para qualquer
propósito;
Liberdade 1 - Liberdade para estudar como o programa funciona e
adaptá-lo às suas necessidades;
Liberdade 2 - Liberdade de redistribuir cópias de forma que você possa
ajudar outras pessoas;
Liberdade 3 - Liberdade para melhorar o programa e disponibilizar as
melhorias para o público, de forma que toda a comunidade possa se
beneficiar delas.
Para garantir as liberdades 2 e 3 é imprescindível ter acesso ao código-fonte
do programa.
Atenção: o conceito de software livre se opõe às diretrizes do software
proprietário, mas não às do software que é vendido almejando lucro
(software comercial).
Cuidado: não confunda software livre (free software) com software
grátis (freeware).
A definição oficial de software livre pode ser encontrada no site do projeto
GNU, ao acessar o link: http://www.gnu.org/philosophy/free-sw.html
http://www.gnu.org/philosophy/free-sw.html
1.3 Open source (código aberto)
Open source e software livre são a mesma coisa? Mais ou menos; existem
diferenças sutis, porém ambos tentam nos garantir liberdades e direitos
perante o software.
A Open Source Initiative (OSI) tenta ser mais flexível do que a Free Software
Foundation na classificação de software. Para tanto, dita dez regras utilizadas
para classificar um software como open source; são elas:
1. Distribuição livre: a licença não deve restringir de nenhuma maneira a
venda ou distribuição do programa gratuitamente, como componente de
outro programa ou não.
2. Código-fonte: o programa deve incluir seu código-fonte e deve permitir
a sua distribuição também na forma compilada. Se o programa não for
distribuído com seu código-fonte, deve haver algum meio de obtê-lo,
seja via rede, seja com custo apenas de reprodução. O código deve ser
legível e inteligível para qualquer programador.
3. Trabalhos derivados: A licença deve permitir modificações e trabalhos
derivados, e deve permitir que eles sejam distribuídos sob os mesmos
termos da licença original.
4. Integridade do autor do código-fonte: A licença pode restringir a
distribuição do código-fonte em uma forma modificada apenas se a
licença permitir a distribuição de arquivos patch (de atualização) com o
código-fonte, para o propósito de modificar o programa no momento de
sua construção. A licença deve explicitamente permitir a distribuição do
programa construído a partir do código-fonte modificado. Contudo, a
licença pode ainda requerer que programas derivados tenham um nome
ou número de versão diferentes do programa original.
5. Não discriminação contra pessoas ou grupos: A licença não pode ser
discriminatória contra qualquer pessoa ou grupo de pessoas.
6. Não discriminação contra áreas de atuação: A licença não deve
restringir o uso do programa por qualquer pessoa em um ramo
específico de atuação. Por exemplo, ela não deve proibir que o programa
seja usado em uma empresa, ou para pesquisa genética.
7. Distribuição da licença: Os direitos associados ao programa devem ser
aplicáveis para todos aqueles cujo programa é redistribuído, sem a
necessidade da execução de uma licença adicional para estas partes.
8. Licença não específica a um produto: Os direitos associados ao
programa não devem depender de o programa ser parte de uma
distribuição específica de programas. Se o programa é extraído de uma
distribuição e usado ou distribuído dentro dos termos da licença do
programa, todas as partes para quem o programa é redistribuído devem
ter os mesmos direitos que os garantidos em conjunção com a
distribuição de programas original.
9. Licença não restritiva a outros programas: A licença não pode
colocar restrições em outros programas que são distribuídos junto com o
programa licenciado. Isto é, a licença não pode especificar que todos os
programas distribuídos na mesma mídia de armazenamento sejam
programas de código aberto.
10. Licença neutra em relação a tecnologia: Nenhuma cláusula da licença
pode estabelecer uma tecnologia individual, estilo ou interface a ser
aplicada no programa.
As regras acima foram retiradas do endereço http://softwarelivre.org/open-
source-codigo-aberto Fonte oficial em inglês:
http://www.opensource.org/docs/definition.php
É importante ter em mente que, em muitos casos, um software livre também
pode ser um open source e vice-versa. A FSF e a OSI não são inimigas, mas
possuem pontos de vista divergentes.
http://softwarelivre.org/open-source-codigo-aberto
http://www.opensource.org/docs/definition.php
1.4 Código-fonte
São basicamente as instruções que formam um programa. Essas instruções
são escritas com base em alguma linguagem de programação, como por
exemplo Java, C, Delphi, entre outras.
Ter acesso ao código-fonte do software significa basicamente ter acesso às
instruções inscritas nele em qualquer que seja a linguagem de programação.
Mas, como assim? Não poderíamos simplesmente editar o software? Não, o
resultado final de um software normalmente é um arquivo binário; em outras
palavras, este arquivo nada mais é do que uma transformação da linguagem
de programação para uma linguagem de máquina, incompreensiva para nós,
meros mortais. Diante disso se faz necessário ter acesso ao código-fonte para
poder estudar e/ou melhorar um software.
1.5 Qual a diferença entre Linux e GNU/Linux?
O Linux nada mais é do que um kernel (núcleo) do sistema; já o
GNU/Linux é um sistema operacional completo, formado pela camada de
kernel e pelos demais componentes do projeto GNU, tais como programas
diversos, drivers, interface gráfica etc.
O projeto GNU tinha como objetivo criar um sistema operacional completo,
gratuito e livre. Quase tudo estava pronto, porém o GNU ainda não possuía a
parte mais importante, um núcleo para o seu sistema. Foi aí que Linus
Torvalds entrou na história, e da união do GNU com o Linux surgiu o
GNU/Linux, que hoje é popularmente conhecido apenas como Linux, nome
que não faz justiça a todos aqueles que contribuíram e continuam
contribuindo para o crescimento do sistema operacional GNU/Linux.
Existe um outro entendimento segundo o qual Linux é o nome dado a
qualquer sistema que utilize o núcleo (kernel) Linux. Porém, não custa nada
colocar um GNU antes do nome, né?
1.6 Sistema Operacional (SO)
É um software/programa ou conjunto de programas que tem como função
principal gerenciar os recursos do sistema, tais como quem recebe atenção do
processador, quanto de memória determinado processo irá utilizar, qual a
prioridade dos processos etc. Em outras palavras, um sistema operacional é
responsável por realizar uma interface entre o usuário e a máquina, abstraindo
e simplificando a realização de tarefas diversas. Pense no sistema operacional
como uma interface amigável, um verdadeiro amigo, pois sem ele você teria
que lidar com a dificuldade de gerenciar a memória, a prioridade entre os
processos e muito mais.
Este conceito é extremamente importante e vasto, mas não nos convém entrar
em detalhes neste momento.
1.7 Licença de software
Todo software quando criado é associado a um documento, que tem como
objetivo informar o que é permitido ou não fazer com aquele software. Esse
documento é a licença do software; ela é quem dita as regras do "jogo"!
1.7.1 GPL
Em geral, o GNU/Linux segue as regras prescritas na GPL (GNU Public
License), criada em 1989 e revisada pela primeiravez em 1991, quando
resultou na GPLv2 (GPL versão 2). A revisão mais recente até o lançamento
desta obra é a de 2007, a GPLv3 (GPL versão 3). As quatro liberdades do
software livre são garantidas graças à licença GPL.
Para mais informações a respeito da GPL:
www.gnu.org/licenses/gpl.html
1.7.2 Copyleft
Este é um termo comum no mundo do software livre; ele é basicamente o
oposto do copyright.
Enquanto o copyright se concentra em pontuar as restrições, o copyleft se
concentra em pontuar as permissões consentidas pela licença. Em outras
palavras, o copyleft se concentra em garantir que determinados
direitos/permissões consentidos por sua licença acompanhem o software
durante sua existência, e que versões derivadas dele carreguem consigo a
mesma licença do software original.
1.7.3 Outras licenças
Existem inúmeras outras licenças, algumas compatíveis com a filosofia
do software livre e outras, não. Veja uma lista parcial:
www.gnu.org/licenses/license-list.html
1.8 Distribuições Linux
Quando falo em distribuições Linux, estou me referindo ao conjunto formado
por kernel, programas e aplicativos que compõem um sistema operacional do
tipo Unix-Like. Como já foi dito, Linux é somente o kernel do sistema; isso
significa que as distribuições Linux utilizam o mesmo kernel, porém acoplam
a si alguns programas e aplicativos conforme a necessidade que levou à
criação daquela "distribuição ou customização" em especial.
Existem algumas distribuições comerciais e outras não comerciais. No caso
das distribuições comerciais, o utilizador paga pelo sistema e recebe suporte
técnico para ele; já no segundo caso, não existe essa cobrança pelo uso do
sistema, porém, se surgir algum problema, o utilizador terá que buscar ajuda
em alguma lista de discussão na internet para tentar obter uma solução.
As distribuições não comerciais também são conhecidas como distribuições
comunitárias; um bom exemplo é o GNU/Linux Debian, um sistema
operacional disponibilizado gratuitamente, mantido por uma comunidade de
desenvolvedores e amantes do universo livre.
Exemplos de distribuições GNU/Linux comunitárias: Debian, Ubuntu,
Slackware, Mint...
Dica: Os mais íntimos preferem o termo distro Linux ao invés de
distribuição Linux.
1.9 Onde o Linux é usado
Um dia o Linux já foi um sistema imaturo e incompreendido. Mas, calma, ele
era somente um bebê, ou melhor, um recém-nascido. O tempo passou e a
cada novo aniversário ele adquiriu mais maturidade e destaque perante a
comunidade. Atualmente esse sistema é utilizado em relógios de pulso,
celulares, computadores, mainframes etc.
Recordo-me de dois fatos históricos da trajetória desse sistema: o primeiro foi
em 2001, quando a IBM anunciou o investimento de 1 bilhão de dólares em
Linux; já o segundo foi em julho desse mesmo ano, quando a NASA
anunciou o lançamento de um assistente pessoal de satélite baseado em
Linux.
Você pode nem imaginar, mas grandes estúdios de animação, tais como
Pixar Estúdios, Lucas Arts e DreamWorks já utilizaram ou ainda utilizam
o Linux na renderização de suas obras. Alguns bons exemplos de obras
renderizadas utilizando o Linux são: O Senhor dos Anéis, Vida de Inseto e
Shrek.
1.10 Qual é a melhor distribuição Linux?
Vixi, calma lá! Não existe a melhor distribuição; existe aquela que é mais
adequada às suas necessidades. Listarei abaixo as minhas preferências:
Servidor: Para montar servidores gosto muito de utilizar a distribuição
Debian; essa é uma distribuição comunitária muito famosa e com uma
comunidade altamente ativa.
Uso pessoal: Em meu desktop e notebook gosto de utilizar o Linux
Mint; essa distribuição já vem por padrão com uma suíte de multimídia
e software básicos pré-instalados. A distro em questão também possui
uma central de software, ou seja, um local onde você tem um catálogo
de itens que podem ser baixados e instalados automaticamente, sem
necessitar de nenhuma interação humana. Mais simples que isso,
impossível.
Então, Debian é a melhor opção para montar servidor e Linux Mint para uso
pessoal? Não; essas foram as melhores opções para mim, mas cada um de nós
vê o mundo de uma forma diferente e possui necessidades distintas. Sugiro
que faça como eu: teste outras distribuições Linux até encontrar sua cara-
metade.
Em alguns casos gosto inclusive de usar o CentOS para servidor e o Ubuntu
para uso pessoal, porém a minha maior preferência é pelos sistemas citados
no início deste tópico.
1.11 Os benefícios de uma distribuição Linux
Ah, os benefícios, palavra amada e cobiçada por nós, meros mortais! Os
benefícios são inúmeros; por este motivo listarei abaixo somente os mais
relevantes:
Segurança: Esse é um assunto que poderia render facilmente várias
páginas, porém não pretendo me aprofundar nele, uma vez que não
representa o foco principal desta obra. Os tópicos abaixo possuem a
função de expor os pontos fortes no quesito segurança das distribuições
Linux:
Atualização constante: Possui atualizações regulares, o que se
deve em parte ao fato de seu código ser aberto; como todos têm
acesso às fontes do sistema, quando alguém identifica algum
problema ou uma possível melhoria uma discussão é iniciada
dentro da comunidade de software livre. Poucos dias depois, se não
no dia seguinte, uma correção é disponibilizada;
Superusuário: O grande erro dos usuários de Windows é utilizar o
sistema operacional com a conta de administrador; isso abre brecha
para que malware se instalem no sistema. Já as distribuições Linux
criam por padrão duas contas de usuário durante a etapa de
instalação, o root (superusuário) e um usuário comum. Ao utilizar
a máquina com o usuário comum, já elevamos nosso grau de
segurança. Existem ainda as contas de usuário de sistema/serviço.
Falaremos delas mais adiante;
Firewall no nível de kernel: Por padrão, o firewall das
distribuições Linux está presente dentro do próprio kernel, ou seja,
faz parte do núcleo do sistema, o que adiciona 1 ponto extra no
quesito segurança; em capítulos posteriores falaremos sobre este
recurso.
Custo/benefício: Seu custo de aquisição pode ser igual a 0 (zero). Caso
queira, você poderá adquirir seu futuro sistema operacional sem pagar
nada, ou até mesmo montar um ambiente inteiro sem tirar um centavo
do bolso. Os software e suítes de aplicativo podem seguir essa mesma
filosofia;
Facilidade de usar e manter: Atualmente as distribuições Linux são
altamente intuitivas e de fácil utilização. A interface gráfica pode ser
rica e altamente elegante, satisfazendo desta forma todos os "paladares";
Customização 100%: Essa é uma vantagem que o software proprietário
não dá: a liberdade para modificar o código-fonte e/ou redistribuir o
resultado final desse trabalho;
Reconhecimento de hardware: Normalmente, após a instalação de uma
distribuição Linux, não será necessário ter o trabalho de correr atrás dos
drivers de áudio, vídeo, impressora etc. Na minha opinião esse é um
benefício e tanto!
Os benefícios listados acima serão abordados na prática em capítulos
posteriores, então fique tranquilo; até o fim desta obra garanto que, no
mínimo, você será um(a) amante de Linux. :)
Dica: está pensando em montar um negócio? Então considere utilizar
alguma distribuição Linux como sistema operacional; seu custo de
implantação provavelmente será igual a zero, sem mencionar o fato de
que você poderá ter acesso a software e suítes de escritório igualmente
equivalentes em termos de custo.
1.12 Por trás da interface gráfica
No início desta obra, convidei você a deixar de ser um mero usuário, refém
das vontades da máquina, mas para isso é necessário deixar de lado a "cultura
do botão" e passar a entender como as coisas funcionam por baixo da
interface gráfica. Para ser capaz de submeter o sistema a suas vontades, é
necessário se aventurar na linha de comando do GNU/Linux, uma telinha
preta que deixa você com a maior cara de nerd e que pode lhe dar acesso total
ao sistema!
A "cultura do botão" se aplica às pessoas que carregam o seguinte lema: "me
dê um botão que eu clico". Sem dúvida, as mentesmais engraçadinhas estão
fazendo piada depois disso; não os culpo, também ri até chorar!
Deixar de lado o entendimento de algo para se apegar com afinco à interface
gráfica pode nos render muita dor de cabeça. A perfumaria visual chamada de
interface gráfica deve acima de tudo agradar os olhos, ou seja, de uma hora
para outra pode sofrer uma reformulação visual que deixe você desorientado,
sem saber onde aquele botão que você tanto utilizava foi parar. Até se adaptar
ao novo visual, você poderá sofrer um pouco, sem falar que a adaptação pode
não ser tão rápida.
Uma interface gráfica rica e elegante sempre conquista admiradores e, no fim
das contas, somos todos usuários de alguma interface visual; isso é inevitável,
porém é mais do que recomendado entender como as coisas funcionam por
trás dessa perfumaria visual. No mundo GNU/Linux temos a figura da linha
de comando, um recurso que nos dá acesso total ao sistema e nos abre
possibilidades não proporcionadas pela interface gráfica, sem falar que esse
recurso não sofre com a volatilidade dos elementos visuais, ou seja, os
comandos estarão sempre lá, aguardando você.
1.13 Resumo
Neste capítulo, entendemos conceitos teóricos básicos e considerados
obrigatórios. O entendimento desses conceitos facilitará sua vida ao longo
dos vários capítulos que compõem esta obra, tornando ainda mais proveitosa
sua estadia conosco.
Neste primeiro capítulo entendemos qual é a real diferença entre os termos
Linux e GNU/Linux, software livre e open source. Discutimos ainda questões
de relevância comum, tais como qual a melhor distribuição Linux, onde cada
uma é utilizada, sua importância e os benefícios proporcionados por sua
utilização.
Recomendo que realize pesquisas adicionais, consulte outras obras e visite as
comunidades de software livre, com o objetivo de complementar o conteúdo
passado por meio desta obra. Posso garantir que este conhecimento será de
grande valia para seu crescimento profissional e, consequentemente, pessoal.
Chegamos ao fim da parte teórica. Do próximo capítulo em diante,
iniciaremos nosso primeiro contato "íntimo" com o GNU/Linux. Caso queira
fazer uma pausa para o café, esta é a hora, pois os próximos capítulos desta
obra prometem fortes emoções!
Capítulo 2 - Estrutura e funcionamento do Linux
"Quem pensa pouco erra muito."
- Leonardo da Vinci
Para prosseguirmos com este capítulo, é necessário que você tenha uma
distribuição Debian devidamente instalada. Caso não conheça o processo de
instalação ou necessite de algum auxílio, consulte o material de apoio "Linux
- Instalando a distribuição Debian".
Ao longo desta obra utilizaremos a distribuição Debian como referência de
estudo, porém, as técnicas, conceitos e comandos apresentados daqui por
diante poderão ser aplicados em qualquer outra distribuição. Talvez a maior
diferença que você pode encontrar entre as várias distribuições disponíveis
seja a localização de arquivos específicos de sistema, porém iremos aprender
comandos e técnicas de pesquisa que nos permitirão localizar qualquer
arquivo facilmente.
http://www.tinarede.com.br
2.1 Estrutura sistêmica do GNU/Linux
Abaixo temos o esquema visual (layout) da estrutura dos sistemas
GNU/Linux:
Figura 1 - Estrutura das distribuições Linux
Gerenciador de janelas: permite realizar a abertura visual dos software
e aplicativos. Disponível somente quando a interface gráfica está
instalada;
Tty: é uma espécie de terminal virtual. Os tty de 1 até 6 são basicamente
terminais de linha de comando, já o tty7 é reservado para a interface
gráfica quando instalada;
Sistema Operacional e Kernel: estes dois assuntos já foram tratados no
capítulo 1;
Hardware: representa os componentes físicos da máquina.
2.2 Terminal Virtual (ttyN)
O GNU/Linux é um sistema multiusuários, ou seja, permite que vários
usuários utilizem uma máquina ao mesmo tempo. Isso é possível graças aos
terminais virtuais, que são uma espécie de console isolada, recurso este que
permite que os usuários trabalhem de forma isolada em uma mesma máquina
sem que um interfira na experiência de uso do outro.
Uma das formas mais comuns de vários usuários acessarem e trabalharem ao
mesmo tempo em uma máquina é fazendo uso de conexões remotas. Nos
sistemas baseados em Linux, o tipo de conexão remota mais comum é o ssh
(abordado a fundo mais adiante).
Ao trabalhar em um ambiente GNU/Linux temos a possibilidade de utilizar
os terminais virtuais para dividir visualmente tarefas em telas distintas, ou
trabalhar em paralelo com mais de um usuário. Para alternar entre os
terminais virtuais (tty) utilizaremos as teclas ALT + F1 até F7, lembrando
que o tty7 normalmente é reservado para a interface gráfica caso a tenha
instalado, ou seja, normalmente teremos 6 tty a nossa disposição, quantidade
esta que pode ser alterada por meio de configuração.
2.3 Introdução ao shell
As distribuições GNU/Linux contam com o shell, um poderoso interpretador
de comandos. Em outras palavras, o shell é um programa de computador que
permite ao usuário interagir com o sistema por meio de comandos,
submetidos através do periférico teclado.
O Bash é o shell mais famoso do universo GNU/Linux; sua popularidade se
deve aos inúmeros recursos que possui, que facilitam a vida do usuário. Ao
longo desta obra iremos trabalhar com o bash, porém existem outras soluções
de shell, cada qual com suas características próprias. Seguem alguns
exemplos: csh, ksh, tcsh e zsh.
Atenção: Shell, terminal e linha de comando são praticamente sinônimos
recursivos.
2.3.1 Logon e logout
O logon nada mais é do que o ato de entrar no sistema. Já o logout é a saída
do sistema, ou seja, o ato de encerrar sua sessão. No capítulo seguinte
veremos como efetuar o logout.
2.3.2 Superusuário (root), usuário comum e usuário de sistema/serviço
Existem basicamente duas formas de abrir um shell no Linux: uma é como
superusuário (root) e outra é como usuário comum. Vejamos as
particularidades de cada uma:
Superusuário: Nos termos técnicos do universo Linux, chamamos este
usuário de root. Ele é o usuário master do sistema, ou seja, o
administrador. Tem acesso irrestrito;
Usuário comum: Com exceção do root, todos os usuários se enquadram
nesta categoria. Possuem acesso limitado ao sistema;
Usuário de sistema/serviço: Estes usuários são utilizados para controlar
serviços no sistema, não possuem senha nem diretório home.
Para identificar o nível de acesso do usuário logado, basta observar o símbolo
que se encontra à esquerda do cursor; caso seja uma # (tralha), significa que o
usuário logado é o root; se for um $ (cifrão), significa que este é um usuário
comum.
2.4 Primeiro contato com o shell
Chegou a hora de brincar com o shell, terminal ou linha de comando, como
preferir. Inicie o seu sistema Debian. Caso ainda não o tenha instalado ou não
se lembre como realizar a inicialização do sistema, consulte o material de
apoio "Linux - Instalando a distribuição Debian".
Figura 2 - Logon
O processo de inicialização pode levar alguns segundos; vai depender do
hardware da sua máquina. Quando o resultado da sua tela for equivalente ao
da Figura 2, isso significará que o sistema já está disponível para uso.
Observe a primeira linha: o tty1 (destacado de verde) é o terminal virtual que
está comportando essa sessão. Utilize usuário e senha criados na etapa de
instalação:
Informe o login user e pressione ENTER;
Será solicitada a password (senha). Digite user e pressione ENTER.
Atenção: ao digitar a senha, nenhum output será apresentado no
terminal; não se assuste, isso é um truque de segurança. Continue
digitando e ao fim pressione ENTER.
Caso não tenha errado o nome do usuário nem a senha, teremos um logon
efetuado com sucesso:
http://www.tinarede.com.br
Figura 3 - Tela após o logon
Na Figura 3, o retângulo vermelho é o que chamamos de banner. Ele será
apresentado sempre que um usuário efetuar logon. Seu texto padrão pode ser
personalizado, porém vamos deixar isso para um outro momento.
Ao acessar o sistema, nosso diretório inicialserá /home/user, ou seja, nosso
user tem um diretório pessoal dentro do diretório /home. Já o diretório
pessoal do usuário root é o /root. Mais adiante entenderemos melhor como
isso funciona. Uma coisa de cada vez. :wink:
Para compreender melhor a última linha da Figura 3, iremos dividi-la em
partes:
user: nome do usuário logado, definido na etapa de instalação;
@: separador;
debian: hostname (nome da máquina) definido no processo de
instalação;
$: indica que o user é uma conta de usuário comum;
_: o underline indica o espaço destinado à inserção de comando por
parte do utilizador.
2.5 Árvore de diretórios ("pastas")
A organização de diretórios do GNU/Linux tem o padrão Filesystem
Hierarchy Standard (FHS), ou em português Hierarquia Padrão do Sistema de
Arquivos. A principal vantagem deste conjunto de regras é a capacidade de
predizer o local dos arquivos. Segue lista padrão de diretórios definidos pela
FHS:
Diretório Descrição
/ Nível raiz
bin Diretório de comandos programas essenciais ao sistema.Acesso de nível público
boot Arquivos de configuração do sistema de arranque
dev Arquivos de dispositivos
etc Arquivos de configuração de sistema
home Neste local ficam armazenados os diretórios pessoais dosusuários comuns
lib Bibliotecas compartilhadas e módulos do kernel
media Ponto de montagem para dispositivos removíveis
mnt Ponto de montagem temporário para sistema de arquivos
proc Diretório virtual onde ficam as informações do sistemaobtidas do Kernel
root Diretório pessoal do usuário root
run Dados de execução variáveis
sbin Binários essenciais ao sistema; somente o root tem privilégiopara executá-los
sys Contém praticamente as mesmas informações do diretórioproc, porém, mais organizadas
tmp
Arquivos temporários. Por exemplo: dados temporários
criados por programas ou usuários são salvos aqui. Ao
reiniciar o sistema, este diretório é esvaziado
usr
Diretório onde ficam os programas dos utilizadores
(/usr/bin), bibliotecas (/usr/lib), documentação
(/usr/share/doc) etc. São programas portáveis e não
essenciais ao sistema
var Dados variáveis. Por exemplo, arquivos de log
srv Dados para os serviços disponibilizados pelo sistema e deacesso público
opt Pacotes de software e aplicações adicionais que não fazemparte do sistema
Tabela 1 - Hierarquia Padrão do Sistema de Arquivos GNU/Linux
Atenção: qualquer GNU/Linux deve conter fisicamente na partição raiz,
os diretórios /bin, /sbin, /etc, /lib, /etc e /dev. Do contrário não será
possível iniciar o sistema.
Ao longo desta obra voltarei a mencionar os diretórios mais relevantes e/ou
importantes ao nosso estudo, conforme a necessidade for surgindo.
2.6 Case-sensitive
O GNU/Linux é um sistema case-sensitive, ou seja, diferencia letras
maiúsculas de minúsculas. Sendo assim, tome muito cuidado ao referenciar
diretórios e arquivos. Por exemplo:
/bin
/Bin
/biN
/BIN
Apesar da semelhança, os quatro diretórios citados acima são referências
distintas. O mesmo se aplica a comandos. Por exemplo:
pwd
Pwd
pWD
PWD
A escrita correta desse comando tem todos os caracteres em caixa baixa; ao
escrever de forma diferente o sistema irá apresentar uma crítica de que o
comando não existe ou não foi encontrado.
2.7 Referências absoluta e relativa
Existem duas vias para se apontar um alvo/destino em um ambiente
GNU/Linux:
Referência absoluta: caminho completo (absoluto) para o diretório,
arquivo ou recurso;
Referência relativa: este é um apontamento que leva em consideração a
sua posição atual no sistema.
Vamos a um exemplo prático. Para isso, considere a estrutura da figura
abaixo:
Figura 4 - Estrutura de diretórios
Veja as formas possíveis de se deslocar do diretório var para o bkp (Figura
4):
Referência absoluta: /etc/bkp
Referência relativa: ../etc/bkp
Os 2 pontos (..) indicam um nível acima. Vamos supor que você está no
diretório bkp (Figura 4) e deseja voltar para a raiz do sistema (/); então você
necessita subir 2 níveis, e para isso deve usar a representação (../..). Os
primeiros 2 pontos tiram você do diretório bkp e o colocam dentro do etc; a
próxima ocorrência irá tirá-lo do diretório etc e, dessa forma, você estará no
diretório raiz, representado por um sinal de barra (/).
Devemos ter muita atenção ao utilizar referência relativa, pois este tipo de
apontamento é variável. Para fixar o entendimento, veja os exemplos abaixo,
baseados na estrutura da Figura 4:
Diretório atual: var
Destino: arquivos
Via referência absoluta: /etc/arquivos
Via referência relativa: ../etc/arquivos
Veja outro exemplo:
Diretório atual: arquivos
Destino: bkp
Via referência absoluta: /etc/bkp
Via referência relativa: ../bkp
Na referência absoluta nosso ponto de partida é a raiz do sistema; como
tudo está abaixo deste nível, independentemente de onde estiver no sistema, o
destino será sempre alcançado. Já na referência relativa esse apontamento
tem que se adequar a sua posição atual no sistema, ou seja, acaba sendo
uma forma relativa/volátil de apontar um destino.
2.8 Entrada e saída padrão de dados
Ao trabalhar com GNU/Linux, ouvimos falar muito de entrada e saída padrão
de dados; diante disso se faz necessário compreender melhor este conceito. A
entrada padrão de dados é o teclado e a saída é a tela do computador. Existem
três termos que fazem parte deste conceito. São eles:
stdin: representa a entrada padrão de dados => Teclado
stdout: representa a saída padrão de dados => Tela
stderr: saída padrão de erros => Tela
2.9 Resumo
Neste capítulo tivemos nosso primeiro contato prático com o GNU/Linux,
entendemos o funcionamento do sistema e seu padrão organizacional, capaz
de predizer o local onde determinado arquivo será alocado.
Conceitos como logon, logout, terminal virtual e shell foram devidamente
apresentados.
A proposta de conteúdo para o capítulo 2 poderia render facilmente mais
algumas páginas, talvez algumas dezenas. Porém, este grau de detalhamento
adicional poderia quebrar a proposta de objetividade, simplicidade e
relevância, considerando a temática de conteúdo essencial proposta para esta
obra.
Capítulo 3 - Comandos Programas essenciais
"Busco um instante feliz que justifique minha existência."
- Fiódor Dostoiévski
O termo comando é uma forma popular de fazer referência aos programas
comuns a quase todas as distribuições GNU/Linux. Em geral um comando
nada mais é do que um arquivo binário.
Ao executar os comandos listados mais adiante, não se esqueça que o
caractere cifrão ($), presente à esquerda do cursor, indica que este pode ser
executado pelo usuário comum; já a tralha (#) indica que este deve ser
obrigatoriamente executado pelo usuário root.
3.1 Comandos Programas básicos
Esta obra não tem como objetivo ser um guia/manual de comandos, ou seja,
irei citar de forma resumida os comandos e opções mais utilizados no dia-a-
dia, detalhando e me aprofundando somente em casos excepcionais.
3.1.1 help
É uma opção de ajuda rápida, utilizada para consultar as opções
disponibilizadas por um programa. Sua sintaxe é:
$ [comando] --help
Devemos substituir o marcador [comando] pelo programa para o qual
desejamos obter ajuda. Veja:
Figura 5 - Retorno do comando de ajuda
A seta em vermelho (primeira linha) mostra que foi solicitada ajuda para o
comando ls (apresentado adiante). Na segunda linha temos uma
demonstração de como o comando deve ser usado; já nas linhas seguintes
temos o restante dos parâmetros aceitos pelo programa, neste caso o ls.
3.1.2 man
As páginas de manual do GNU/Linux contêm a descrição dos comandos,
bem como listam de forma detalhada as opções disponíveis e como elas
funcionam. Sua sintaxe é:
$ man [opções] [comando]
Opções internas (disponíveis no manual):
q: sai do manual;
PageDown ou f: rola 25 linhas para baixo;
PageUp ou w: rola 25 linhas para cima;
Seta para cima ou k: rola 1 linha para cima;
Seta para baixo ou e: rola 1 linha para baixo;
p ou g: volta para o início;
h: mostra a página de ajuda do manual.
Opções:
-k: caso não saiba o nome de um determinado comando, bastautilizar
essa opção para buscar ocorrências dentro do manual e retornar os
possíveis comandos.
3.1.3 logout
Os comandos abaixo podem ser utilizados para encerrar nossa sessão no
terminal:
$ exit
$ logout
$ <CTRL> + d
3.1.4 shutdown, poweroff e halt
Os comandos abaixo podem ser utilizados para desligar a máquina:
# shutdown -h now
# poweroff
# halt
Todos os comandos acima possuem basicamente a mesma finalidade, porém,
o comando shutdown permite agendar desligamento, programar reboot etc.
Experimente utilizar o help para obter ajuda; exemplo: "shutdown -help".
Pessoalmente gosto de utilizar o comando poweroff para desligar a máquina.
Ele funciona como um alias (apelido) para o "shutdown -h now", com a
vantagem de ser curto e fácil de decorar.
3.1.5 reboot
Comando responsável por reiniciar a máquina:
# reboot
3.1.6 pwd (print working directory)
Imprime na tela o caminho absoluto para o diretório corrente (atual):
$ pwd
Resultado:
Figura 6 - Retorno do comando pwd
3.1.7 history
Lista os comandos mais recentes executados no terminal. Este é um recurso
do bash (discutido no capítulo anterior). Exemplo de uso:
$ history
Resultado:
Figura 7 - Retorno do comando history
Observe que temos no lado esquerdo um valor numérico identificando cada
comando. Aproveito para deixar a seguinte dica: se você utilizar um sinal de
exclamação + o número + a tecla ENTER, por exemplo, !7, no meu caso iria
ser autoexecutado o comando da posição 7, ou seja, essa instrução serve
como atalho para comandos presentes no history (histórico).
Caso seu shell seja o bash, utilize as setas para cima e para baixo para
percorrer o histórico.
Para descobrir o shell atualmente em uso, basta imprimir o valor da variável
de sistema $0:
$ echo $0
Resultado:
Figura 8 - Lista o shell atual
O retorno acima confirma que estamos usando o bash. Caso queira mudar
para outro shell, por exemplo, sh, basta digitar sh e pressionar ENTER; já
para sair de um shell basta digitar exit e pressionar ENTER.
3.2 Manipulação de arquivos e diretórios
O conjunto de comandos a seguir nos permite identificar o diretório corrente,
listar, copiar, mover e excluir arquivos e diretórios.
3.2.1 ls (list)
Utilizado para listar o conteúdo de um diretório ou as propriedades de um
arquivo. Sintaxe
$ ls [opções] [caminho_do_arquivo_ou_diretório]
3.2.1.1 Listando o conteúdo do diretório corrente
Na ausência do parâmetro de caminho, este comando lista o conteúdo do
diretório corrente:
ls
Resultado:
Figura 9 - ls sem retorno
O comando ls executado acima não retornou nenhum valor, o que significa
que no diretório corrente não existe nenhum conteúdo para ser listado, ou que
os conteúdos estão ocultos (isso será discutido mais adiante).
3.2.1.2 Opções (atributos de listagem)
As opções podem listar mais informações ou até mesmo formatar os dados
apresentados:
$ ls -lt /home
Resultado:
Figura 10 - ls -lt /home
Iremos analisar a Figura 10 linha por linha. Sendo assim, vamos à 1ª linha:
ls: lista o conteúdo presente no diretório ou as propriedades do arquivo
informado;
-lt: o sinal de menos (-) indica que o valor seguinte é um atributo
(opção). A letra l (L minúsculo) lista as propriedades do conteúdo
retornado, e a letra t é utilizada para ordenar a lista em ordem
cronológica, o que é interessante para diretórios com muitos arquivos;
/home: diretório a ser considerado como alvo do comando.
Na 2ª linha, o valor "total 4" representa o total de blocos do sistema de
arquivo que estão sendo utilizados pelo conteúdo listado. Este conceito é um
pouco avançado, porém, irrelevante ao escopo desta obra. Sendo assim,
deixaremos para tratar deste assunto em uma outra oportunidade.
Já a 3ª linha indica uma sequência de propriedades. Analisaremos cada uma
delas:
Figura 11 - Atributos
Respectivamente:
drwxr-xr-x: no momento vamos nos apegar somente ao primeiro
caractere do grupo:
- (hífen): arquivo;
b: dispositivo de bloco;
c: dispositivo de caractere;
d: diretório;
l: link, equivalente aos atalhos no ambiente Windows;
s: socket.
2: número de hard links (irrelevante a nosso estudo);
user user: respectivamente, usuário e grupo. Será mais bem apresentado
mais adiante;
4096: tamanho do arquivo em bytes;
Jul 2 00:15: respectivamente, mês, dia e hora de criação;
user: essa última coluna indica o nome do elemento listado.
3.2.1.3 Listar arquivos ocultos
Para listar um arquivo oculto é muito simples: basta utilizar o atributo -a.
Veja:
$ ls -a
No exemplo acima estamos listando os arquivos ocultos do diretório corrente,
porém, poderíamos informar outro diretório, ou até mesmo substituir a opção
-a por -al (L minúsculo), respectivamente, para mostrar arquivos ocultos e
listar as suas propriedades. No universo Linux, um arquivo oculto é
representado por um ponto final (.) à esquerda de seu nome. Por exemplo:
.exemplo1
.arquivo_oculto
Para tirar a propriedade de oculto, basta renomear o arquivo ou diretório
retirando o ponto; já para ocultar, basta adicionar o caractere ponto. Veremos
como fazer isso mais adiante.
3.2.2 cd (change directory)
Muda o diretório atual, ou seja, permite que efetuemos o deslocamento pela
hierarquia de diretórios do sistema. Sintaxe:
$ cd [diretório]
3.2.3 cp (copy)
Permite copiar arquivos e diretórios. Sintaxe:
cp [opções] [origem] [destino]
Opções:
-i: pergunta antes de substituir arquivos;
-f: substitui arquivos sem perguntar;
-v: mostra o progresso da cópia de arquivos;
-r: copia o diretório e todos os seus arquivos recursivamente.
3.2.4 rm (remove)
Remove arquivos e diretórios. Sintaxe:
rm [opções] [caminho_do_arquivo_ou_diretório]
Opções:
-f: força a exclusão;
-v: apresenta o nome dos arquivos à medida que forem removidos;
-r: exclui recursivamente arquivos e diretórios. Sem este parâmetro só
serão excluídos diretórios vazios.
3.2.5 mkdir
Permite criar diretório no sistema. Sintaxe:
mkdir [opções] [caminho1/diretório1] [caminho2/diretório2]
Opções:
--verbose: mostra uma mensagem para cada diretório criado.
3.2.6 rmdir
Remove um diretório vazio. Sintaxe:
rmdir [caminho1/diretório1] [caminho2/diretório2]
3.2.7 cat (concatenar)
Este comando pode ser utilizado para concatenar arquivos ou ler seu
conteúdo. Nesta obra iremos focar na característica que permite ler/apresentar
conteúdo. Sintaxe:
cat [opções] [caminho1/diretório1] [caminho2/diretório2]
Opções:
-n: numera as linhas apresentadas;
-s: não mostra mais que uma linha em branco entre os parágrafos.
3.2.8 more
Este comando é utilizado para paginar o resultado apresentado na tela.
Sintaxe de uso:
more [opções] [arquivo]
Opções:
-- +num: inicia a visualização a partir da linha informada;
Opções internas:
f, ctrl+f ou barra de espaço para avançar uma página;
b ou ctrl+b para voltar uma página;
h: apresenta a lista de opções do aplicativo;
. (ponto final): repete o último comando aplicado;
q: encerra a visualização quando pressionado dentro do aplicativo.
Uma outra boa alternativa para paginação é o comando less, que é muito
semelhante ao more, porém permite a navegação linha a linha, além da
navegação por página igual à do comando more
3.2.9 cut (cortar)
Permite selecionar parte de um conteúdo, sendo normalmente utilizado para
filtrar colunas. Sintaxe:
cut [opções] [arquivo]
Opções:
-f [numCampos]: exibe os campos informados;
-d [caracteres]: define o delimitador a ser utilizado; o padrão é o TAB.
3.2.10 find
Pesquisa por arquivos ou diretórios no sistema. Sintaxe:
find [diretório] [opções/expressão]
Opções:
-iname [expressão]: faz a busca pelo nome do arquivo ou diretório;
-maxdepth [num]: nível máximo de diretórios abaixo do diretório de
busca;
-mtime [num]: busca por arquivos modificados [num] dias atrás;
-size [num]k: busca por arquivos com tamanho igual a [num] Kbytes.
-type [tipo]: procura por arquivo do [tipo]:
d: diretório
f: arquivo regular
l: link simbólico
Exemplos:
$ find /etc -iname casa
$ find / -type f -size +1000k
Na primeira linha, a consulta é feita somentedentro do diretório /etc por
qualquer arquivo que contenha em seu nome a palavra "casa". Já na segunda
linha, o caractere / indica que a consulta deve ser feita em toda a raiz do
sistema, -type f indica que devem ser pesquisados somente arquivos, e -size
+1000k que o tamanho tem que ser superior a 1000 Kbytes.
3.2.11 grep
Faz busca em arquivos. Sintaxe:
grep [opções] [expressão] [arquivo]
Expressão:
Palavra ou frase a ser pesquisada; se composta deve ser delimitada por aspas
duplas.
Opções:
-h: não mostra o nome dos arquivos durante a busca;
-i: ignora diferença entre maiúsculo e minúsculo;
-v: ignora ocorrências que contenham o valor informado;
-n: mostra o número da linha onde a ocorrência foi encontrada.
Exemplo:
grep -i '^Conteúdo' file.txt
O marcador ^ encontra as linhas iniciadas pela palavra "Conteúdo" no
arquivo file.txt
3.2.12 head
Lê por padrão as 10 primeiras linhas de um arquivo. Sintaxe:
head [opções] [arquivo]
Opções:
-n: altera o número padrão de linhas a serem lidas/apresentadas.
3.2.13 tail (lê do fim do arquivo)
Lê por padrão as 10 últimas linhas de um arquivo. Sintaxe:
tail [opções] [arquivo]
Opções:
-f: permite a leitura constante do arquivo, o que é recomendado para
arquivos que estão crescendo, quando há necessidade de acompanhar o
que está sendo inserido em tempo real;
-n: altera o número padrão de linhas a serem lidas/apresentadas.
3.2.13 tail (lê do fim do arquivo)
Lê por padrão as 10 últimas linhas de um arquivo. Sintaxe:
tail [opções] [arquivo]
Opções:
-f: permite a leitura constante do arquivo, o que é recomendado para
arquivos que estão crescendo, quando há necessidade de acompanhar o
que está sendo inserido em tempo real;
-n: altera o número padrão de linhas a serem lidas/apresentadas.
3.2.14 wc (contar)
Conta caracteres, palavras e linhas. Sintaxe:
wc [opções] [arquivo]
Opções:
-l: conta linhas;
-m: conta caracteres;
-w: conta palavras.
3.2.15 tar (empacotar e desempacotar)
O empacotamento visa a "pegar" vários arquivos ou diretórios e jogá-los
dentro de um "envelope" único, ou seja, como resultado final teremos um
arquivo único. Veja a sintaxe:
$ tar [opções] [arquivo_final.tar] [arquivo1|diretório1] 
[arquivo2|diretório2]
Opções:
-c: Cria o arquivo final;
-z: Especifica o tipo como gzip (.gz);
-j: Especifica o tipo como bzip2 (.bz2);
-x: Indica que o conteúdo será extraído;
-v: Ativa o modo verbose, ou seja, lista todo o processo em tempo de
execução;
-f: É obrigatório, esse comando vem de file (arquivo).
Exemplo:
$ tar -zcf pacote.tar.gz arquivo.txt foto.png /home/user
Conforme pode ser observado, informamos o nome do arquivo a ser gerado,
no exemplo acima pacote.tar.bz, e podemos passar um arquivo, diretório ou
uma lista de vários arquivos e diretórios a serem empacotados. Observe que
ao empacotamento foi adicionada a opção -z; isso irá instruir o tar que, após o
empacotamento, ele deve compactar este arquivo com gzip. Já para extrair
poderíamos fazer o seguinte:
$ tar -zxf pacote.tar.gz /diretório_destino
Caso o diretório de destino seja omitido, os arquivos serão extraídos e
posteriormente desempacotados no local em que o comando foi executado.
3.2.16 gzip e bzip2 (compactar e descompactar)
Estes só realizam a compactação de arquivos, ou seja, se tiver diretório no
meio da história isso será um problema. Qual a solução mais simples? Utilize
o empacotamento tar para gerar um arquivo único e posteriormente
compacte-o com um dos comandos abaixo:
$ gzip [opções] pacote.tar
$ bzip2 [opções] pacote.tar
Opções:
-d: utilizado para extrair.
Normalmente o bzip2 gera arquivos menores, porém, seu tempo de
compactação é um pouco maior.
3.2.17 Outros comandos
Essa obra não tem como objetivo ser um guia de comandos, logo, deixarei
abaixo uma lista de comandos igualmente importantes, porém, caberá a você
buscar mais informações sobre eles:
chown: altera o dono e o grupo do arquivo ou diretório
file: determina o tipo de um arquivo
df: exibe o espaço em disco
du: informa o tamanho dos objetos
free: mostra informações da memória RAM e memória SWAP
date: informa data/hora
uptime: mostra há quanto tempo o computador está ligado
uname -a: mostra a versão do kernel
diff: mostra a diferença entre 2 arquivos
awk: um cut mais sofisticado que permite busca por expressão regular
sed: editor de texto linha a linha
paste: junta arquivos na saída padrão
whereis: mostra o caminho do binário e das páginas de manual do
comando informado
which: mostra somente o caminho do binário comando informado
ps: lista processos
type: revela o tipo do arquivo
kill: finaliza/mata processos
time: permite identificar quanto tempo levou a execução de um
programa
touch: cria arquivo vazio
sudo: permite ao usuário obter privilégios de outro usuário,
normalmente do root
uniq: remove linhas duplicadas
A lista vai muito além dos comandos listados acima, porém, como já foi dito,
esta obra não é um manual de comandos.
Caso queira pesquisar outros comandos, obter definições mais completas
e exemplos de uso para os comandos acima, sugiro que visite o endereço:
http://www.uniriotec.br/~morganna/guia/index_guia.html
http://www.uniriotec.br/~morganna/guia/index_guia.html
3.3 Curingas
Os curingas são recursos utilizados para que possamos nos referir a um
conjunto de arquivos ou diretórios de forma genérica, permitindo que mais de
um arquivo ou diretório seja manipulado ao mesmo tempo. Com este recurso
somos capazes de realizar pré-seleções e buscas avançadas. As possibilidades
são infinitas; nesta obra iremos focar na sua forma de uso mais cotidiana,
contudo, nada o impede de se aprofundar no assunto ao buscar mais
informações na web.
Existem basicamente três tipos de curingas:
* (asterisco): atua como substituto para uma sequência de caracteres;
? (interrogação): atua como substituto para um caractere;
[] (colchetes): atuam como substitutos para um conjunto de caracteres
predefinidos.
Exemplos básicos de uso:
No exemplo abaixo, informamos que iremos remover qualquer
arquivo/diretório que comece com "arq", tenha qualquer sequência posterior
e termine com ".txt":
$ rm arq*.txt
Já neste exemplo iremos remover qualquer arquivo/diretório que comece com
qualquer letra , seguida pela sequência "rquivo", e finalize com qualquer
sequência de caracteres:
$ rm ?rquivo.*
Existe ainda a possibilidade de realizar buscas considerando um intervalo
alfanumérico ou uma lista predefinida:
$ rm arquivo[2,4].txt
Na sentença acima estamos removendo o arquivo2.txt e o arquivo4.txt,
porém, se no lugar da vírgula tivéssemos colocado um hífen (-),
removeríamos o intervalo que vai de 2 a 4.
Os curingas podem ser utilizados no sistema como um todo, não somente
com o comando rm.
3.4 Utilizando | (pipe) para direcionar o
processamento
O pipe, representado por uma barra ( | ), permite enviar a saída (stdout) de um
programa para a entrada (stdin) de outro; este recurso é muito interessante,
pois permite que o programa seguinte continue o processamento dos dados.
Exemplo:
ls /etc | sort
No comando acima utilizamos o "ls" para listar os arquivos do diretório
"/etc"; inserimos um pipe para pegar essa saída e mandar para o programa
"sort". Este programa tem a função de ordenar caracteres alfanuméricos, ou
seja, ele irá reordenar em ordem alfanumérica a saída do ls.
É possível encadear quantas instruções forem necessárias; isso vai depender
da sua necessidade.
3.5 Encadeando execuções com ; (ponto e vírgula) e
&&
Podemos encadear execuções ao utilizar os símbolos ; (ponto e vírgula) e
&& (dois "e" comerciais). Existe uma diferença sutil, porém, extremamente
relevante entre essas duas formas de encadear execuções. Veja como utilizá-
las:
cd /ettc ; ls /
cd /ettc && ls /
A primeira instrução irá retornar uma lista de diretórios. Já a segunda, uma
mensagem de erro informando que o arquivo ou diretório não foi encontrado.
Ao utilizar ; (ponto e vírgula) somos capazes de encadear numa mesma linha
várias instruções a serem executadas sequencialmente,e independentemente
do resultado da instrução anterior a próxima será executada. Já ao utilizar
&&, instruímos o sistema a executar a próxima instrução somente se a
anterior tiver sido executada com sucesso.
No exemplo acima, a linha 2 não realizou a listagem de diretórios pois o /ettc
não existe, logo a instrução "cd /ettc" foi concluída com erro, não passando
assim na validação do &&.
3.5.1 Exemplos
ls -l /etc | more
ls -l /etc | wc
Os comandos acima haviam sido apresentados como manipuladores de
arquivos, porém, estes podem ser utilizados com pipe (|) para processar a
saída de outro comando.
Essa forma de uso não se limita aos programas apresentados até aqui.
3.5.2 Redirecionar saída com > ou >>
O pipe pega a saída de um comando e joga para a entrada do outro; isso
permite um processamento encadeado.
Já os operadores > e >> permitem redirecionar a saída para um arquivo:
> (sinal de maior que): permite redirecionar a saída para um arquivo.
Caso este arquivo exista, seu conteúdo anterior será apagado; do
contrário, ele será criado;
>> (dois sinais de maior que): permite redirecionar a saída para um
arquivo. Caso o arquivo exista, a saída será adicionada ao seu fim; do
contrário, um arquivo será criado.
Exemplo:
ls -l /etc > /tmp/output.txt
A instrução acima lista o conteúdo do diretório /etc e redireciona a saída que
seria apresentada na tela para o arquivo output.txt que não existia no
diretório /tmp, e portanto foi criado. Para ver o fruto de seu trabalho, utilize o
comando de leitura cat da seguinte forma:
cat /tmp/output.txt
Viu só? O conteúdo gerado pelo comando ls -l está no arquivo, logo o
redirecionamento ocorreu com sucesso. Este recurso é muito valioso; pode ter
certeza de que em algum momento irá precisar dele para gerar relatórios,
salvar lista de arquivos ou até mesmo output de algum shell script (tema para
outro momento).
3.6 Atalhos essenciais
Os atalhos abaixo têm como objetivo facilitar nossa vida. Neste caso em
especial, os caracteres digitados não são case-sensitive, ou seja, tanto faz
digitá-los em minúsculo ou maiúsculo, seu efeito será o mesmo:
Pressione Back Space para apagar um caractere à esquerda do cursor;
Pressione Delete para apagar o caractere acima do cursor;
Pressione CTRL + L ou Home para colocar o cursor no início da linha;
Pressione CTRL + E ou End para colocar o cursor no final da linha;
Pressione CTRL + U para apagar o que estiver à esquerda do cursor. O
conteúdo apagado pode ser colado ao pressionar CTRL + Y;
Pressione CTRL + K para apagar o que estiver à direita do cursor. O
conteúdo apagado pode ser colado ao pressionar CTRL + Y;
Pressione CTRL + L para limpar a tela;
Pressione CTRL + C para abrir uma nova linha de comando,
descartando a atual;
Pressione CTRL + D para sair do shell.
3.7 Resumo
O segredo para ter sucesso neste capítulo não está em decorar a lista de
comandos, mas sim em saber que determinada ação pode ser executada.
Quando precisar executar a ação desejada, você pesquisa o comando e utiliza
o man e o help para saber como ele funciona. Com o passar do tempo, você
irá naturalmente decorar as opções mais relevantes.
Além dos comandos, vimos como utilizar curingas, pipe, redirecionadores de
saída e operadores de encadeamento, porém, nada disso irá fixar-se na mente
se você não praticar; então, antes de ir para o próximo capítulo, sugiro que
volte ao início deste e teste todos os comandos passados até aqui.
Mãos à obra!
Capítulo 4 - Usuários, grupos e permissões
"Pensa como pensam os sábios, mas fala como falam as pessoas
simples."
- Aristóteles
Um dos recursos do GNU/Linux que mais me encanta é o seu controle de
permissões baseado em usuários e grupos, recurso este que atribui ao sistema
do pinguim uma camada extra de segurança.
Neste capítulo iremos aprender a criar usuários e grupos, bem como a
manipular suas propriedades e permissões.
4.1 O que é um usuário
Indivíduo que tem direito ou privilégio de usar ou usufruir de algo. No
escopo deste capítulo, o usuário será um indivíduo que terá ou não permissão
para modificar, visualizar e/ou executar algo no sistema.
4.2 O que é um grupo de usuários
É um conjunto de pessoas ou indivíduos que possuem ou buscam os mesmos
objetivos. No escopo deste capítulo, os grupos são formados por usuários que
terão privilégios ou permissões comuns entre si. É mais simples/rápido
gerenciar grupos de usuários do que usuários de forma individual.
4.3 O que são permissões
Segundo o dicionário, são o consentimento, a licença, a autorização dada a
alguma coisa. No universo GNU/Linux as permissões são mecanismos pelos
quais restringimos ou autorizamos os usuários ou grupos a modificar,
visualizar ou executar algo.
4.4 Gerenciamento de usuários e grupos
É trivial que todo utilizador de sistemas saiba criar, editar e excluir usuários e
grupos. Tendo, é claro, a consciência da importância desses recursos, de
como eles realmente funcionam e seus benefícios.
Antes de prosseguirmos, é importante que você saiba da existência de dois
arquivos altamente importantes no nível de sistema. São eles:
/etc/passwd: é a base onde ficam armazenados os usuários da máquina;
/etc/shadow: é a base onde ficam armazenadas as senhas (hash) dos
usuários;
/etc/group: é a base onde ficam armazenados os grupos existentes.
4.4.1 Criar usuário
Existem basicamente duas formas de criar um usuário no sistema. Veja a
sintaxe:
# useradd zezinho
# adduser zezinha
useradd: cria um usuário simples, que não possui senha nem diretório
/home;
adduser: cria um usuário completo, com senha e diretório /home.
Estes nomes de usuários são interessantes para nós, meros mortais, porém, o
sistema não os compreende. Quando um usuário é criado, a ele é atribuído
um ID, pelo qual o sistema interpreta e identifica os usuários. Para consultar
um ID, utilize a instrução:
$ id nome_do_usuário
Será retornada uma linha com três colunas:
uid: id do usuário;
gid: id do grupo do usuário;
grupos: id dos grupos dos quais o usuário faz parte.
Conforme já foi dito anteriormente, o arquivo /etc/passwd é a base onde
ficam armazenados os usuários da máquina. Logo, se faz necessário entender
que este arquivo é dividido em 7 campos separados por dois-pontos (:). Os
 respectivos campos são:
Nome do usuário (login);
Senha do usuário (se preenchida com x, então aponta para /etc/shadow);
ID do usuário;
ID do grupo principal do usuário;
Informações pessoais do usuário;
Diretório /home do usuário;
Shell padrão do usuário.
Agora que sabemos da existência do arquivo /etc/passwd e de como ele é
estruturado, podemos utilizar o cut para listar o login dos usuários e seus
respectivos IDs. Veja:
$ cut -f1,3 -d: /etc/passwd
A opção -f é onde indicamos os campos que desejamos selecionar, o -d é
onde informamos o delimitador, neste caso os dois-pontos, e por fim o
arquivo alvo.
4.4.2 Editar usuário e senha
Para alterar configurações do usuário, como grupo principal, shell, data de
expiração e outras, utilize o usermod. Darei o caminho das pedras, mas o
resto é com você:
# usermod --help
Para alterar a senha do usuário, utilize:
$ passwd
Caso o comando seja executado conforme acima, este irá alterar a senha do
usuário que o executou. Se for informado um login, será alterada a senha do
usuário informado, porém, para isso, você necessita ter privilégio de root.
Já para alterar informações adicionais como nome completo do usuário,
telefone etc., utilize:
chfn
4.4.3 Excluir usuário
O processo de exclusão da conta de um usuário se dá por meio da instrução:
# userdel -r login
A opção -r é utilizada para remover o diretório /home do usuário; caso
contrário, somente o seu login seria removido.
4.4.4 Criar um grupo
O processo de criação de um novo grupo se dá por meio da instrução:
# groupadd nome_do_grupo
A instrução abaixo permite consultar os grupos e seus respectivos IDs:
$ cut -f1,3 -d: /etc/group
$ cut -f1,3 -d: /etc/group | grep -i nomeDoGrupo
A primeira instrução retorna todos os grupos e seus respectivosIDs. Já a
segunda instrução faz um filtro por meio do grep (-i = ignora diferença entre
maiúsculo e minúsculo) e retorna somente o grupo informado.
4.4.5 Adicionar e remover usuário de um grupo
Para adicionar o usuário a um grupo, utilize a sintaxe:
# gpasswd -a nome_do_usuario nome_do_grupo
Para remover o usuário do grupo, utilize a sintaxe:
# gpasswd -d nome_do_usuario nome_do_grupo
4.4.6 Excluir grupo
Para excluir um grupo, utilize a sintaxe:
# groupdel nome_do_grupo
4.4.7 Diretório home do usuário
Ao entrar no diretório home (/home/nome_do_usuario) de algum usuário, é
comum que você se depare com 4 arquivos ocultos; são eles:
.bash_history: histórico de comandos executados na sessão do usuário;
.bash_logout: comandos a serem executados no encerramento da sessão
do usuário;
.bashrc: alias para personalização do shell do usuário;
.profile: comandos a serem executados no início da sessão do usuário.
O arquivo .bash_history é criado dinamicamente. Mas, e os outros?
Responderei a essa pergunta com uma linha de comando:
$ ls -a /etc/skel
No diretório /etc/skel ficam os arquivos que serão copiados para o diretório
home do usuário sempre que uma nova conta for criada. Você pode modificar
os arquivos presentes no diretório ou até mesmo adicionar novos.
4.5 Gerenciamento de permissões
Para uma melhor compreensão do gerenciamento de permissões, faz-se
necessária uma demonstração prática; sendo sim, utilizaremos o arquivo
criado abaixo como objeto de estudo:
$ cd /tmp
$ touch arquivo
$ ls -l arquivo
Caso tenha executado todas as linhas corretamente, o retorno será algo como:
Figura 12 - Output ls -l arquivo
As letras rwx e o caractere - (sinal de hífen) são utilizados para representar as
permissões passiveis de atribuição a algum elemento do sistema, tais como
arquivos e diretórios:
r = leitura / read
w = escrita / write
x = execução / execution
- (sinal de hífen) = permissão desativada
Ao analisar a ocorrência rw-r--r-- presente na Figura 12, conseguimos
identificar que:
rw-: indicam que o dono do arquivo pode ler e escrever nele;
r--: indicam que os usuários do grupo podem ler o arquivo;
r--: as três últimas ocorrências indicam que os outros (qualquer um)
podem ler o arquivo.
Já a ocorrência subsequente de user user significa:
A primeira ocorrência de user faz referência ao proprietário (dono) do
arquivo;
A segunda ocorrência de user faz referência ao grupo que tem permissão
sobre o arquivo, ou seja, qualquer outro usuário que esteja neste grupo
irá herdar as permissões do grupo sobre o arquivo em questão.
4.5.1 Adicionar, remover e definir permissões com
chmod
Para adicionar, remover ou definir as permissões, utilizamos símbolos
representativos, ou seja, responsáveis por indicar o "tipo" de operação que
está sendo realizada. São eles:
+ (sinal de adição) = adiciona permissões
- (sinal de subtração) = remove permissões
= (sinal de igual) = define permissões
As permissões são aplicadas ao dono do arquivo, ao grupo atribuído ao
arquivo, a outros (qualquer usuário) ou a todos. Essa referência de
"entidades" é representada pelas letras:
u = dono
g = grupo
o = outros
a = todos
Para alterar permissões, utilizamos o chmod. Veja:
$ chmod u=w,g=rw,o=rw arquivo
$ ls -l arquivo
A instrução acima indica que:
O tipo de operação executada foi de definição, operação indicada pelo
sinal de igual (=);
O dono (u) do arquivo possui permissão de escrita;
O grupo (g) possui permissão de leitura e escrita;
Os outros (o) possuem permissão de leitura e escrita.
O novo conjunto de permissões após a execução da instrução será --w-
rw-rw-
O retorno do "ls -l arquivo" será:
Figura 13 - Permissões
Tente executar a instrução abaixo:
$ cat arquivo
retorno:
Figura 14 - Permissão negada
Não foi possível ler o arquivo; isso se deve ao fato de que o dono não possui
permissão de leitura, apenas de escrita. Para adicionar a permissão de leitura,
execute a instrução:
$ chmod -u+r arquivo
Ao tentar ler o arquivo novamente, teremos sucesso. Nenhum dado será
apresentado, pois o arquivo está vazio, porém agora temos permissão de
leitura.
As permissões do dono, do grupo e de outros podem ser alteradas de forma
individual conforme pode ser observado na operação de adição executada
logo acima, coletivamente ao utilizar a vírgula para separar o conjunto de
"entidades/pessoas" com permissões distintas, ou podem-se ainda informar
todas as "entidades" e respectivamente as permissões desejadas. Não se
esqueça que você pode utilizar a representação a (todos) para atribuir as
mesmas permissões a todos os três conjuntos de pessoas.
4.5.2 Usando chmod com método numérico
Já sabemos para que servem as letras rwx e o caractere - (sinal de hífen),
porém ainda não havíamos visto como representá-los em formato decimal.
Veja:
r (leitura / read) = 4
w (escrita / write) = 2
x (execução / execution) = 1
- (sinal de hífen / permissão desativada) = 0
Ao utilizar o chmod com método numérico, representamos o conjunto de
permissões por meio de uma sequência de 3 dígitos numéricos, sendo o
menor valor 000 e o maior, 777. Como a representação no método numérico
não se dá por meio de três grupos de três números, é necessário realizar um
cálculo para saber qual número representa um conjunto de permissões. Veja
um exemplo:
Exemplo de permissão Na representação octal
-wx (escrita e execução) 2 + 1 = 3
r-x (leitura e execução) 4 + 1 = 5
rw- (leitura e escrita) 4 + 2 = 6
rwx (leitura, escrita e execução) 4 + 2 + 1 = 7
Para simplificar o entendimento, vamos a uma pequena tabela pré-calculada:
Permissões Octal Binário Descrição
--- 0 000 Sem acesso
--x 1 001 Somente execução
-w- 2 010 Somente escrita
-wx 3 011 Escrita e execução
r-- 4 100 Somente leitura
r-x 5 101 Leitura e execução
rw- 6 110 Leitura e escrita
rwx 7 111 Leitura, escrita e execução
Veja um exemplo de uso:
$ chmod 753 arquivo
Ao analisar a instrução acima, podemos dividir a ocorrência 753 em três
partes:
7: permissão rwx, na primeira posição representa as permissões do dono;
5: permissão r-x, na segunda posição representa as permissões do grupo;
3: permissão -wx, na terceira (última) posição representa as permissões
dos outros.
4.5.3 Umask
Já notou que, ao criar um arquivo ou diretório, este já vem com uma máscara
padrão de permissão? Essa configuração padrão vem da variável de sistema
umask.
A variável umask também é um comando programa comum. Execute:
$ umask
Será retornado o valor 0022 (valor padrão), que não faz muito sentido, não é
mesmo? Experimente utilizar o próprio umask para traduzir esse número para
algo mais compreensivo:
$ umask -S
Será retornado o valor: u=rwx,g=rx,o=rx. Em outras palavras, esse é o
conjunto de permissões atribuído a qualquer novo arquivo ou diretório criado
no sistema.
4.5.3.1 Calcular umask
Fórmula: permissão máxima - permissão desejada =
 777
- 755
 022
Com o umask 0022, terei o seguinte conjunto de permissão:
u=rwx,g=rx,o=rx, que em formato decimal seria 755.
4.5.3.2 Umask para permissão
Fórmula: permissão máxima - umask =
 777
- 022
 755
O cálculo acima mostra que o umask 0022 representa o conjunto de
permissões 755. O umask é representado por 4 dígitos; o primeiro representa
permissões especiais vistas mais adiante.
4.5.3.3 Alterando umask
Podemos utilizar o próprio comando umask para alterar o valor padrão de
permissão. Veja:
$ umask 0077
Com essa instrução vamos impor a máscara 700 (o dono pode tudo e os
demais não podem nada). Porém, essa alteração é temporária e será esquecida
quando o usuário encerrar sua sessão.
Para fazer a alteração de forma permanente, é necessário modificar o umask
na profile do usuário (/home/.nome_do_usuario/.profile); não realizaremos
essa alteração agora pois ainda não apresentei a você, leitor, os editores de
texto, porém tenha em mente essa informação.
4.5.4 Permissões especiais
Além do conjunto de permissões simples que vimos, reading (leitura), writing
(escrita) e execution (execução), existe o conjunto das permissõesespeciais,
composto pelos termos SUID (set user id), SGID (set group id) e Sticky
(Sticky bit).
4.5.4.1 SUID (set user id)
A propriedade SUID pode ser aplicada a qualquer arquivo ou diretório,
porém, só terá efeito em arquivos executáveis . No contexto de sistema, o
usuário que executa um programa é dono do seu respectivo processo, porém,
a propriedade SUID nos permite mudar isso de modo que, ao disparar um
programa com essa propriedade, serão herdadas as permissões do dono do
programa, bem como o processo será iniciado com o respectivo ID do dono e
não do usuário que disparou o programa. No conjunto de permissões "rwsr--
r--", a letra "s" substitui a letra "x" no bloco de permissões do dono do
arquivo para representar uma propriedade SUID. Este campo pode assumir
dois valores:
s: significa que o dono possui permissão de execução;
S: significa que o dono não possui permissão de execução.
Para atribuir este conjunto de permissões, basta fazer assim:
$ chmod 4744 arquivo_executavel
$ chmod u+s arquivo_executavel
Já vimos como o chmod funciona, então vamos nos atentar somente ao que
desrespeita a propriedade SUID. O primeiro número "4" da sequência "4744"
e a letra "s" da expressão "u+s" representam uma propriedade SUID, que
pode ser atribuída ou removida como qualquer outra permissão.
Por fim, é interessante saber que podemos pesquisar arquivos que contenham
essa propriedade por meio de qualquer uma das instruções abaixo:
$ find /home/ -perm /u=s
$ find /home/ -perm +4000
Caso não tenha ficado claro, é importante salientar que a propriedade SUID
faz parte do conjunto de permissões aplicadas ao dono do arquivo.
4.5.4.2 SGID (set group id)
Quando se trata de arquivos executáveis, SUID e SGID possuem um
comportamento equivalente, ou seja, se comportam da mesma forma. A
diferença fica por conta de que, quando SGID é aplicada a um diretório, os
novos arquivos e subdiretórios criados dentro dele irão automaticamente
assumir o mesmo ID de grupo do diretório que recebeu a propriedade SGID.
No conjunto de permissões "rwxr-sr--", a letra "s" substitui a letra "x" no
bloco de permissões do grupo para representar uma propriedade SGID. Este
campo pode assumir dois valores:
s: significa que o dono possui permissão de execução;
S: significa que o dono não possui permissão de execução.
Para atribuir este conjunto de permissões, basta fazer assim:
$ chmod 2754 arquivo_executavel
$ chmod g+s arquivo_executavel
Já vimos como o chmod funciona, então vamos nos atentar somente ao que
desrespeita a propriedade SGID. O primeiro número "2" da sequência "2754"
e a letra "s" da expressão "g+s" representam uma propriedade SGID, que
pode ser atribuída ou removida como qualquer outra permissão.
Por fim, é interessante saber que podemos pesquisar arquivos que contenham
essa propriedade por meio de qualquer uma das instruções abaixo:
$ find /home/ -perm /g=s
$ find /home/ -perm +2000
Caso não tenha ficado claro, é importante salientar que a propriedade SGID
faz parte do conjunto de permissões aplicadas ao grupo.
4.5.4.3 Sticky (sticky bit)
Quando aplicado a arquivos executáveis, faz com que o sistema mantenha
uma imagem deles na memória; isso irá melhorar o desempenho na próxima
execução, mas utilize essa capacidade com sabedoria: lembre-se que a
memória RAM é um recurso limitado. Já em diretórios, essa propriedade
impede que outros usuários possam deletar ou renomear arquivos dos quais
não são donos independentemente das permissões que possuam; somente o
dono e o root serão capazes de executar tais ações.
No conjunto de permissões "rwxr-xrwt", a letra "t" substitui a letra "x" no
bloco de permissões que representa outros usuários. Este campo pode assumir
dois valores:
t: significa que os outros usuários possuem permissão de execução;
T: significa que os outros usuários não possuem permissão de execução.
Para atribuir este conjunto de permissões, basta fazer assim:
$ chmod 1757 diretório
$ chmod o+t diretório
Já vimos como o chmod funciona, então vamos nos atentar somente ao que
desrespeita a propriedade Sticky bit. O primeiro número "1" da sequência
"1757" e a letra "t" da expressão "o+t" representam uma propriedade Sticky
bit, que pode ser atribuída ou removida como qualquer outra permissão.
Por fim, é interessante saber que podemos pesquisar arquivos que contenham
essa propriedade por meio de qualquer uma das instruções abaixo:
$ find /home/ -perm /o=t
$ find /home/ -perm +1000
Caso não tenha ficado claro, é importante salientar que a propriedade Sticky
bit faz parte do conjunto de permissões aplicadas ao grupo.
4.5.4.4 Vantagens (SUID, SGID e Sticky bit)
Pode ser que você esteja pensando: "mas qual a real vantagem destas
permissões especiais?". Simples: promover uma camada ainda mais
sofisticada de segurança. Calma, não fique estressado; irei explicar.
Vamos supor que existe um programa que somente o usuário "zezinho" pode
executar devido às suas permissões, porém, um belo dia você é informado
que outros usuários também devem ser capazes de executar este mesmo
programa. Quais são as possibilidades possíveis?
Adicionar os outros usuários ao grupo do "zezinho"? Talvez, mas e se
forem dezenas ou centenas de usuários? Lembre-se de que, ao colocar os
usuários no grupo do "zezinho", você dará acesso a todos a
/home/zezinho e, consequentemente, a todos os seus arquivos;
Poderíamos criar um novo grupo e adicionar todos os usuários a ele;
depois bastaria alterar o grupo do arquivo com o comando chown. Mas,
novamente, isso daria muito trabalho e não me parece certo;
Então, a "melhor" opção é utilizar SUID ou SGID para permitir que os
demais usuários ou grupos sejam capazes de executar o programa.
Já o Sticky bit é um recurso valioso que pode proteger os arquivos,
impedindo que sejam excluídos.
Lembre-se de que essas permissões especiais complementam as permissões
"simples" reading/writing e execution.
Por fim, é valido pontuar que:
s: possui permissão de execução;
S: não possui permissão de execução;
t: possui permissão de execução;
T: não possui permissão de execução.
As letras acima substituem a letra "x", que representa justamente a permissão
de execução. Mas tenha em mente que, se a nova letra for um "s" ou "t", isso
significa que o arquivo possui a permissão "x" e mais o recurso SUID, SGID
ou Sticky bit, dependendo da letra e da posição em que se encontra. O que
estou querendo pontuar é que a permissão de execução é "somada" à
permissão especial aplicada.
4.5.5 Sudo
O sudo faz parte do contexto de gerenciamento de permissões; ele permite
que um usuário comum possa executar uma ação que somente um usuário
com privilégios elevados teria autorização para executar, como por exemplo
o root.
O sudo é um comando programa que normalmente já vem instalado na
maioria das distribuições, e sua forma mais comum de uso é:
$ sudo ip
O ip é um programa que será apresentado ainda nos próximos capítulos,
porém, só o root tem permissão para executá-lo. Mas quando utilizamos o
sudo estamos indicando que o usuário comum que está logado deve ser
autorizado a executar a instrução seguinte; logo a senha do root será
solicitada e, caso esteja correta, a instrução será executada pelo usuário
comum, utilizando-se para tanto dos privilégios de root.
O sudo permite que os seguintes comportamentos sejam configurados:
Permitir que somente determinados usuários tenham acesso a executar
sudo;
Limitar o sudo para executar uma lista específica de instruções e
programas;
Solicitar ou não senha para executar determinado programa.
As possibilidades são muitas, logo não irei me aprofundar em mais detalhes;
deixarei esse desafio para você. Boa sorte!
4.6 Resumo
O gerenciamento de permissões sofisticado do GNU/Linux é um dos seus
grandes trunfos. Isso é o que proporciona a esse sistema operacional uma
camada de segurança mais robusta.
Neste capítulo, vimos como criar usuários e grupos, e como limitar o acesso
destes a diretórios, arquivos e recursos do sistema, utilizando-se do
mecanismo de permissões.

Outros materiais