Baixe o app para aproveitar ainda mais
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.
Compartilhar