Prévia do material em texto
Ubuntu em Linha de Comando Operação e administração eficiente do Ubuntu Linux Fabrício Bueno 2015 B928u Bueno, Fabrício. Ubuntu em Linha de Comando / Fabrício Bueno. – Garopaba, SC, 2015. 153p. : il. Inclui referências. 1. Linux (Sistema Operacional de Computador). I. Título CDU 004.451.9 Sobre o Autor Fabrício Bueno é graduado em Ciência da Computação pela Pontifícia Universidade Católica de Goiás e mestre em Engenharia da Computação pela Universidade Federal de Goiás. Tem experiência profissional em diversas instituições: SERPRO, Agência Goiana de Administração e Negócios Públicos, Pontifícia Universidade Católica de Goiás, Universidade Federal de Goiás, Universidade Federal da Fronteira Sul e Instituto Federal de Santa Catarina (instituição onde atua como professor de Informática). É autor dos livros técnicos “Otimização Gerencial em Excel” e “Estatística para Processos Produtivos” pela editora VisualBooks, e dos livros Estaticópolis: um jeito novo de aprender Estatística, Estatística Básica para Processos Produtivos, Ubuntu em Linha de Comando, Introdução aos Testes de Invasão, Design de Logomarcas com Inkscape e Tratamento de Imagens com Gimp pela Amazon. É também autor das obras de ficção Estações Marítimas: O Retorno ao Continente, O Olho e Outros Contos Insólitos, Gonecity e Outrora e outros contos insólitos pela Amazon. Contatos com o autor podem ser feitos por meio de seu e-mail fbbsantos@gmail.com Como este livro está organizado Pretende-se com este livro disponibilizar um texto introdutório e didático sobre administração de sistemas Linux através de linha de comando. Os capítulos deste livro apresentam uma breve introdução sobre os temas a serem apresentados, seguidos de exemplos práticos da utilização dos comandos, através de um diálogo com o leitor tendo em vista a importância de um texto introdutório ter caráter didático, em contrapartida de um texto de linguagem exclusivamente técnica (o que muitas vezes torna a leitura mais cansativa). Não é objetivo deste livro cobrir de forma aprofundada os temas discutidos, muito menos explorar de forma exaustiva todos os comandos existentes. Reserva-se ao leitor a necessidade ou o interesse em aprofundar em alguns dos temas aos quais é introduzido neste livro. Este livo está organizado em 12 capítulos. Nos dois primeiros capítulos é feita apresentação dos sistemas Linux e suas distribuições. No terceiro capítulo o leitor é introduzido à práticas comuns em operar o sistema através de linhas de comando. Nos capítulos quatro e cinco são tratados, respectivamente, o sistema de arquivos Linux e gerência de usuários. No capítulo 6 são tratadas propriedades e permissões de arquivos. O capítulo 7 traz uma apresentação de dois compactadores de arquivos bastante utilizados. O capítulos 8 apresenta uma introdução à programação shell. Os capítulos 9 e 10 tratam, respectivamente, da gerência de processos e gerência de pacotes. Nos capítulos 11 e 12 são discutidos comandos de gerência de hardware e rede. Todos os comandos e roteiros apresentados neste livro são baseados na distribuição Ubuntu, que é baseada no Linux Debian. Entretanto, a maior parte dos comandos aqui discutidos estão disponíveis em outras distribuições. Sumário Sobre o Linux Sobre o Ubuntu Linha de Comando Shell Sessões de Linha de Comando Comandos e argumentos Executando comandos com poderes de root Produtividade em Sessões de Linha de Comando Redirecionamento Canalização Sistema de arquivos Nomenclatura de discos e partições Identificando e manipulando partições Diferenças entre diretórios e arquivos Navegando pelo sistema de arquivos Manipulando arquivos e diretórios Executando Programas Manipulando arquivos de texto Diretórios importantes /bin /boot /dev /etc /home /lib /media e /mnt /opt /proc /root /sbin /tmp /usr /var Montagem e informações de partições Gerência de Usuários Propriedade e Permissões de Arquivos Propriedades de arquivos Permissões de Arquivos Permissões de Diretórios Identificando Permissões e Propriedade Alterando Permissões Alterando Proprietário Manipulando Arquivos Compactados Arquivos Zip Arquivos Tar Programação Shell Começando com o famoso “Olá mundo!” Utilizando variáveis do shell Criando variáveis Utilizando parâmetros Estruturas condicionais Estruturas de repetição Gerenciamento de Processos Gerenciamento de Pacotes DPKG APT Gerência de Hardware Gerência de Rede Referências Bibliográficas Livros Publicados na Amazon Sobre o Linux Linux é um sistema operacional gratuito e de código aberto que pode ser encontrado em diversas distribuições. O kernel do Linux, ou seja, o núcleo deste sistema operacional, é baseado no sistema operacional Unix (mais especificamente no Minix), que foi criado em 1991 pelo finlandês Linus Torvalds. O nome Linux é uma junção de Linus e Unix. Inicialmente, o kernel do Linux era um sistema monotarefa bastante simples. Porém, um esforço conjunto que deste então tem envolvido milhares de desenvolvedores em todo o mundo, o que tornou o projeto deste sistema operacional cada vez mais complexo. Atualmente o Linux continua sendo um sistema operacional gratuito, sob licença GNU (GNU - Generic Public License, foi desenvolvida pela Free Software Foundation para definir termos de uso, distribuição e modificação de um programa) e tem atraído um número crescente de usuários, sendo o segundo sistema operacional mais utilizado por empresas de TI graças ao fato de ser um software aberto, gratuito, confiável, estável, flexível e de bom desempenho. Segundo dados da ASSESPRO (Federação das Associações das Empresas Brasileiras de Tecnologia da Informação) obtidos pela pesquisa disponível em http://assespro.org.br/na-midia/releases/2014-04-04-linux-e- usado-em-41-por-cento-das-empresas-brasileiras-de-ti-aponta-pesquisa/, 41% das empresas de TI utilizam Linux. Entretanto, este número é bastante inferior entre usuários finais. Segundo o portal w3schools.com, menos de 6% dos usuários finais utilizam Linux, conforme Pesquisa disponível em http://www.w3schools.com/browsers/browsers_os.asp. Apesar de o kernel do Linux ser único, cujo responsável pela distribuição é o Linux Kernel Organization, há várias distribuições disponíveis. De acordo com o site DistroWatch.com há atualmente cerca de 791 distribuições ativas de Linux. Cada distribuição possui características próprias como diferentes interfaces, diferentes mantenedores e patrocinadores, público-alvo específico, e um conjunto de softwares utilitários e de uso específicos inclusos, todos sob licença GNU. Não se deve classificar uma distribuição como melhor que outra, pois cada uma visa servir a um público diferente. Além disso, não há distribuição perfeita. O que deve ser levado em conta no momento de escolher uma distribuição (Valle, 2010): ● Os usuários desta distribuição são experts, usuários intermediários ou usuários básicos? ● Deseja-se utilizar esta distribuição em desktops e/ou servidores? ● Há fontes de consulta suficientes em seu idioma? ● Trata-se de uma distribuição madura? Há quanto tempo ela existe? Há riscos desta distribuição ser abandonada e seus usuários ficarem desamparados? ● A distribuição possui sistema de atualização on-line eficiente? Dentre as várias distribuições Linux disponíveis, pode-se citar: ● SUSE; ● Red Hat; ● Ubuntu; ● Slackware; ● Debian Este livro adotou a distribuição Ubuntu, escolha que será justificada na próxima seção. Entretanto, este livro não se restringe a esta distribuição, uma vez que os comandos apresentadossão, em sua maioria, comuns a todos as distribuições Linux. Sobre o Ubuntu Ubuntu é uma distribuição do sistema operacional Linux, cujo projeto foi criado em 2004 pela Canonical, empresa fundada por Mark Shuttleworth. O Projeto Ubuntu é guiado pela ideia de que softwares devem ser inclusivos, sendo possível para qualquer um, em qualquer lugar, usar, compartilhar ou modificar o Ubuntu (Mota, 2012). Esta distribuição é voltada para usuários finais, portanto, de fácil uso. Entretanto o Ubuntu possui versões para diversas arquiteturas computacionais e é comumente utilizada em servidores. O usuário do Ubuntu encontrará praticamente todos os recursos disponíveis no Windows e no Macintosh OS X, e, em alguns casos, recursos até mesmo mais vantajosos. No Ubuntu, por exemplo, não é necessário utilizar CDs, DVDs, ou fazer downloads de drivers para instalar hardwares. Isto é feito diretamente pelo sistema operacional. Também não é necessário utilizar CDs, DVDs ou fazer downloads de arquivos executáveis (que muitas vezes traz softwares maliciosos) para instalar softwares e suas atualizações. O próprio Ubuntu busca os softwares e suas atualizações nos servidores cadastrados na Canonical. E por falar em softwares maliciosos (vírus, cavalos de tróia, softwares espiões, e outros), o Linux, em geral, é menos suscetível a estas ameaças, pois a arquitetura do sistema operacional que lhe oferece maior segurança. Linha de Comando Antes da invenção e difusão das interfaces gráficas com uso de mouse, operar um sistema operacional consistia apenas em um conjunto de linhas de comando em um terminal pouco atrativo graficamente. Que o digam os antigos usuários de DOS, Unix, Linux, e outros. Atualmente, todos os sistemas operacionais voltados para o usuários finais oferecem interfaces amigáveis, dispensando o uso de linhas de comando. Entretanto, os bons e velhos terminais continuam disponíveis, seja no Windows, Macintoch OS X, Linux, Unix e outros. Os usuários mais clássicos argumentariam que linhas de comando ainda devem ser utilizadas pois era assim que se trabalhava antigamente. Mas existe um argumento mais válido para justificar a operação de um sistema operacional via linhas de comando: eficiência. A interface gráfica por si só é um overhead (pode ser definido como recursos gastos indiretamente na execução de uma tarefa). Já os terminais requerem poucos recursos dos computadores. Os comandos, executados diretamente em terminais, são mais flexíveis e ágeis do que softwares que providos de interface (Thomas, 2011). É claro que há o contra-argumento de que é mais fácil utilizar um software com interface gráfica do que ter que decorar comandos “desnecessariamente”. Evidentemente é um argumento válido, ainda mais se eficiência for analisada apenas do ponto de vista operacional, ou seja, curva de aprendizagem e facilidade de uso. Cabe ao usuário, portanto, decidir como irá operar o sistema operacional de forma satisfatória e conveniente a seus propósitos. Shell Os comandos são interpretados por softwares conhecidos como shells. Shell em inglês significa concha. O termo faz referência a conchas de moluscos e crustáceos, um trocadilho, uma analogia à capacidade da concha envolver e proteger o interior, no caso, o sistema operacional. Sessões de Linha de Comando Basicamente, pode-se iniciar uma sessão de linha de comando de duas maneiras: ● Utilizando um terminal: no Ubuntu pode-se utilizar o terminal acessando o menu Aplicativos > Acessórios > Terminal na versão clássica do Gnome, ou simplesmente digitando “terminal” na busca do Painel Inicial. Há vários softwares terminais disponíveis, com diferentes recursos e interfaces, entretanto a função deles é exatamente a mesma; ● Utilizando um console virtual: basta teclar Ctrl +Alt+F1 e a interface gráfica irá desaparecer dando lugar a um prompt de login. Pode-se voltar à interface gráfica teclando Ctrl+Alt+F7. No Ubuntu há vários consoles virtuais, que vão de F1 a F6. Eles são bastante úteis quando ocorre alguma “pane” na interface gráfica, permitindo a correção do problema sem recorrer ao fatídico CtrlZ+Alt+Del de outro(s) sistema(s) operacional(is). Independente da opção escolhida, o prompt de linha de comando tem o seguinte formato: nome-do-usuário@nome-do-computador:~$ A primeira parte do prompt, do lado esquerdo do sinal @, exibe o nome de usuário. Após o sinal @ é exibido o nome do computador. Portanto, se um usuário de nome Ricardo estiver usando um computador chamado desktop, o prompt será: ricardo@desktop:~$ O sinal “:” divide o prompt em duas partes. À esquerda constam o nome do usuário e do computador. À direita consta o diretório do sistema de arquivos que está sendo acessado. O símbolo “~” indica que o usuário está em sua pasta pessoal, ou seja, no diretório home/ricardo (maiores explicações sobre o sistema de arquivo e seus diretórios serão apresentadas na sessão específica). Já os prompts abaixo, indicam, respectivamente, que o usuário ricardo está nos diretórios /home/ricardo/Documentos (lembre-se que “~” indica home/ricardo) e /etc. ricardo@desktop:~/Documentos$ ricardo@desktop:/etc$ Comandos e argumentos Alguns comandos podem ser acionados por si só, ou seja, apenas com o nome do comando. Por exemplo, basta digitar o comando ls, que lista os arquivos de um determinado diretório (mais detalhes deste comando serão apresentados posteriormente), e teclar Enter que o comando funcionará. Entretanto alguns comando necessitam de argumentos para funcionar corretamente. O comando mkdir, por exemplo, cria um diretório. Este comando sozinho não tem nenhum efeito, quando digitado. Deve fornecido um nome diretório a ser criado como argumento. Exemplo: mkdir NovoDiretorio Este comando criará o diretório NovoDiretorio. Mais detalhes sobre este comando serão apresentados posteriormente. A maioria dos comandos possui opções que alteram sua funcionalidade de acordo com a necessidade do usuário. Voltando ao comando ls, pode-se, por exemplo, utilizar a opção - l, que exibe uma série de informações dos arquivos listados. Utilizando esta opção, o comando passaria a ser digitado da seguinte forma: ls -l A figura abaixo apresenta o resultado deste comando executado no diretório /usr. Várias opções podem ser combinadas simultaneamente, produzindo diferentes resultados. Para descobrir quais opções existem para um determinado comando, basta digitar o nome do comando seguido de --help. ls --help Para obter informações mais detalhadas sobre o funcionamento de um comando, pode-se acionar o manual do mesmo, bastando digitar man (abreviação de manual) e o nome do comando. man ls Executando comandos com poderes de root Por questões de segurança, alguns comandos só podem ser executados com poderes de superusuário, ou seja, usuário root. Normalmente tratam-se de tarefas administrativas que afetam a configuração do sistema e partições protegidas que contém arquivos do sistema operacional, de aplicações ou de outros usuários que não podem ser manipulados por usuários comuns. Para executar um comando com poderes de root, basta digitar sudo (SuperUser Do – superusuário faz (ou faça)). Antes da execução do comando, o Linux solicita a senha de root. Exemplo: sudo cp arquivo.txt /etc Este comando permite que um arquivo chamado arquivo.txt seja copiado para /etc. A senha de root deve ser mantida sob os devidos cuidados, e as operações realizadas com privilégios de superusuário devem ser feitas com critério, pois podem causar danos ao sistema operacional,aos aplicativos e aos demais usuários. Produtividade em Sessões de Linha de Comando Uma importante ferramenta no prompt é o histórico de comandos. Digitando history pode-se ver uma extensa lista de comandos digitados. Como se trata de uma lista extensa, é possível definir quantos comandos serão exibidos: history 5, history 10, history 20, … A figura abaixo exibe parte dos 2001 comandos já digitados. A cada comando exibido nesta lista é atribuído um número. Para reutilizar um comando sem redigitá-lo, basta digitar ! + número. Exemplo: !320. O sinal de exclamação pode ser utilizado também para reutilizar algum comando específico. Por exemplo, !sudo irá procurar no histórico a última linha com o comando sudo e reutilizá-la (neste caso será reexecutado o comando 1999). Já o comando !! irá reutilizar o último comando digitado. Há também várias teclas de atalho que tornam mais produtivo o trabalho em sessões de linha de comando. A seguir são apresentados alguns atalhos (uma lista completa pode ser vista em (Motta, 2013)). ● ↑ ou ↓: Navega pelo histórico de comandos; ● Tab: Autocompleta comando ou nome de arquivo ou diretório; ● Ctrl + ← ou →: Mover cursor palavra por palavra; ● Ctrl + A: Move o cursor para o início da linha; ● Ctrl + E: Move o cursor para o fim da linha; ● Ctrl + Y: Recupera linha de comando deletada; ● Ctrl + L: Limpa a tela; ● Ctrl + C: Para a execução do programa corrente; ● Ctrl + Z: Envia programa para segundo plano; ● Ctrl + R: Pesquisa no histórico de comandos; ● Ctrl + D: Encerra sessão de linha de comando; Redirecionamento O redirecionamento é útil para enviar a saída de um comando para um arquivo, ao invés de exibi-la na tela. Por exemplo, caso se queira registrar em um arquivo o conteúdo de um diretório, pode-se utilizar o seguinte comando: ls -l > listagem.txt Será criado o arquivo listagem.txt e seu conteúdo será a listagem do diretório corrente obtida pelo comando ls -l. Caso o arquivo listagem.txt já exista, o mesmo será substituído. Se o arquivo já existir e usuário desejar apenas adicionar um conteúdo ao final do arquivo, basta utilizar o comando: ls -l >> listagem.txt Canalização Canalização é semelhante ao redirecionamento, entretanto, ao invés de passar a saída de um comando para um arquivo, a canalização passa a saída de um comando para outro. Por exemplo, caso se queira exibir na listagem de um diretório os arquivos que contenham a palavra “trabalho”, basta executar o comando: ls | grep trabalho A listagem do diretório gerada pelo comando ls será passada ao comando grep trabalho, que filtrará as entradas que possuírem a palavra “trabalho” e exibirá o resultado na tela. Sistema de arquivos Um computador pode acessar diversos tipos de dispositivos de armazenamentos: discos rígidos, pen-drives, disquetes, cartões de memória, etc. Nestes dispositivos os dados são armazenados de forma binária, ou seja, zeros e uns, e podem estar distribuídos por diversas partições (que são divisões lógicas destes dispositivos) (Valle, 2010). Um sistema de arquivos refere-se à forma como os dados são armazenados, organizados e acessados em cada partição do disco (Mota, 2013), sendo que cada partição pode ter seu próprio sistema de arquivos. O Linux reconhece diversos sistemas de arquivos, sendo os principais: ● Ext2: sistema de arquivos estendido (extended filesystem). O Ext 2 foi o primeiro sistema de arquivos para uso exclusivo no Linux. Apesar de não ser mais utilizado atualmente em desktops, uma vez que possui capacidade de recuperação de falhas limitado, ainda é indicado para dispositivos móveis de memória flash, como pendrives; ● Ext3: em relação ao Ext2, apresenta uma significativa vantagem: Journaling, ou seja, é um sistema de arquivos “jornalizado”. A expressão Journaling refere-se à capacidade de um sistema de arquivos recuperar dados em caso de falhas (queda de energia, por exemplo). Isto é feito através de um sistema de log que registra as alterações antes que as mesmas ocorram, permitindo a restauração do sistema de arquivos após falhas; ● Ext4: é o sistema de arquivos mais recomendado atualmente. Supera o Ext3 em performance, capacidade de armazenamento e recursos de manutenção; ● vfat: sistema de arquivos dos sistemas Windows9x; ● ntfs: sistema de arquivos de rede utilizados por versões mais recentes do Windows; O Linux também reconhece diversos outros sistemas de arquivos: HPFS, ReiserFS, XFS, JFS, ISO 9660 (utilizados por CD-ROM e DVD) e outros. Nomenclatura de discos e partições Conhecer a terminologia do Linux para referenciar dispositivos de armazenamento é essencial para administração deste sistema operacional. A nomenclatura dos dispositivos é baseada na tecnologia utilizada. Dispositivos IDE são designados pelas iniciais hd. Caso haja dois dispositivos IDE numa mesma porta, acrescenta-se uma letra: o primeiro dispositivo será hda e o segundo hdb. Dispositivos SATA, SAS, SCSI e USB são designados pelas iniciais sd (a exceção fica para drive de fita SCSI, que recebe a nomenclatura st, e CDROM/DVD SCSI, que recebe a nomenclatura sr). Assim como no IDE, cada dispositivo recebe uma terceira letra de forma a ordená-los: sda, sdb, sdc, etc. Um dispositivo de armazenamento pode ser dividido em várias partições. Do ponto de vista prático, uma partição funciona como um sistema de arquivos independente. Há três tipos de partição: ● Partição primária: pode ser inicializável, ou seja, é possível dar boot (inicializar o sistema operacional) a partir desta partição. Normalmente a primeira partição de um HD é inicializável; ● Partição estendida: não pode ser inicializável e nem recebe dados diretamente. Para receber dados deve ser criada uma partição lógica dentro da partição estendida. Só é possível haver uma partição estendida por HD; ● Partição lógica: é criada dentro da partição estendida para receber dados. Podem ser criadas várias partições lógicas dentro de uma estendida. As partições são numeradas. As primárias e estendidas são numeradas de 1 a 4. Já as partições lógicas recebem numeração a partir de 5. Estes números são acrescidos ao final da identificação de um dispositivo. Por exemplo, suponha um HD designado por sda. Este HD possui duas partições primárias, uma estendida e duas partições lógicas dentro da estendida. Logo as partições primárias e estendidas serão, respectivamente: sda1, sda2 e sda3. As partições lógicas serão: sda5 e sda6. Todos os dispositivos são mapeados no diretório /dev. Portanto, para se referir à segunda partição do dispositivo sdb, deve-se fazer referência ao diretório /dev/sdb2, conforme será discutido na seção de montagem de sistemas de arquivos. Identificando e manipulando partições Informações sobre as partições de um disco podem ser visualizadas através do comando disktype. Este comando requer como argumento um dispositivo de armazenamento ou uma partição específica. Exemplo: disktype /dev/sdb A saída deste comando é exemplificada abaixo: Neste exemplo existem partições do disco sdb. A primeira partição, de aproximadamente 100GB, possui um sistema de arquivos NTFS. A segunda é uma partição estendida do tipo Ext3 de aproximadamente 50GB. As partições seguintes são partições lógicas: ● Partição 5: possui aproximadamente 500MB e sistema de arquivos Ext3; ● Partição 6: possui aproximadamente 10GB e sistema de arquivos Ext3. O nome do volume é “home” e o ponto de montagem é /home (maiores informações sobre pontos de montagem serão apresentadas ao longo deste capítulo);● Partição 7: possui aproximadamente 22GB e sistema de arquivos Ext3. O nome do volume é “usr” e o ponto de montagem é /usr; ● Partição 8: possui aproximadamente 2GB e sistema de arquivos NTFS; ● Partição 9: possui aproximadamente 18GB e sistema de arquivos Ext3. O nome do volume é “/” e o ponto de montagem é /; ● Partição 10: possui aproximadamente 2GB e sistema de arquivos SWAP. Para manipular partições pode-se utilizar o comando fdisk,conforme o exemplo: fdisk /dev/sdb Algumas das opções deste comando são: ● a: alterna a partição inicializável; ● d: exclui uma partição; ● l: lista os tipos de partição conhecidos; ● m: mostra menu de ajuda; ● n: cria uma nova partição; ● p: mostra a tabela de partição; ● q: sai sem salvar as alterações; ● w: grava a tabela no disco e sai. Ao utilizar a opção p, as seguintes informações são apresentadas: No cabeçalho aparecem informações sobre o dispositivo: número de cabeças, setores e cilindros, tamanho dos setores, tamanho de entrada e saída, e identificador do disco. Em seguida são apresentados, respectivamente, os nomes das partições, qual delas é inicializável (marcado com *), o início e o fim de cada partição, número de blocos, e a identificação e descrição do sistema de arquivos. Após criar uma partição, deve-se formatá-la. Os comandos para formatar uma partição utiliza-se o comando mkfs.[sistema de arquivos] seguido do nome da partição. Exemplos: mkfs.ext3 /dev/sda1 mkfs.ext4 /dev/sda1 mkfs.ntfs /dev/sda2 mkfs.vfat /dev/sda2 Diferenças entre diretórios e arquivos Um arquivo consiste em um conjunto de blocos do disco cujo conteúdo são dados pertencentes a um usuário (ou aplicativo) ou instruções para execução de um programa. Os diretórios se assemelham a arquivos em vários aspectos: ● Possuem nomes assim como os arquivos; ● Possuem propriedades, assim como os arquivos; ● Também são armazenados em blocos; ● Possuem inode; Entretanto os diretórios não possuem um conteúdo significativo para o usuário ou aplicações. Na verdade, diretórios são apenas abstrações de um sistema de arquivos. Em outras palavras, são arquivos que contém o nome e outras informações básicas de outros arquivos, agrupando-os naquilo que conhecemos como “pastas de arquivos”. Portanto, quando vemos uma árvore de diretórios, com seus respectivos arquivos, bastante organizada, na verdade todos os arquivos estão espalhados desordenadamente pelo disco. Sendo cada diretório um arquivo interpretado como uma pasta que contém outros arquivos. Navegando pelo sistema de arquivos No Linux todos os diretórios e partições estão distribuídos a partir da raiz do sistema de arquivos. A raiz, ou root, é indicada pelo símbolo “/”. As partições e diretórios derivados da raiz, ou seja, contidos na raiz, são identificados através de seus caminhos, ou paths. Seguem alguns exemplos: ● /home/usuario/Documentos; ● /usr/bin; ● /mnt. Para verificar qual diretório está sendo acessado pode-se tanto observar as informações no prompt, quanto utilizar o comando pwd. Para alterar o diretório, utiliza-se o comando cd (iniciais de Change Directory) associado a um argumento: o diretório de destino. Exemplo: cd Documentos Ao utilizar o comando cd é preciso entender a diferença entre caminhos absolutos e relativos. O exemplo acima usa um caminho relativo, ou seja, o caminho parcial para o diretório Documentos, levando-se em conta que o usuário está em sua pasta pessoal. Generalizando, ao fornecer um caminho relativo, o sistema operacional interpreta que se trata de um diretório a partir do diretório atual. Seguem outros exemplos do comando cd utilizando caminhos relativos a partir da pasta pessoal do usuário. cd Downloads cd Documentos/Escola cd Musicas Ao utilizar caminhos relativos, pode-se fazer uso dos caracteres “..”. Estes caracteres indicam que o caminho relativo deve ser tomado a partir do diretório acima. Exemplo: suponha que ao digitar pwd o usuário verifique que está no diretório /home/ricardo/Documentos; caso ele queira ir ao diretório Downloads, não bastará digitar cd Downloads, ele deverá informar ao comando cd que o caminho relativo deve ser tomado a partir do diretório acima, ou seja, /home/ricardo. Para tanto, o comando a ser digitado será: cd ../Downloads Já os caminhos absolutos indicam o caminho completo de um diretório, desde a raiz. Portanto, ao utilizar um caminho absoluto, o usuário não precisa se preocupar com qual é o diretório corrente. Exemplos do comando cd com caminho absoluto: cd /home/ricardo/Downloads cd /home/ricardo/Documentos/Escola cd /etc Conforme já citado anteriormente, o comando para se listar o conteúdo de um determinado diretório é ls. Algumas das opções deste comando são: ● -l: lista informações detalhadas dos arquivos e diretórios, como permissões, proprietário, tamanho, data e hora de criação (ou da última modificação); ● -a: exibe todos os arquivos, inclusive arquivos ocultos; ● -h: exibe o tamanho dos arquivos em KB, MB ou GB, ao invés de mostrá-lo em byte; ● -S: ordena listagem pelo tamanho; ● -t: ordena listagem pela data e hora de criação ou última modificação; ● -u: exibe data e hora do último acesso ao arquivo ou diretório; ● -i: mostra o número do inode do arquivo ou diretório; Estas opções podem ser combinadas no comando ls: ls -lha Abaixo é exibido, parcialmente, as informações listadas pelo comando acima no diretório /etc. As primeiras colunas referem-se a permissões e proprietários dos arquivos e diretórios. Este tema será explorado em capítulo específico posteriormente. Caso o usuário queira obter informações sobre data e hora do último acesso a arquivos e diretórios, deverá acrescentar a opção -u. Exemplo: ls -lahu Informações mais detalhadas sobre um arquivo ou diretório podem ser obtidas com o comando stat. No exemplo abaixo são solicitadas informações detalhadas do arquivo adduser.conf, no diretório /etc: stat adduser.conf As informações retornadas são exibidas abaixo: Além do nome do arquivo são exibidos: ● Tamanho do arquivo; ● Número de blocos: cada arquivo ocupa um conjunto de blocos. Os blocos consistem em um conjunto de bytes. São a menor quantidade de informação acessíveis em um sistema de arquivos. Informações mais detalhadas podem ser obtidas em (Mota, 2012); ● Tamanho do bloco: que neste caso é de 4096 bytes; ● Dispositivo onde o arquivo se encontra; ● Inode do arquivo: inode é um conjunto de informações sobre o arquivo ou diretório. O inode fica armazenado no primeiro bloco de um arquivo ou diretório. Maiores informações sobre inode podem ser obtidas em (Mota, 2012); ● Permissões; ● Usuário proprietário; ● Grupo proprietário; ● Número de links do arquivo; ● Data do último acesso; ● Data da última modificação do conteúdo; ● Data da última alteração de propriedades do arquivo (exemplo: permissão). O comando ls também aceita um diretório ou caminho como argumento, da mesma maneira que o comando cd. Portanto, não é necessário alterar o diretório corrente para depois utilizar o comando ls. Basta informar qual diretório se deseja listar. ls /usr -a O exemplo acima lista todo o conteúdo de /usr, inclusive arquivos ocultos. Para buscar um arquivo ou diretório sem necessariamente fazer uma pesquisa manual (ou visual) pelo sistema de arquivos, pode-se utilizar o comando find. O exemplo abaixo procura pelo arquivo documento.odt na pasta pessoal do usuário ricardo. find /home/ricardo -name 'documento.odt'A opção -name indica que será fornecida uma expressão de busca, podendo inclusive ser fornecido nome parcial de um arquivo ou diretório. Exemplo: find /home/ricardo -name 'document*' Outra opção de busca por arquivos é o comando locate. Este comando possui boa performance uma vez que utiliza um banco de dados de arquivos. Exemplo: locate documento Neste exemplo será procurado em todo o sistema de arquivos um arquivo ou diretório que contenha a palavra documento. O banco de dados utilizado pelo comando locate é gerado pelo comando updatedb. Este comando faz uma indexação de todos os arquivos existentes nas partições montadas, inclusive partições de dispositivos removíveis (Pendrives, CDs, DVDs, etc). Sua execução poderá demorar algum tempo, caso haja uma grande quantidade de arquivos a serem indexados. O comando updatedb não necessita de argumentos em sua execução. Manipulando arquivos e diretórios O Linux é case sensitive, portanto, letras maiúsculas e minúsculas são interpretadas diferentemente. O caminho /home/usuario/Documentos, por exemplo, representa diretório diferente de /home/Usuario/Documentos. Da mesma forma, os nomes de arquivo arquivo1 e Arquivo1, representam dois arquivos diferentes. Tantos os arquivos quanto os diretórios podem conter espaços, números ou outros símbolos (com exceção de “/”). Portanto, são válidos os nomes e caminhos: ● arquivo 1 ● arquivo_1 ● arquivo-1 ● arquivo.1 ● /home/usuario/Documentos/pasta 1 ● /home/usuario/Documentos/pasta_1 ● /home/usuario/Documentos/pasta-1 ● /home/usuario/Documentos/pasta.1 Um arquivo ou diretório que comece com o caractere “.” é considerado oculto pelo sistema de arquivos do Linux, portanto ele não aparecerá em gerenciadores de arquivos ou comandos de listagem, a menos que seja explicitamente requerida a exibição destes arquivos ou diretórios. Nos sistemas Linux, os arquivos não costumam possuir extensão, como ocorre em outros sistemas operacionais. Arquivos executáveis, por exemplo, são identificados pelo sistema através de atributos específicos. A exceção normalmente fica para arquivos de configuração (que possuem a extensão por .conf) e arquivos pessoais, cuja extensão indica o tipo de arquivo (exemplos: .doc, .odt, .jpg, .svg). Os arquivos podem ser copiados através do comando cp (iniciais de Copy Folder), devendo ser informado, como argumentos, o arquivo a ser copiado e o diretório de destino. Exemplos: cp arquivo /tmp cp /home/usuario/Documentos/arquivo.doc /home/usuario /Downloads cp arquivo.doc arquivo.doc1 No último exemplo, é criada uma cópia de arquivo.doc no mesmo diretório em que esse arquivo se encontra. É um procedimento comumente utilizado para fazer cópias de segurança de arquivos. Uma importante opção deste comando é -r. Esta opção permite a cópia de diretórios de forma recursiva, ou seja, os diretórios dentro do diretório especificado também serão copiados. Outras opções de cp são exibidas abaixo: ● -v: mostra um resumo das ações do comando durante sua execução. ● -p: mantém propriedades relativas às permissões dos arquivos e seu proprietário; ● -u: executa a cópia se o arquivo destino não existir. Caso o arquivo destino exista, só executa a cópia se o arquivo destino for mais antigo do que o arquivo de origem; O comando mv (MoVe) permite que se mova um arquivo ou diretório. Sua utilização é similar ao comando cp, bastando indicar o arquivo de origem e o destino (porém, para este comando não é necessário utilizar a opção -r para mover diretórios) . O exemplo abaixo move o arquivo “arquivo.doc” para o diretório /tmp. mv arquivo.doc /tmp Já o próximo exemplo move o diretório Downloads/softwares para o diretório /tmp. mv ~/Downloads/softwares /tmp Este comando também pode ser utilizado para renomear arquivos ou diretórios. Basta informar como destino outro nome para o arquivo ou diretório que se pretende renomear. Exemplo: mv arquivo.doc arquivo1.doc Para deletar um arquivo ou diretório, usa-se o comando rm (RemoVe), bastando fornecer como argumento o arquivo a ser excluído. Exemplo: rm arquivo1.doc Ao remover um diretório que contenha outros diretórios, é necessário utilizar a opção -r. Outra opção que pode ser útil especialmente em remoções recursivas é a opção -i, que solicitará confirmação do usuário a cada remoção. Uma alternativa ao comando rm é o comando wipe (que pode ser instalado com o comando apt-get install wipe). Este comando sobrescreve os bytes existentes com dados aleatórios, impedindo assim que o arquivo seja recuperado. Seu uso é idêntico ao comando rm, exigindo apenas como argumento o arquivo a ser apagado. O wipe também possui algumas opções: ● -r: remoções recursivas; ● -f: não solicita confirmação para remoção; ● -q: repete o processo de sobrescrever o arquivo apagado apenas 4 vezes (o padrão é 34 vezes). O Linux permite a criação de links para arquivos, ou seja, arquivos que fazem referência a outros arquivos em diferentes localidades. Isto pode ser útil quando se tem um arquivo que é constantemente acessado e que está localizado em um diretório de “difícil acesso”. O comando para criação de links é ln. Como argumento, devem ser fornecidos o nome do arquivo e o nome do link a ser criado. ln Documentos/arquivo1.doc lnk_arquivo1.doc A partir deste comando, todo acesso ao arquivo “linkado” (seja para edição, exibição ou execução) pode ser feito através de seu link, sem necessidade de digitar o caminho do arquivo original. Entretanto, este comando cria por padrão o que se chama de hard link. Um hard link representa um segundo nome para um arquivo (não pode ser aplicado a diretórios), que possui o mesmo tamanho do arquivo original e cujas alterações serão replicadas para o arquivo original. Porém, isto pode gerar um desperdício de espaço no sistema de arquivos. Portanto, é indicado o uso da opção -s, que permite criar um link simbólico, ou soft link. ln -s Documentos/arquivo1.doc lnk_arquivo1.doc O link simbólico pode ser utilizado tanto para diretórios quanto para arquivos. O link simbólico permite também a referência a arquivos ou diretórios em partições diferentes. O hard link, apesar de ocupar mais espaço em disco, ser limitado a arquivos e não permitir a referência a partições diferentes, possui algumas vantagens: como um hard link cria um segundo nome para o arquivo, caso um dos nomes do arquivo seja apagado, o arquivo ainda continua acessível pelo outro nome; um hard link permite um acesso mais rápido ao arquivo do que um soft link. Há dois comandos específicos para diretórios: mkdir e rmdir. O comando mkdir cria diretórios. O único argumento é o nome (e caminho, caso necessário) do diretório a ser criado. Exemplo mkdir meudiretorio Já o comando rmdir remove diretórios. Seu uso é similar ao mkdir: rmdir meudiretorio Executando Programas Quando um comando é digitado, o Linux tenta encontrá-lo nos diretórios armazenados na variável de sistema $PATH. Para verificar o conteúdo desta variável é necessário utilizar o comando echo. echo $PATH A executar este comando, um conjunto de diretórios será exibido. /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/ sbin:/usr/bin:/sbin:/bin:/usr/games Se o usuário digitar um comando que não é encontrado nestes diretório, receberá a mensagem de erro: “Comando não encontrado”. Entretanto, o Ubuntu apresentará duas possíveis soluções para este erro: ● Fará sugestões de comandos similares (o que é bastante útil caso o usuário tenha cometido apenas um errode digitação); ● Buscará o comando nos seus repositórios de softwares. Se encontrar, irá fornecer uma linha de comando para instalar o software. Por exemplo, caso seja digitado udv, o Ubuntu retornará a seguinte mensagem: O programa 'udv' não está instalado no momento. Você pode instalá- lo digitando: sudo apt-get install ncbi-tools-x11 Suponhamos outra situação: caso o usuário queira executar um programa chamado MeuPrograma obtido por meio de download e armazenado no diretório Downloads, em sua pasta pessoal, ele pode acessar este diretório e digitar: ./MeuPrograma Desta forma Linux buscar o comando apenas no diretório corrente. Outra possibilidade é fornecer o caminho absoluto para o programa. /home/Usuario/Downloads/MeuPrograma Manipulando arquivos de texto Arquivos simples de texto são bastante utilizados para armazenar informações de instalação de softwares, configuração e scripts. Podem ser criados, editados e visualizados por editores simples, sem interface gráfica. Um exemplo é o editor Nano. Para utilizá-lo, basta digitar nano. Pode-se também digitar nano + nome do arquivo. nano arquivo.txt Se o arquivo existir, o editor o abrirá para edição. Caso não exista, o editor poderá criar um arquivo com o nome digitado. As instruções de operação do Nano, que na verdade são atalhos do teclado, são apresentadas na parte inferior do editor, conforme exibido na figura abaixo. O Nano possui várias opções que possuem efeitos bastante particulares cuja praticidade depende das necessidades do usuário. Porém, duas opções merecem destaque: -t e -m. A primeira faz com que o Nano salve automaticamente o documento, sem perguntar ao usuário. E a segunda habilita o uso do mouse. Caso a intenção seja apenas uma rápida visualização do arquivo texto, pode-se usar o comando less. less arquivo.txt Em um arquivo texto, pode-se procurar por palavras usando o comando grep. Como argumentos, deve-se fornecer a palavra a ser procurada e o nome do arquivo. Exemplo: grep palavra arquivo.txt O resultado será a exibição do conteúdo do arquivo com destaque para as ocorrências da palavra pesquisada. Nada será exibido se a palavra não for encontrada. Caso queira se procurar um trecho de texto, usa-se “”. Exemplo: grep “buscando um trecho” arquivo.txt A opção -i permite que a pesquisa ocorra sem que se diferencie as letras minúsculas e maiúsculas. Já a opção -n exibe o número da(s) linha(s) onde a palavra pesquisada foi encontrada. Em algumas situações, pode ser necessário comparar dois arquivos ou diretórios verificando suas diferenças. Para tanto, pode-se usar o comando diff para mostrar as diferenças de dois arquivos ou diretórios. Este comando utiliza como parâmetros os nomes dos arquivos ou diretórios a serem comparados. diff arquivo1 arquivo2 Abaixo são apresentadas algumas opções do comando diff : ● -i: ignora caixa do caractere; ● -w: ignora espaço em branco; ● -q: apenas informa que os diretórios ou arquivos são iguais ou diferentes, sem exibir as diferenças entre eles; ● -r: compara diretórios de forma recursiva; Diretórios importantes Os sistemas Linux, independente da distribuição, têm uma organização básica dos principais diretórios em comum, pois seguem o Padrão de Hierarquia de Sistema de Arquivos (Filesystem Hierarchy Standard (FHS) – disponível em www.pathname.com/fhs) (Moeler, 2012). Cada um destes diretórios possui uma função específica. É importante que o usuário conheça o nome e conteúdo destes diretórios. Seguindo a ordem alfabética, os principais diretórios e seus conteúdos serão descritos nas próximas subseções. /bin Contém arquivos executáveis essenciais para o sistema operacional; /boot Contém o Kernel Linux e arquivos relacionados ao boot loader. /dev Contém arquivos virtuais que representam dispositivos de hardware, ou seja, arquivos que servem de ligação com os dispositivos de hardware. /etc Contém arquivos de configuração do sistema operacional e dos serviços de rede, além de arquivos executáveis relacionados à inicialização do sistema e seus serviços. /home Contém diretórios pessoais dos usuários. /lib Contém módulos do Kernel, drivers de dispositivos e arquivos de biblioteca necessários aos softwares. /media e /mnt Contém subdiretórios onde dispositivos de armazenamento temporários (HD externo, pendrive, CD, DVD, etc.) podem ser montados. Montar um dispositivo de armazenamento consiste em criar um diretório onde o conteúdo do dispositivo é exibido e pode ser manipulado, sem que de fato este conteúdo seja efetivamente copiado para o sistema de arquivos onde o Linux está instalado. Há comandos específicos para montagem de dispositivos, porém o Ubuntu detecta e monta automaticamente qualquer dispositivo conectado ao computador. /opt Neste diretório são instalados pacotes opcionais que não fazem parte da distribuição do Linux em uso. /proc Diretório virtual. Não possui arquivos, apenas referências a informações dinâmicas do sistema geradas constantemente pelo kernel. Exemplos: estatísticas de uso de memória, informações da cpu. /root Diretório pessoal para o usuário root. /sbin Executáveis necessários para manutenção do sistema. Normalmente só utilizáveis pelo usuário root. /tmp Contém informações temporárias do sistema operacional. Tem seu conteúdo totalmente apagado a cada inicialização do sistema. /usr O diretório usr (Unix Shared Resources – recursos compartilhados do Unix (algumas bibliografias citam usr como UNIX SYSTEM RESOURCES (recursos de sistema Unix) (VALLE, 2010)) contém a maior parte dos arquivos dos softwares, incluindo executáveis, bibliotecas e documentações. /var Contém arquivos com conteúdo variável essenciais para a execução do sistema, como logs, spool de impressoras, e outros. Além destes, outros diretórios podem ser criados por aplicações, pelo próprio usuário ou por especificidades de alguma distribuição Linux. Montagem e informações de partições O comando mount envolve a montagem de partições de dispositivos de armazenamento. O dispositivo montado fará parte do sistema de arquivos do Linux. Ao digitar o comando mount são exibidas os dispositivos de montados e seus respectivos pontos de montagem (diretório onde o conteúdo do dispositivo será exibido). A linha abaixo exibe um dispositivo montado. /dev/sdb6 on /home type ext4 (rw) A primeira informação especifica que se trata do dispositivo sdb6 no diretório /dev (DEVice – dispositivo em inglês). Trata-se de um dispositivo de armazenamento, pois sd são iniciais de Storage Device (dispositivo de armazenamento em inglês). Este dispositivo foi dividido em várias partições, e a partição montada aqui foi a de número 6. A palavra on (cuja tradução é “em”) indica que a próxima informação será o ponto de montagem deste dispositivo: /home. Logo, esta partição contém arquivos pessoais dos usuários, devendo passar periodicamente por processos de backup e devem ser preservadas por instalações, reinstalações ou atualizações do Linux. A informação seguinte ext4, informa o tipo do sistema de arquivos e as letras rw, em parênteses, indicam que a partição pode ser lida (read) ou escrita (write). Conforme mencionado anteriormente, o Ubuntu monta automaticamente os dispositivos de armazenamento, seja no processo de inicialização, seja durante a operação do sistema operacional. Por exemplo, se um pendrive for inserido em uma porta USB, automaticamente o Ubuntu o detectaráe o montará no diretório /media. Seu ponto de montagem poderá ser verificado pelo comando mount. Devido a essa praticidade das versões atuais do Linux, a montagem manual de dispositivos passou a ser pouco utilizada. Entretanto, caso se deseje fazer uma montagem manual, o comando deverá ser digitado conforme o exemplo: mount -t ntfs /dev/sbg2 /media/disco O comando deve ser executado no modo root. A opção -t permite definir o tipo de partição que será montada, neste caso ntfs. Em seguida são informados o dispositivo e o ponto de montagem. Uma vez montado, o dispositivo de armazenamento ficará disponível até que a máquina seja reiniciada. Caso se deseje sempre utilizar alguma partição e queira que ela seja montada durante a inicialização do sistema, deve-se incluir a partição no arquivo /etc/fstab, que é lido na inicialização do kernel. A desmontagem de dispositivos é feita pelo comando umount. Para este comando, basta fornecer o ponto de montagem. Exemplo: umount /media/disco Pode-se verificar o uso de espaço em cada partição utilizando o comando df. Os resultados deste comando normalmente são melhores compreendidos com a opção -h, que exibe o espaço em MB e GB. Exemplo: df -h Este comando exibe os dispositivos montados, o tamanho do dispositivo, a quantidade de espaço utilizado, a quantidade de espaço disponível, a porcentagem de uso e o ponto de montagem, conforme pode ser verificado no exemplo abaixo. Sist. Arq. Tam. Usado Disp. Uso% Montado em /dev/sdb9 18G 12G 4,6G 72% / /dev/sdb6 9,2G 8,1G 704M 93% /home /dev/sdb7 21G 9,4G 9,8G 49% /usr Embora não necessite de argumentos, pode-se solicitar os dados de uma única partição. df -h /home Outra opção bastante útil do comando df é a opção -T. Com esta opção são exibidos os sistemas de arquivos utilizados nas partições. O comando du, por sua vez, exibe o espaço ocupado por diretórios de forma recursiva, ou seja, explorando toda a árvore de subdiretórios. São opções úteis do comando du: ● -s: mostra apenas a ocupação total do diretório, sem exibir a quantidade de memória de cada subdiretório; ● -S: ordena a listagem com base no tamanho de cada diretório; ● -h: exibe resultado em MB e GB, ao invés de exibir em bytes. Gerência de Usuários Para adicionar um usuário ao sistema usa-se o comando adduser, que só pode ser executado pelo usuário root. O argumento deste comando é o nome do usuário a ser criado. adduser novousuario A este comando se seguirão as mensagens de criação do usuário, seu grupo e diretório pessoal. Note que o UID (User IDentifier) deste usuário é 1003, e seu GID (Group Identifier) 1003. Em seguida são solicitadas a senha do usuário e algumas informações opcionais, como nome completo, sala, telefones e outro. Após a criação de um usuário pode-se trocar sua senha com o comando passwd. Assim como no comando adduser, deve ser fornecido o nome do usuário. passwd novousuario Apenas o usuário root pode alterar a senha de qualquer usuário. Porém, um usuário comum pode utilizar este comando para alterar sua própria senha. De acordo com a opção utilizada, este comando permite bloquear e desbloquear usuários: ● -l: bloqueia usuário; ● -u: desbloqueia usuário. Para remover um usuário, deve-se usar o comando userdel. Este comando deve ser executado pelo root e deve fornecer como argumento o nome do usuário a ser deletado. userdel novousuario Caso este comando seja executado com a opção -r, o diretório e todos os arquivos do usuário são apagados. Para criar um grupo novo utiliza-se o comando addgroup. Este comando deve ser executado pelo root e deve ser especificado o nome do grupo. addgroup novogrupo E para apagar um grupo basta usar o comando groupdel. groupdel novogrupo Caso se queira mudar o grupo de um usuário, utiliza-se o comando usermod com a opção -g. O exemplo a seguir altera o grupo do usuário novousuario para novogrupo. usermod novogrupo -g novousuario Para visualizar todos os usuários cadastrados no sistema, basta utilizar o comando less e indicar o arquivo /etc/passwd. less /etc/passwd O usuário criado nesta seção aparece na última linha do arquivo: novousuario:x:1002:1003:NovoUsuário,,,:/home/novousuario: /bin/bash Cada campo é separado por dois pontos. O caractere “x” indica que a senha criptografada do usuário está no arquivo /etc/shadow. A seguir é apresentado o GID e o UID, respectivamente. Os dados seguintes são as informações opcionais do usuário. Observe que nem todos foram digitados. Por fim é informada a pasta pessoal do usuário e o shell disponível para o usuário. Para visualizar os grupos criados, basta utilizar o comando less e indicar o arquivo /etc/group. less /etc/group O comando w mostra os usuários conectados no momento. A seguir são apresentadas as informações fornecidas por este comando. A primeira linha mostra a hora atual, o tempo em que o sistema está no ar, o número de usuários conectados, e a carga média de processamento no último minuto, nos cinco últimos minutos e nos quinze últimos minutos. A segunda linha traz informações sobre cada coluna: ● USER: esta coluna mostra o nome do usuário conectado; ● TTY: indica qual o terminal no qual o usuário está logado; ● FROM: exibe onde o login foi feito, caso tenha ocorrido em alguma máquina remota; ● LOGIN@: informa a quanto tempo cada usuário está conectado; ● IDLE: informa o tempo que o usuário está inativo; ● JCPU: informa o tempo de processamento em CPU utilizado pelos processos de um usuário; ● PCPU: informa o tempo de processamento em CPU do processo indicado na coluna WHAT; ● WHAT: mostra o processo referente à aplicação que o usuário está utilizando no momento. Propriedade e Permissões de Arquivos Nas próximas subseções serão apresentados conceitos e comandos sobre propriedade, e permissão de arquivos e diretórios. Propriedades de arquivos Todo arquivo possui um dono (owner), que pode ser um usuário comum ou o usuário administrador do sistema (usuário root). Esta é uma das características que tornam o Linux seguro, pois, além de impedir que um usuário ou software malicioso acesse ou altere arquivos de outros usuários, impede que arquivos específicos do sistema operacional (que são de propriedade do root) sejam indevidamente manipulados por outros usuários ou softwares maliciosos. Permissões de Arquivos Existem as seguintes permissões de acesso a arquivos: leitura (read), escrita (write) e executar (execute). O proprietário de um arquivo pode determinar estas permissões em três categorias: ● Permissões do proprietário (owner): geralmente possui acesso completo a arquivos. Entretanto, por questões de segurança, para evitar alterações acidentais, um proprietário pode determinar que um arquivo seja apenas para leitura; ● Permissões de grupo (groups): todos usuários são membros de grupos. Os arquivos podem ser associados a grupos e ter definidas as permissões para estes grupos; ● Permissões para os demais usuários (others): o proprietário de um arquivo pode dar acesso aos demais usuários (que não são proprietários e nem membros de um grupo ao qual o arquivo está associado). Normalmente, a permissão para others é leitura. Permissões de Diretórios As permissões de diretórios apresentam algumas diferenças em relação aos arquivos: ● As permissões atribuídas a um diretório são aplicadas ao seu conteúdo, ou seja, aos arquivos e diretórios dentro dele; ● A permissãode execução não implica propriamente na execução de programas, mas na permissão de acesso e modificação do conteúdo do diretório, ou seja, um diretório sem a permissão de execução tem seu conteúdo inacessível. Caso um usuário tente acessar este diretório, receberá uma mensagem de “Permissão Negada”; ● A permissão de leitura permite que o conteúdo do diretório seja visualizado, mas só tem efeito se o diretório tem permissão de execução; ● A permissão de escrita permite que o usuário crie, apague ou renomeie arquivos ou diretórios dentro do diretório em questão. Assim como nos arquivos, pode-se definir permissões específicas para o proprietário, para grupos e demais usuários. Identificando Permissões e Propriedade Ao executar o comando ls -l, os primeiros caracteres exibidos em cada linha referem-se às permissões de arquivos ou diretórios. Abaixo é exibido novamente o resultado parcial do comando ls -lah executado no diretório /etc. A letra d (Directory – diretório) não está relacionada a permissões, e sim para indicar que se trata de um diretório. A letra r (Read – leitura) indica permissão de leitura, a letra w (Write – escrita) permissão de escrita e a letra x (eXecution – execução) permissão de execução. Analisando a primeira linha, temos a sequência drwxr-xr-x. A letra d informa que trata-se de um diretório. Já as permissões são divididas em três grupos: ● Permissões do proprietário (owner): rwx indica que o proprietário tem permissão de leitura, escrita e execução; ● Permissões de grupo (group):r-x indica que o grupo possui apenas permissão de leitura e execução, não sendo permitida aos integrantes do grupo criar, apagar ou renomear diretórios ou arquivos; ● Permissões dos demais usuários (others): r-x indica que os demais usuários possuem as mesmas permissões que o grupo. Analisando agora a quarta linha do exemplo anterior, referente ao arquivo adduser.conf, temos a sequência -rw-r--r--. Como não se trata de um diretório, e sim de um arquivo, o primeiro caractere é apenas o símbolo “-”. A seguir temos as permissões: ● Permissões do proprietário (owner): rw- indica que o proprietário tem permissão de leitura e escrita, mas não de execução; ● Permissões de grupo (group):r-- indica que o grupo possui apenas permissão de leitura, não sendo permitida ao integrantes do grupo executar, criar, apagar ou renomear diretórios ou arquivos; ● Permissões dos demais usuários (others): r-- indica que os demais usuários possuem as mesmas permissões que o grupo. A informação seguinte às permissões e ao número de blocos é o proprietário do arquivo, ou diretório, e o grupo ao qual o arquivo, ou diretório, está associado. Em todas as linhas do exemplo acima o proprietário e o grupo são root. No Ubuntu todos os usuários são associados a seu grupo pessoal. Desta forma, as permissões de grupo se tornam pouco relevante, uma vez que as permissões de proprietário precedem as de grupo. As permissões de grupo são relevantes caso se inclua outros usuários em determinado grupo pessoal. Alterando Permissões Arquivos e diretórios podem ter suas permissões e propriedade alteradas. Normalmente é necessário poderes de usuário root para realizar tais operações. Os demais usuários podem alterar apenas as permissões dos arquivos ou diretórios que lhe pertençam. O comando chmod (Change Mode – alterar modo) é utilizado para alterar permissões. Há várias combinações de argumentos e opções para utilizar este comando. Uma das maneiras é especificar quem terá a permissão alterada (proprietário, grupo ou demais usuários), as novas permissões e o nome do arquivo ou diretório. O proprietário é identificado por uma letra: ● u: identifica o proprietário; ● g: identifica o grupo; ● o: identifica os demais usuários. Para se acrescentar uma permissão utiliza-se o símbolo “+” e para retirar uma permissão, utiliza-se o símbolo “-”. Analisemos alguns exemplos: chmod u+w teste Neste exemplo é acrescida a permissão de escrita para o proprietário do arquivo teste. chmod u+x teste Agora é acrescida a permissão de execução para o proprietário do arquivo teste. chmod g-x teste Neste exemplo é retirada a permissão de execução para do grupo associado ao arquivo teste. O próximo exemplo irá retirar a permissão de leitura para os demais usuários. chmod o-r teste É possível atribuir várias permissões em um mesmo comando. Seguem dois exemplos. chmod g+rwx teste chmod go+rwx teste As permissões de diretórios são definidas da mesma maneira. Porém, para um diretório basta retirar a permissão de execução para torná-lo inacessível. Ao atribuir ou retirar permissões de um diretório, os subdiretórios herdarão estas permissões. Exemplo: chmod g-x diretorio Alterando Proprietário Para alterar o proprietário de um arquivo ou diretório utilizamos o comando chown. Este comando deve ser executado com poderes de superusuário, portanto deve ser precedido por sudo. O comando abaixo muda o proprietário do arquivo teste.txt para o usuário fabricio: sudo chown fabricio teste.txt O grupo a que um arquivo ou diretório está associado pode ser alterado utilizando o comando chgrp. O exemplo abaixo altera o grupo do arquivo teste.txt para admin. sudo chgrp admin teste.txt O proprietário e grupo de um arquivo podem ser alterados com um único comando, basta utilizar o comando chown especificando o proprietário e o grupo da seguinte forma: proprietário:grupo. O exemplo abaixo ilustra a mudança do proprietário do arquivo teste.txt para fabricio e o grupo para admin. sudo chown fabricio:admin teste.txt Manipulando Arquivos Compactados Há vários formatos de arquivos compactados. A compactação é um processo importante para backups e transporte de arquivos, pois permite que vários arquivos sejam incluídos em um único arquivo de tamanho reduzido. Nesta seção serão tratados os formatos mais utilizados: zip e tar. Arquivos Zip Caso se queira compactar um arquivo chamado documento.odt no formato zip, pode-se usar o comando: zip documento.zip documento.odt Este comando criará um arquivo compactado chamado documento.zip, que terá em seu conteúdo o arquivo documento.odt. Evidentemente não é obrigatório criar um arquivo compactado com o mesmo nome do arquivo original (com exceção da extensão), mas este procedimento provê melhor organização, uma vez que permite a fácil identificação do conteúdo do arquivo compactado. Também não é obrigatório o uso da extensão .zip, porém o seu uso permite identificar que se trata de um arquivo compactado do tipo zip. Caso seja necessário compactar mais de um arquivo, pode-se fornecer vários nomes na linha de comando: zip documento.zip documento.odt documento1.odt planilha.ods arquivo.txt Comumente, a compactação não envolve apenas um ou poucos arquivos, mas diretórios com seus arquivos e subdiretórios. Para compactar um diretório de forma recursiva, ou seja, incluindo seus subdiretórios, utiliza-se a opção -r: zip -r documentos.zip ~/Documentos Este comando compactará todo o conteúdo do diretório Documentos da pasta pessoal do usuário para o arquivo documentos.zip. Para descompactar um arquivo, utiliza-se o comando unzip. unzip documentos.zip Este comando extrairá todos os arquivos contidos em documentos.zip para o diretório corrente. Porém, é possível escolher o diretório para o qual os arquivos serão extraídos com a opção -d. unzip documentos.zip -d /tmp Neste exemplo, os arquivos serão extraídos para o diretório/tmp. É possível também extrair arquivos específicos, ao invés de todo o conteúdo do arquivo compactado. Suponha, por exemplo, que dentro de documentos.zip haja um arquivo chamado documento1.odt. Para extrair apenas este arquivo, utiliza-se o comando: unzip documentos.zip documento1.odt Caso se queira apenas listar o conteúdo de um arquivo compactado, pode- se utilizar a opção -l. unzip -l documentos.zip Arquivos Tar Para se criar um arquivo tar chamado backup.tar contendo o arquivo documento.odt, utiliza-se o comando tar com a sintaxe abaixo: tar -cf backup.tar documento.txt A opção c indica ao tar que um novo arquivo deve ser criado e a opção f indica que o nome do arquivo será fornecido a seguir. Ao contrário do zip, o comando tar não comprime automaticamente o conteúdo do arquivo compactado. Para que isso ocorra, é necessário utilizar a opção -j para a compressão bzip2. tar -cjvf backup.tar.bz2 documento.txt A opção -v faz com que o tar mostre o que está ocorrendo durante o processo de compactação. Para extrair o conteúdo de um arquivo tar basta substituir a opção -c por - x. tar -xvf backup.tar Caso o arquivo tenha sido compactado com a opção -j, ou seja, tenha utilizado compactação bzip2, deve-se usar esta opção novamente. tar -xjvf backup.tar.bz2 Para extrair um único arquivo, basta especificá-lo na linha de comando. tar -xjvf backup.tar.bz2 documento.txt Assim cono nos arquivos zip, é possível apenas listar o conteúdo de um arquivo compactado, conforme o exemplo: tar -tf backup.tar Caso o arquivo compactado seja do tipo bzip2, a opção -j deve ser acrescida. tar -tjf backup.tar Programação Shell Através de programação Shell, administradores de sistemas operacionais Linux podem criar pequenos programas para automatizar a administração do sistema. Estes programas são basicamente arquivos de texto (também chamados de scripts) contendo comandos do UNIX e comandos especiais do shell que permitem: ● Definir e utilizar variáveis de sistema; ● Realizar testes no sistema; ● Instalar, desinstalar e configurar softwares; ● Realizar atualizações; ● Entender o funcionamento da sequência de boot do Linux. Estes scripts são interpretados pelo shell, não havendo necessidade de compilá-los. Embora sejam programas, os scripts não podem ser visto como aplicações finais criadas pelas diversas linguagens de programação existentes. Além de serem mais lentos que programas feitos nestas linguagens, seu escopo se limita a sequências de instruções do sistema operacional, não dispondo de recursos mais como interface gráfica, bibliotecas avançadas, manipulação de bancos de dados, etc. Os scripts apresentados nas próximas seções introduzirão a sintaxe básica dos principais comando, não pretendendo ser um texto introdutório à lógica de programação, nem aprofundado a ponto de criar scripts tão complexos quantos os existentes na inicialização e configuração do Linux. Os comandos de script apresentados a seguir são baseados no shell /bin/bash do Linux. Começando com o famoso “Olá mundo!” O programa “Olá mundo!” é tradicional na maioria dos textos introdutórios de linguagens de programação. O script abaixo imprimirá a mensagem “Olá mundo!” no prompt. Este script pode ser digitado no GNU/nano ou em outros editores. #!/bin/bash #script “Olá mundo!” echo “Olá mundo!” A primeira linha indica o shell utilizado para interpretar o script. A segunda linha trata-se de um comentário que descreve a função do script (um comentário sempre começa com o caractere #). A terceira linha utiliza o comando echo imprime uma mensagem na tela. Por questões de organização, é recomendável que o arquivo do script tenha extensão .sh, para ser facilmente identificado como um script. Antes de executá-lo, é necessário acrescentar permissão de execução, conforme o comando abaixo. chmod ugo+x olamundo.sh Para executar o script, basta digitar: ./olamundo.sh Utilizando variáveis do shell Há diversas variáveis pré-definidas no shell. O comando printenv traz uma lista completa destas variáveis. A seguir são citadas algumas destas variáveis e seu conteúdo: ● SHELL: armazena o shell padrão utilizado na distribuição do Linux; ● USER e LOGNAME: nome do usuário logado; ● PATH: caminhos padrões para execução de comandos; ● HOME: caminho absoluto da pasta pessoal do usuário logado; ● HOSTNAME: nome do computador; O script a seguir imprime uma mensagem de boas vindas ao usuário, juntamente com algumas informações sobre seu computador e pasta pessoal. #!/bin/bash #Script de boas vindas clear echo "Olá $LOGNAME. Você está usando o computador $HOSTNAME." echo "Seus arquivos pessoais estão em $HOME." echo "Tenha um ótimo dia de trabalho!" O comando clear, na terceira linha, limpa a tela. Para acessar o conteúdo das variáveis, deve-se utilizar o símbolo $ antes de seu nome. Na quarta e quinta linhas, $USER, $HOSTNAME e $HOME, serão substituídos por valores pré-definidos pelo shell. O resultado deste script será a mensagem: Olá fabricio. Você está usando o computador fabricio-note. Seus arquivos pessoais estão em /home/fabricio. Tenha um ótimo dia de trabalho! Criando variáveis Além das variáveis pré-definidas, pode-se criar variáveis com qualquer nome e conteúdo em um script. Para criar uma variável, basta atribuir-lhe um valor, não sendo necessário especificar o tipo das mesmas. Assim como nas variáveis pré-definidas, é necessário o uso do símbolo $ antes do nome da variável para acessar seu conteúdo. O script a seguir solicita que o usuário digite seu nome. O comando read captura o conteúdo digitado pelo usuário e o armazena em uma variável chamada nome. Na linha seguinte, uma mensagem é impressa junto com o conteúdo desta variável. #!/bin/bash #Este script solicita o nome do usuário e o imprime em seguida. echo "Digite seu nome:" read nome echo "Bom dia, $nome" Utilizando parâmetros Assim como comandos do Linux, os scripts podem receber parâmetros. Para acessar os argumentos é necessário utilizar o símbolo $ seguido de um número ou símbolo: ● $#: retorna o número de parâmetros passados; ● $*: retorna todos os parâmetros passados; ● $0: retorna o nome do script que está sendo executado; ● $1 a $9: retorna respectivamente os argumentos de 1 a 9. O script a seguir exibe o nome do arquivo e o número de parâmetros passados. #!/bin/bash #Imprime o nome do arquivo do script e o número de parâmetros passados echo "Ola, eu sou o scritp $0 e você me passou $# parâmetros" Este script foi salvo com o nome parametros.sh. Suponha que sejam passados os parâmetros: ./parametros.sh parametro1 parametro2 O script imprimirá na tela: Ola, eu sou o script ./parametros.sh e você me passou 2 parâmetros Estruturas condicionais Estruturas condicionais são essenciais na maioria dos programas, uma vez que permitem tomadas de decisão ao longo do código, alterando sua sequência de execução. A seguir são apresentadas estruturas condicionais utilizando o if: if CONDIÇÃO then COMANDOS fi if CONDIÇÃO then COMANDOS else COMANDOS fi O próximo script ilustra uma aplicação de estruturas condicionais: #!/bin/bash #Este script renomeia dois arquivos if [ $# -ne 2 ] then echo "Por favor, digite dois parâmetros" else mv $1 $2 fi Na terceira linha deste script é verificado se foi passada uma quantidade de parâmetros diferente de 2. -ne é um operadorpara testes numéricos, sendo que ne são as iniciais de Not Equal, em português, não igual (os operadores para testes numéricos são apresentados na Tabela 1). Caso este teste seja positivo, uma mensagem é impressa. Caso contrário, o comando mv move o arquivo ou diretório especificado pelo primeiro parâmetro para o nome especificado pelo seguindo parâmetro. Tabela 1: Operadores para testes numéricos Operadores Significado -eq É igual -ne Não é igual -gt É maior que -lt É menor que -ge É maior ou igual -le É menor ou igual Estruturas de repetição Assim como as estruturas condicionais, as estruturas de repetição são imprescindíveis na maioria dos programas, pois permitem a execução de determinadas porções de código repetidas vezes. Nesta seção serão apresentadas as estruturas while e for, cujas estruturas são exibidas a seguir: while CONDIÇÃO do COMANDOS done for CONDIÇÃO do COMANDOS done A diferença entre a repetição utilizando while e for consiste no fato de no primeiro caso a repetição ocorrer enquanto uma condição estiver sendo satisfeita e, no segundo caso, a repetição ocorre uma quantidade de vezes pré- determinada. O script abaixo é uma brincadeira com o usuário que ilustra uma exemplo utilizando while. #!/bin/bash #Script com repeticao while echo "Este computador se autodestruirá em 5 segundos" c=5 while [ $c -gt 0 ] do sleep 1 echo "$c" (( c-- )) done echo "kabum :)" Na terceira linha uma mensagem de autodestruição é dada. Na linha seguinte, uma variável numérica é criada com o valor 5. Na quinta linha é realizado um teste que definirá que a repetição acontecerá enquanto a variável c for maior que 0. Na sétima linha o script é paralisado brevemente com o comando sleep. Nas linhas seguintes a variável c é impressa e decrementada. Na última linha uma onomatopeia é impressa. Mas fique tranquilo, nenhum dano é causado ao computador. O próximo script trata-se de um exemplo de estrutura de repetição com for. #!/bin/bash #Este script apenas cria diretórios echo "Quantos diretórios vc quer criar?" read diretorios for ((i=1; i<=$diretorios; i++)) do echo "criando diretorio$i" mkdir "diretorio$i" done Na quarta linha deste script, o comando read permite que seja digitado um valor que será atribuído à variável diretórios. Na quinta linha, o comando for inicializa uma variável i com valor 1. A cada iteração esta variável é incrementada em uma unidade até que ultrapasse o valor da variável diretórios. Os comandos dentro desta estrutura (uma mensagem e a criação de diretórios) são repetidos a cada iteração. Neste script, os diretórios serão criados com os nomes diretorio1, diretório2, e assim suscetivamente. Para apagar estes diretórios, pode-se utilizar o script abaixo: #!/bin/bash #Este script apenas apaga diretórios echo "Quantos diretórios vc quer apagar?" read diretorios for ((i=1; i<=$diretorios; i++)) do echo "Apagando diretorio$i" rmdir "diretorio$i" done Gerenciamento de Processos Processos são programas em execução. O gerenciamento de processos é útil especialmente em casos em que um programa apresenta alguma anomalia em seu funcionamento comprometendo a operação do sistema operacional e outros aplicativos. Em outras palavras, quando um programa “trava”, há opções no Linux para finalizar este programa sem recorrer à reinicialização do computador ou outros métodos pouco práticos. Em situações como esta, pode-se abrir terminais virtuais utilizando as teclas Ctrl+Alt+F1, Ctrl+Alt+F2, Ctrl+Alt+F3, Ctrl+Alt+F4, Ctrl+Alt+F5, Ctrl+Alt+F6. Para voltar à interface gráfica basta teclar Ctrl+Alt+F7. Uma vez em uma sessão de linha de comando, para se visualizar uma lista constantemente atualizada de processos, basta utilizar o comando top. Será aberta uma lista de processos com diversas informações. Dentre as informações apresentadas por este programa, destaca-se: ● Tarefas: Número de processos em execução e seus estados; ● KiB Mem: uso de memória pelos processos; ● KiB Swap: uso de memória swap pelos processos; ● PID: Número identificador do processo; ● USER: usuário que inicializou o processo. Este usuário é o proprietário do processo. Um processo só pode ser finalizado por seu proprietário. A exceção é usuário root, que pode finalizar qualquer processo; ● S: Estado do processo. Os estados mais comuns de processos são: ● R (running): processo em execução; ● S (sleep): processo em espera ; ● s: trata-se de um processo (processo pai) com vários subprocessos atrelados a ele (processos filhos); ● D: processo em espera aguardando uma operação de Entrada/Saída de algum dispositivo ; ● T (trace): processo encontra-se parado sendo analisado por alguma rotina ; ● Z (zombie): processo terminou mas continua alocado na memória consumindo recursos do sistema; ● “<”: processo rodando em alta prioridade; ● N: processo rodando em baixa prioridade; ● “+”: processo rodando em primeiro plano, ou seja, sua execução pode ser visualizada em um terminal; ● l: processo está sendo processado em mais de um núcleo do processador ou por vários processadores. ● %CPU: Porcentagem da capacidade do processador utilizada pelo processo; ● %MEM: Porcentagem de memória principal utilizada pelo processo; ● TIME+: Tempo total de execução do processo; ● Command: comando que inicializou o processo. A tela gerada pelo comando top contém um prompt logo acima da lista de processos. Desta forma é possível realizar algumas operações. Para verificar as operações disponíveis, basta teclar h e será apresentada uma tela de ajuda. Para finalizar um processo, basta teclar k e fornecer um PID. Para terminar um processo, o comando kill é ativado (este comando será tratado mais a frente nesta seção). Este comando envia um sinal ao processo. O sinal 15 é o padrão para finalizado de um processo. Entretanto, para forçar o fim de um processo pode-se usar o sinal 9. Para sair da tela de processos gerada por este comando, basta teclar q. Os processos podem também ser visualizados com o comando ps, que exibe praticamente as mesmas informações do comando top, embora as apresente de forma estática. Dentre as várias opções deste comando, as opções a, u e x tornam bastante prática a visualização da lista completa de processos com seus respectivos nomes: ps -aux Como este comando retorna uma lista de processos muitas vezes extensa, pode-se utilizar o comando grep para buscar um programa específico. Por exemplo, caso se queira visualizar informações sobre o processo referente ao navegador Chromium, o comando ps pode ser utilizado da seguinte forma: ps -aux | grep chromium Para matar este processo, e consequentemente encerrar o programa, utiliza-se o comando kill. O exemplo abaixo encerra o processo de PID 3268. kill 3268 Caso um programa não esteja respondendo e não se encerre com o comando acima, pode-se forçar sua finalização utilizando como opção o sinal -9. kill -9 3268 Em algumas situações, pode ser preferível reiniciar o processo ao invés de finalizá-lo. Isto pode ser feito com o sinal -1. kill -1 3268 A relação de sinais disponíveis para o comando kill pode ser visualizada utilizando a opção -l. É possível encerrar um processo sem conhecer seu PID. Para isso deve-se usar o comando killall seguido do nome do programa que se quer finalizar a execução. Por exemplo, para encerrar o Nautilus, basta digitar: killall nautilus Este comando encerrará todos os processos que tiverem o nome nautilus em sua coluna de comandos (última coluna apresentada nos comandos top e ps). Caso o processo que se deseja finalizarseja de propriedade de outro usuário, é necessário usar o comando sudo. sudo kill 3268 Na seção Linha de Comando vimos que as teclas Ctrl+Z enviam um programa para o segundo plano. Isto é útil quanto necessitamos de continuar utilizando o terminal enquanto um processo é executado. Os processos em segundo plano podem ser visualizados pelo comando jobs. O exemplo a seguir mostra informações do comando updatedb sendo executado em segundo plano. [1]+ Parado sudo updatedb Estes processos recebem uma numeração sequencial diferente de seu PID. Neste exemplo, o processo está parado. Para reiniciar um processo em segundo plano, utiliza-se o comando bg juntamente com o número sequencial do processo. bg 1 Para reiniciar um processo e trazê-lo para primeiro plano, utiliza-se o comando fg. fg 1 Caso o usuário queira que um comando continue a ser executado mesmo que seja feito logout do sistema, pode-se utilizar o comando nohup. nohup updatedb & O símbolo & faz com que o comando seja executado em segundo plano. Em algumas situações pode ser necessário saber quais processos estão utilizando algum recurso específico (um arquivo ou diretório, por exemplo). No primeiro caso utiliza-se o comando fuser. O comando fuser recebe como argumento algum recurso. Exemplo: fuser /etc/passwd O resultado deste comando é: /etc/passwd: 2237 3463 Os processos 2237 e 3463 estão utilizando o arquivo /etc/passwd. Para obter maiores informações sobre estes processos basta usar o comando ps. Exemplo: ps 2237 O comando fuser possui algumas opções importantes: ● -k: mata os processos que estejam acessando o recurso especificado; ● -m: permite especificar um ponto de montagem ou um dispositivo montado; ● -u: exibe o nome do usuário que está executando cada processo exibido; ● -v: mostra os resultados de forma mais organizada. Exemplo: fuser -muv /dev/sda6 O resultado parcial deste comando é exibido a seguir: A coluna ACESSO exibe como o processo está acessando o recurso. Esta coluna pode ter os seguintes valores: ● c: diretório atual; ● e: arquivo em execução; ● r: diretório raiz; ● m: arquivo em memória; ● f: arquivo aberto para leitura; ● F: arquivo aberto para escrita. Estes valores podem ser melhores visualizados executando o comando sobre a raiz ou sobre a pasta pessoal do usuário. Gerenciamento de Pacotes No Linux, é possível realizar um eficiente gerenciamento de pacotes por meio de ferramentas específicas. Nesta seção serão apresentados os gerenciadores de pacotes: APT e DPKG. Ambos os comandos, para instalação ou remoção de pacotes, devem ser executados com privilégios de superusuário. Portanto, os exemplos desta seção supõem que o usuário esteja logado como root ou utilize o comando sudo. DPKG O DPKG (Debian Package) é um gerenciador de pacotes próprio do Debian, como o próprio nome já diz. O Ubuntu também possui este gerenciador, uma vez que é baseado na distribuição Debian. O DPKG manipula pacotes .deb. As opções mais comuns do comando dpkg são: ● -i: instala um pacote .deb. Exemplo: dpkg -i tree_1.5.3-2_i386.deb; ● -r: desinstala um pacote sem apagar seus arquivos de configuração. Exemplo: dpkg -r tree_1.5.3-2_i386.deb; ● -P: desinstala um pacote e apaga seus arquivos de configuração. Exemplo: dpkg -P tree_1.5.3-2_i386.deb; APT O APT (Advanced Package Tool) é uma ferramenta originária da distribuição Debian, e assim como o DPKG, está presente no Ubuntu. É o sistema de gerenciamento de pacotes mais utilizado entre as distribuições Linux (Mota, 2013) . Os pacotes gerenciados pelo APT possuem extensão .deb. Estes pacotes são baixados de repositórios na internet distribuídos em vários países e automaticamente instalados pelo comando DPKG. Os softwares disponíveis para instalação pelo APT são mantidos em um banco de dados local, que é frequentemente atualizado por servidores remotos. Os pacotes também podem ser encontrados em CD-ROM, DVD e rede local, embora a fonte mais utilizada seja a internet. O arquivo /etc/apt/sources.list exibe os repositórios locais e remotos disponíveis. Para inserir ou remover um repositório, deve-se editar este arquivo. Os repositórios remotos são listados conforme o exemplo: deb http://br.archive.ubuntu.com/ubuntu/ precise main restricted deb-src http://br.archive.ubuntu.com/ubuntu/ precise main restricted A primeira informação é o tipo de repositório. Pode ser deb ou deb-src. deb refere-se aos pacotes binários, ou seja, os programas pré-compilados. deb-src refere-se aos códigos fonte. A segunda informação é o repositório propriamente dito. A lista completa está disponível em http://www.debian.org/mirror/list. A seguir é informado a versão da distribuição. Neste exemplo a versão é precise, porém outros costumam ser utilizados: lucid, stable, testing, sid, experimental, e outros. A penúltima informação refere-se à seção do repositório, neste caso main restricted indica que o pacote faz parte da distribuição oficial do Ubuntu. O APT envolve vários comandos. Os mais utilizados são: ● apt-get update: atualiza lista de pacotes disponíveis nos repositórios na internet; ● apt-cache: pesquisa de pacotes baixados pelo comando apt-get update; ● apt-get install pacote: instala o pacote solicitado. Caso o pacote já esteja instalado, faz sua atualização. É possível solicitar a instalação de vários pacotes num único comando; ● apt-get upgrade: atualiza o sistema sem instalar ou remover pacotes; ● apt-get dist-upgrade: faz a atualização completa do sistema, instalando novos pacotes e removendo pacotes que estejam em conflito com o sistema atualizado; ● apt-get source pacote: faz download do código-fonte de um pacote; ● apt-get clean: apaga os arquivos baixados pelo APT. Estes arquivos ficam armazenados em /var/cache/apt/archives; ● apt-get remove pacote: desinstala pacote mantendo os arquivos de configuração. Caso o pacote seja uma dependência de outros, o APT também irá desinstalá-los; ● apt-get purge pacote: desinstala pacote e remove seus arquivos de configuração, com exceção dos arquivos de configuração dos usuários em /home. Caso o pacote seja uma dependência de outros, o APT também irá desinstalá-los; Há algumas opções que podem ser úteis na utilização dos comandos APT: ● -d: faz apenas o download dos pacotes, sem instalá-los; ● -y: automaticamente responde “sim” à pergunta “Você quer continuar? [S/n]”; ● -f: opção útil na instalação de pacotes quando há problemas com dependência. Só pode ser utilizada com o comando: apt-get install. Há também algumas opções específicas para o comando apt-cache: ● pkgnames: mostra pacotes disponíveis; ● search: procura por pacotes a partir de uma expressão. Exemplo: apt- cache search firefox. Neste exemplo serão pesquisados pacotes que contenham a expressão firefox em sua descrição resumida ou detalhada; ● show: mostra dados de um pacote. Exemplo: apt-cache show firefox; ● depends: mostra dependências de um pacote. Exemplo: apt-cache depends firefox; ● stats: exibe estatísticas do banco de dados de pacotes; Gerência de Hardware Para visualizar todos os componentes de hardware de um computador, temos o comando lshw. A lista de hardwares e seus respectivos detalhes é bastante extensa. Porém, é possível facilitar a visualização a partir de algumas opções: ● -html: apresenta a listagem em html. Utilizando o símbolo “>” é possível criar um arquivo html para a visualização em um browser (exemplo: lshw -html> listagem.html); ● -xml: apresenta o resultado em xml; ● -short: mostra lista de dispositivos sem apresentar detalhes dos mesmos; O comando report-hw também é útil para visualizar os dispositivos de hardware disponíveis. Apesar de gerar um relatório completo, este comando não possui opções de visualização. Para visualizar especificamente dispositivos PCI e AGP em uma máquina, utiliza-se o comando lspci. Este comando não possui argumentos, entretanto há algumas opções que merecem destaque: ● -k: exibe os drivers e módulos de kernel dos dispositivos; ● -v: fornece detalhes de cada dispositivo; ● -vv: aumenta nível de detalhes fornecidos de cada dispositivo; Os dispositivos USB podem ser visualizados pelo comando lsusb. Este comando também não possui argumentos. A seguir são apresentadas algumas opções deste comando: ● -v: fornece detalhes de cada dispositivo; ● -s: permite visualizar informações de um único dispositivo, devendo ser incluído na linha de comando o barramento e o número do dispositivo. Algumas informações de hardware estão disponíveis em arquivos no diretório /proc. Para visualizar estes arquivos, pode-se utilizar o comando less. A seguir são descritos os arquivos relacionados aos dispositivos de hardware. ● /proc/interrupts: exibe todas as IRQs (Interrupt ReQuest – requisição de interrupção) utilizadas pelo sistema. IRQs são utilizadas pelos periféricos para notificar o processador sobre uma necessidade de comunicação. Cada dispositivo possui uma IRQ; ● /proc/dma: exibe todos os canais de DMA (Direct Memory Access) utilizados pelo sistema; ● /proc/ioports: exibe a área de endereços de I/O (Input/Output – Entrada/Saída). Endereços de I/O são posições de memória RAM utilizada para troca de dados entre o processador e dispositivos de hardware; ● /proc/cpuinfo: exibe informações do processador (marca, modelo, clock, tamanho de cache, etc); ● /proc/swaps: exibe informações sobre o sistema de swap. Gerência de Rede Neste capitulo serão apresentados comandos relacionados a interfaces de rede no Linux. Não serão tratados aspectos teóricos de arquitetura e protocolos de rede. Portanto, espera-se que o leitor já possua conhecimentos básicos do protocolo TCP/IP. Um dos comandos mais conhecidos quando se trata de redes de computadores é o comando ping (Packet INternet Groper). Este comando permite testar a comunicação entre dois computadores, pois através dele pode-se verificar se um determinado pacote está ou não chegando ao seu destino. O comando ping requer como argumento o endereço (IP ou URL) do host de destino. Exemplos: ping 91.189.94.156 ping ubuntu.com A resposta ao último comando será: Para cada pacote enviado há informações como tamanho, destino e tempo de resposta. Ao fim do comando (após interromper sua execução com as teclas Ctrl+C), têm-se, entre as informações, o número de pacotes transmitidos e recebidos, a porcentagem de perda e tempo total. Para verificar as configurações dos adaptadores de rede de um computador, temos o comando ifconfig. Este comando, utilizado sem argumentos, exibe todos os adaptadores de rede do computador. Entretanto, é possível visualizar as configurações de um único adaptador. Exemplo: ifconfig eth0 Este comando exibirá a configuração da placa ethernet eth0. Já o exemplo a seguir exibirá a configuração da placa de rede sem fio wlan0. ifconfig wlan0 O comando ifconfig permite a ativação e desativação de placas de rede através das opções up e down, respectivamente: ifconfig wlan0 down ifconfig wlan0 up A visualização das configurações de rede podem ser feitas por um usuário comum. Porém a modificação, ativação ou desativação devem realizada pelo usuário root. Informações sobre a conexão de dispositivos de rede podem ser obtidas com o comando ethtool. Este comando permite visualizar diversas informações sobre o link: tecnologia de rede suportada, velocidade do link, conexão detectada, e outras informações. O uso do comando ethtool é semelhante ao comando ifconfig: ethtool eth0 Destaca-se as seguintes opções deste comando: ● -i: exibe o driver do dispositivo; ● -S: exibe estatísiticas deste dispositivo; Uma vez que os adaptadores de rede estejam configurados e funcionando, pode-se verificar a tabela de roteamento estático de rede através do comando route. As colunas apresentadas por este comando são: ● Destino: endereço da rede ou máquina de destino; ● Roteador: endereço do roteador; ● Mascara Genérica: máscara da a rede destino; ● Opções: são apresentados flags de rede: ● U (rota esta Up); ● H (alvo é uma máquina); ● G (use roteador); ● R (reinstale rota para roteamento dinâmico); ● D (Instalada dinamicamente por um daemon ou por redirecionamento); ● M (Modificada por daemon de roteamento ou redirecionamento); ● ! (Rota rejeitada ). ● Metrica: A 'distância' até o alvo (geralmente contada em hops); ● Ref: Número de referências a esta rota. Não usado no kernel do Linux. Seu valor é sempre 0; ● Uso: contagem de procuras por esta rota; ● Iface: interface através da qual os pacotes IP serão enviados; Com o comando route é possível inserir ou remover rotas através das opções add e del, respectivamente. Exemplo: route add -net 192.56.76.0 netmask 255.255.255.0 eth0 Este exemplo adiciona uma rota para a rede 192.56.76.0 através da interface "eth0". O exemplo seguinte remove esta rede. route del -net 192.56.76.0 netmask 255.255.255.0 eth0 O comando netstat mostra não só a tabela de roteamento, conforme o comando route, mas também permite verificar conexões de rede, portas TCP e UDP abertas, estatísticas de interface e outras informações. A principais opções de netstat são: ● -a: mostra as conexões ativas e as portas abertas; ● -l: mostra somente as portas referentes aos serviços que estejam ativos na máquina; ● -p: mostra os processos que estão utilizando as portas ativas; ● -r: exibe a tabela de roteamento; ● -s: exibe estatísticas de rede; ● -t: mostra somente conexões TCP; ● -u: mostra somente conexões UDP; O comando whois mostra dados sobre domínios e blocos IP na internet. Esta informações são importantes em pesquisas sobre redes ou instituições na internet. Este comando requer como argumento um endereço de destino. Exemplos: whois ubuntu-br.org whois 91.189.94.226 Para obter apenas a localização de um endereço IP ou de uma URL, pode- se utilizar o comando geoiplookup. Assim como no comando whois, é necessário fornecer um endereço. geoiplookup ubuntu-br.org geoiplookup 91.189.94.226 Os comandos iptraf e ethstatus permitem monitorar o tráfego de rede nos adaptadores de rede ativos. Ambos apresentam interfaces gráficas simples (exibidas nas figuras a seguir), mas apenas o comando iptraf possui um ambiente interativo. A figura a seguir apresenta uma das telas do iptraf. A figura abaixo apresenta a tela do comando ethsatus. O comando wget é utilizado para fazer download de arquivos e diretórios em modo texto, utilizando os protocolos HTTP ou FTP. No exemplo abaixo, o comando wget é utilizado para fazer o download de uma imagem da versão 13.10 da distribuição Ubuntu. wget http://releases.ubuntu.com/saucy/ubuntu-13.10-desktop- amd64.iso Referências Bibliográficas MOELLER, Jonathan. The Ubuntu Beginner's Guide. Reno: LLC/Amazon, 2012. 6 ed. MOTA, FILHO, João Eriberto. Descobrindo o Linux: entenda o sistema operacional GNU/Linux. São Paulo: Novatec, 2012. 3 ed. THOMAS, Keir. Linux Nitty Gritty: Working at the UuntuCommand-Line Prompt. ???: McFreda/Amazon, 2011. VALLE, Odilson Tadeu. Administração de redes com linux: fundamentos e práticas. Florianópolis: Publicações do IF-SC, 2010. Livros Publicados na Amazon Estaticópolis - Um jeito novo de aprender Estatística Este livro não apresenta um conteúdo de forma linear, nem é recheado de fórmulas, teorias e conceitos. Estaticópolis é uma ficção, e como toda ficção, busca ser divertida e envolvente. Neste livro, o leitor encontrará diversas analogias das estatísticas presentes em seu cotidiano (em noticiários, pesquisas eleitorais, campanhas publicitárias, relações comerciais, etc) e aprenderá a analisá-las em suas entrelinhas. . Um livro útil para estudantes e profissionais de diversas áreas, com ou sem conhecimento prévio de Estatística. Estatística Básica para Processos Produtivos Estatística não é só a arte de fazer os números falarem, mas de fazer os números falarem a verdade. Isso só é possível mediante um rigoroso processo estatístico composto por vários detalhes importantes: escolha e organização de dados, extração de suas medidas, análise de inferências, criação e interpretação dos gráficos. Este livro apresenta uma série de ferramentas estatísticas (técnicas de amostragem, medidas de tendência central e dispersão, gráficos e análise de regressão), com exemplos voltados para produção, porém aplicáveis a qualquer área que exija coleta e organização de dados, apresentação e interpretação de informações. Design de Logomarcas com Inkscape: Aprenda desenhar e analisar logomarcas Este livro busca cobrir uma lacuna deixada pelos livros tradicionais da área, que muitas vezes excedem na linguagem técnica, tornando o aprendizado maçante e difícil. Utilizando uma linguagem que consiste em um diálogo contínuo com o leitor, este livro une o aprendizado de desenho de logomarcas com o uso do Inkscape, Ainda que inclua análises de logomarcas de estúdios e designers consagrados internacionalmente, este livro não é voltado apenas a profissionais da área de logomarcas. As técnicas utilizadas aqui servem para vários tipos de artes gráficas. Este é o primeiro livro de uma série de volumes que incluirão logomarcas de complexidade crescente. Tratando Imagens com GIMP: Aprendizado com Projetos Curtos e Didáticos Assim como o livro sobre Inkscape, este livro também busca cobrir uma lacuna deixada pelos livros tradicionais da área, que muitas vezes se excedem na linguagem técnica, tornando o aprendizado maçante e difícil. Com uma linguagem informal, como se dialogasse com o leitor, este livro apresenta, de forma didática, técnicas úteis para tratar fotos tiradas sob diversas circunstâncias, obtendo muitas vezes efeitos divertidos e/ou inusitados. Este é o primeiro livro de uma série de volumes que incluirão técnicas de tratamento de imagens de complexidade crescente. Introdução aos Testes de Invasão: Técnicas de ataque para melhorar suas defesas Este livro tem como objetivo ser um texto introdutório a interessados em hacking e testes de invasão. A intenção deste livro, ao promover um conteúdo de hacking e testes de invasão, vai ao encontro da necessidade de se conhecer as técnicas de invasão para se adotar medidas de prevenção à invasão. Em outras palavras: para se defender é preciso conhecer as técnicas e ferramentas de ataque, ou seja, segurança ofensiva. O conteúdo deste livro não exige que o leitor tenha experiência anterior em testes de invasão. Porém é importante que o leitor tenha um domínio básico de Linux, preferencialmente da distribuição Ubuntu e conhecimentos de básicos de redes de computadores. Ubuntu em Linha de Comando: Operação e Administração Eficiente do Ubuntu Linux Texto introdutório e didático sobre operação e administração de sistemas Linux através de linha de comando. Apesar de ser um livro introdutório, seu conteúdo pode ser útil para usuários com diferentes níveis de conhecimento no sistema operacional Linux. O olho e outros contos insólitos "O olho e outros contos insólitos" recebeu menção honrosa no XI Livraria Asabeça Prêmio Literário 2012. O livro traz três contos irreais, embora verossímeis, em que o improvável é apresentado com extrema naturalidade. O primeiro conto "O Olho", traz uma narrativa surreal, em que duas pessoas desconhecidas, em partes opostas do planeta, compartilham involuntariamente suas visões, fazendo-as questionar suas sanidades. O segundo conto, "Réplicas", é uma história de suspense. Tudo começa com um sensação de dor no meio da noite. Uma pequena perfuração que não coagula. E estranhas aparições e acontecimentos que fazem uma família questionar a realidade. O terceiro conto, "Maquinários", traz uma história futurista, numa época que o homem existe apenas como fonte de inspiração para formas de vida autômatas em uma Terra desfigurada. Neste cenário, um robô concebido para um fatídico propósito, e com um virtuoso defeito, passa a enfrentar toda a ordem e desordem que o cerca, tentando resgatar o que resta da humanidade. Estações marítimas o retorno ao continente Em um futuro relativamente distante, o planeta Terra estava dividido em duas grandes alianças (a aliança dos países ocidentais e a aliança dos países orientais) quando eclodiu uma grande guerra pelo domínio do planeta. Guerra que durou vários anos e, quando estava prestes a ser vencida, foi utilizada uma arma biológica devastadora pela aliança cuja derrota era iminente. Uma bactéria altamente transmissível que, dentre seus sintomas, ataca o sistema nervoso do homem e o transforma em uma criatura descontrolada e letal. A humanidade foi praticamente banida dos continentes. Os poucos sobreviventes se aglomeraram e se mataram por um espaço nas embarcações de evacuação para estações marítimas. Porém, o que parecia ser a salvação se transformou em um novo pesadelo. Os sobreviventes desta catástrofe, confinados fora de seu habitat natural, passaram a sofrer com as dificuldades de adaptação e escassez de recursos. A extinção do homem era iminente. A última esperança da humanidade seria uma tentativa desesperada de reconquistar os continentes. Foi criada uma força tarefa cuja missão seria retoma-los. Missão esta que escondia vários segredos. Ao chegar em terra firme, uma inconveniente verdade veio à tona. Surgindo aí um novo inimigo, uma intriga militar tão ou mais mortal que a bactéria e as pessoas contaminadas. Gonecity De repente, uma cidade inteira isolada. Seria possível? Algo indestrutível. De origem não conhecida. O planeta inteiro está lá. Para libertá-la. Mas, sob os olhos de todos, a cidade simplesmente some, deixando apenas uma imensa e precisa cratera. Nesta cidade, onde que que ela esteja agora, quatro pessoas unidas pelo acaso partem em busca de um meio de voltar para casa, ou, pelo menos, de respostas. Respostas que desafiarão a lógica, o tempo, a ciência e a suas próprias vidas. Outrora e outros contos insólitos Contos irreais, mas verossímeis. Fatos impossíveis, mas imagináveis. As regras do mundo que conhecemos são questionadas nestes três contos insólitos. O primeiro conto, Outrora, narra um fenômeno natural incompreensível pela ciência atual, mas que afetará para sempre a vida na Terra. Um fenômeno capaz de colocar em cheque a noção de vida ou morte. Capaz de botar em cheque saberes axiomáticos como a lei da gravidade e a lei de Lavoisier. O segundo conto, O Olho, traz uma narrativa surreal, em que duas pessoas desconhecidas, em partes opostas do planeta, compartilham involuntariamente suas visões, fazendo-as questionar suas sanidades. O terceiro conto, Oceano Morto, narra outro fenômeno inexplicável pela ciência. Mas neste conto, a ciência não terá oportunidade de estudá-lo. Repentinamente os oceanos se convertem numa matéria desconhecida, de cor, cheiro e constituição irreconhecíveis. Esta matéria consumiráa Terra aos poucos e levará a humanidade a ações extremas de uma improvável sobrevivência. O quarto conto, "Réplicas", é uma história de suspense. Tudo começa com um sensação de dor no meio da noite. Uma pequena perfuração que não coagula. E estranhas aparições e acontecimentos que fazem uma família questionar a realidade. Transgenia: uma nova espécie está surgindo Um lugar remoto. Esquecido. Condenado por poluentes de indústrias desativadas. Uma pequena população é surpreendida por um submarino de origem desconhecida, trazendo consigo uma tecnologia capaz de alterar o genoma humano. Um conflito global explode naquele pacato local quando forças especiais são enviadas para lidar com a ameaça e se deparam com um garoto com particularidades mentais que o tornam imune à perigosa tecnologia. Teorias conspiratórias, ameaças terroristas, armas biológicas e conflitos militares permeiam esta trama em época e local indefinidos. Sobre o Linux Sobre o Ubuntu Linha de Comando Shell Sessões de Linha de Comando Comandos e argumentos Executando comandos com poderes de root Produtividade em Sessões de Linha de Comando Redirecionamento Canalização Sistema de arquivos Nomenclatura de discos e partições Identificando e manipulando partições Diferenças entre diretórios e arquivos Navegando pelo sistema de arquivos Manipulando arquivos e diretórios Executando Programas Manipulando arquivos de texto Diretórios importantes Montagem e informações de partições Gerência de Usuários Propriedade e Permissões de Arquivos Propriedades de arquivos Permissões de Arquivos Permissões de Diretórios Identificando Permissões e Propriedade Alterando Permissões Alterando Proprietário Manipulando Arquivos Compactados Arquivos Zip Arquivos Tar Programação Shell Começando com o famoso “ Olá mundo ! ” Utilizando variáveis do shell Criando variáveis Utilizando parâmetros Estruturas condicionais Estruturas de repetição Gerenciamento de Processos Gerenciamento de Pacotes DPKG APT Gerência de Hardware Gerência de Rede